UMIhelp

Разработка дополнительного функционала => Custom макросы => Тема начата: sam от 02 Марта 2015, 11:45:33

Название: function onOrderDeleteCleanRelations (/classes/modules/emarket/_events.php)
Отправлено: sam от 02 Марта 2015, 11:45:33
Здравствуйте! Кто может подсказать - почему я, как админ, сделанные мной тестовые заказы могу из админки удалять, а вот заказы сделанные покупателями, а затем отмененные, удалять не могу? В чем проблема (вероятный код, который мешает удалять чужие заказы админом):

		public function onOrderDeleteCleanRelations(iUmiEventPoint $e) {
if($e->getMode() != 'before') return;
$object = $e->getRef('object');
if($object instanceof iUmiObject) {
$type = selector::get('object-type')->id($object->getTypeId());
if($type && $type->getMethod() == 'order') {
$order = order::get($object->id);
$orderItems = $order->getItems();
if (sizeof($orderItems) > 0) {
foreach($orderItems as $item) {
$orderItem = orderItem::get($item->getId());
$orderItem->remove();
}
}
$customerId = $order->getCustomerId();
if (!is_null($customerId)) {
$customer = selector::get('object')->id($customerId);
$method = $customer->getMethod();
if ($customer->getMethod() == 'customer') {
umiObjectsExpiration::getInstance()->add($customerId);
}
}
$customerOneClickId = $order->getValue('purchaser_one_click');
if (!is_null($customerOneClickId)) {
$customerOneClick = selector::get('object')->id($customerOneClickId);
if ($customerOneClick instanceof umiObject && $customerOneClick->getTypeGUID() == 'emarket-purchase-oneclick') {
umiObjectsExpiration::getInstance()->add($customerOneClickId);
}
}
$order->commit();
}
}
}
Название: Re:function onOrderDeleteCleanRelations (/classes/modules/emarket/_events.php)
Отправлено: admin от 22 Марта 2015, 19:34:59
то есть, вы тот самый первый супервайзер, вы в админке пытаетесь удалить заказ, который делал другой пользователь и потом его отменил и заказ не удаляется?

Просто по вашему описанию, кажется, что у вас нет прав работать с объектами, созданные не вами, но такой проблемы не должно быть если вы супервайзер.
Название: Re: function onOrderDeleteCleanRelations (/classes/modules/emarket/_events.php)
Отправлено: sam от 22 Сентября 2016, 10:10:59
Вы всё правильно поняли. Нашёл я одно примитивное решение этой проблемы, но оно, как я уже выразился, примитивное. Будет лучше, если проблема будет решена раз, и на всегда.

В этой директиве /docs/classes/modules/emarket есть файл events.php со следующим содержанием (см. строку с русским комментарием):
	new umiEventListener('cron', 'emarket', 'onCronSyncCurrency');
// Notification listeners
new umiEventListener('systemModifyPropertyValue', 'emarket', 'onModifyProperty');
new umiEventListener('systemModifyObject', 'emarket', 'onModifyObject');
new umiEventListener('order-status-changed', 'emarket', 'onStatusChanged');
new umiEventListener('order-payment-status-changed', 'emarket', 'onPaymentStatusChanged');
new umiEventListener('order-delivery-status-changed', 'emarket', 'onDeliveryStatusChanged');
// Reservation listeners
new umiEventListener('systemModifyPropertyValue', 'emarket', 'onOrderPropChange');

new umiEventListener('systemModifyPropertyValue', 'emarket', 'onStorePropChange');

new umiEventListener('systemDeleteObject', 'emarket', 'onOrderDeleteUnreserve');
new umiEventListener('systemDeleteObject', 'emarket', 'onOrderDeleteCleanRelations'); // мешает удалять заказы из админки, сделанные не супервайзером/админом, в т.ч. и отмененные

new umiEventListener('cron', 'emarket', 'onCronCheckExpiredCustomers');
new umiEventListener('cron', 'emarket', 'onCronCheckExpiredOrders');
new umiEventListener('cron', 'emarket', 'onCronCheckExpiredCustomersOneClick');

Когда мне надо удалять эти неудавшиеся заказы, через ftp я скачиваю этот events.php, временно убираю эту строку new umiEventListener('systemDeleteObject', 'emarket', 'onOrderDeleteCleanRelations'), затем удаляю отмененные заказы, а потом уже восстанавливаю этот файл как и было раньше. Т.е., вся загвоздка именно в этой строке с 'onCronCheckExpiredCustomersOneClick'. Я не знаю, зачем она нужна, и можно ли эту строку вообще удалить и забыть про эту проблему?!........

Буду Вам признателен, если расшифруете мне значение этой строки, опишите её значимость, и подскажите, как я могу решить эту проблему НЕ примитивным, как я придумал, способом!
Название: Re: function onOrderDeleteCleanRelations (/classes/modules/emarket/_events.php)
Отправлено: admin от 30 Сентября 2016, 11:18:20
Эта строчка подключает обработчик, который позволяет обработать связи заказа с другими объектами в базе данных.

Например, при создании заказа у него есть список товаров в корзине. По сути каждый товар, добавленный в корзину, это созданный элемент справочника "Наименования в заказе". Если заказ удален, то товары данного заказа, тоже смело можно удалять, чтобы они не засоряли базу.

Вот при таких очистках что-то и чихает. В самой функции происходит 3 действия:
- удаление товаров в данном заказе
- продлить срок жизни покупателя
- продлить срок жизни покупателя в один клик

Видимо, в последней части что-то и сбоит, так как у вас были какие-то работы с заказом в один клик (если я ничего не путаю)
Название: Re: function onOrderDeleteCleanRelations (/classes/modules/emarket/_events.php)
Отправлено: sam от 03 Октября 2016, 19:49:04
Возможно. А вот вопрос, что именно?! В файл __events.php добавлен "onOrderDeleteCleanRelations" (код в первом сообщении от меня), далее в events.php - "new umiEventListener('systemDeleteObject', 'emarket', 'onOrderDeleteCleanRelations');". Сам заказа в один клик работает без каких либо проблем. Единственная проблема в том, что, как и выше озвучивал, "onOrderDeleteCleanRelations" не даёт админу удалять заказы, сделанные покупателями, а свои тестовые заказы админ/супервайзер может удалять.