Изменение имени объекта Незарегистрированного покупателя
Материал из Umicms
Как вы все знаете, по умолчанию, когда «Незарегистрированный покупатель» совершает заказ в Интернет-магазине, в конечном итоге этот заказ в модуле Интернет-магазин отображается с именем примерно такого вида: 234.67.89.43, т.е. отображается IP-адрес покупателя. Это поведение системы можно изменить с помощью события 'order-status-changed' в Umi.CMS. Само событие прописано в методе setOrderStatus (order.php):
$event = new umiEventPoint('order-status-changed'); $event->addRef('order', $this); $event->setParam('old-status-id', $oldStatusId); $event->setParam('new-status-id', $newStatusId); ... $event->setMode('after'); $event->call();
Можно сформировать имя заказа из тех полей, которые покупатель заполнил при оформлении заказа, допустим из полей Фамилия или Имя. Для выполнения поставленной задачи, в папке classes/modules/emarket/ создадим файл custom_events.php, с таким содержанием:
<?php new umiEventListener('order-status-changed', 'emarket', 'onSetNameOrder'); ?>
потом в этой же папке, в файл __custom.php добавим метод:
public function onSetNameOrder(iUmiEventPoint $event) { if($event->getMode() == "after" && $event->getParam("old-status-id") != $event->getParam("new-status-id")) { $order = $event->getRef("order"); $statusId = $order->getValue("status_id"); $codeName = order::getCodeByStatus($statusId); if($codeName != 'waiting' || permissionsCollection::getInstance()->isAuth()) return false; $customer_id = $order->customer_id; $objects = umiObjectsCollection::getInstance(); $object_customer = $objects->getObject($customer_id); // У объекта "Незарегистрированный покупатель" берем значение поля fname $name = $object_customer->getValue('fname'); // Меняем имя объекта "Незарегистрированный покупатель" на значение переменной $name $object_customer->setName($name); $object_customer->commit(); } }
и также в папке classes/modules/emarket/ создадим файл permissions.custom.php с таким содержанием:
<?php $permissions = array('purchasing' => array('onSetNameOrder')); ?>
В итоге, при просмотре списка заказов, имена заказов будут равны Имени покупателя.
Из-за некоторых особенностей хранения данных, при табличном отображении списка заказов, не просмотреть Адрес доставки. Чтобы решить этот вопрос, можно модифицировать метод onSetNameOrder() таким образом:
public function onSetNameOrder(iUmiEventPoint $event) { if($event->getMode() == "after" && $event->getParam("old-status-id") != $event->getParam("new-status-id")) { $order = $event->getRef("order"); $adres_id = $order->getValue("delivery_address"); $objects = umiObjectsCollection::getInstance(); $object_address = $objects->getObject($adres_id); $city = $object_address->city; $street = $object_address->street; $house = $object_address->house; $str = $street . " " . $house . " " . $flat; $order->setValue('adres', $str); } }
где city, street и house это идентификаторы полей в типе данных "Адрес доставки", который можно найти в модуле "Шаблоны данных", первая вкладка, раздел "Справочники". А 'adres' - это строковый идентификатор нового поля, которое было добавлено в тип данных "Заказ", в группу "Свойства доставки заказа". Модифицированный метод выполняют функцию слияния значений полей из "Адреса доставки" и потом записывает итоговое значение в дополнительное поле, которое можно будет выбрать при табличном отображении заказов.
