Изменение имени объекта Незарегистрированного покупателя
Как вы все знаете, по умолчанию, когда «Незарегистрированный покупатель» совершает заказ в Интернет-магазине, в конечном итоге этот заказ в модуле Интернет-магазин отображается с именем примерно такого вида: 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' - это строковый идентификатор нового поля, которое было добавлено в тип данных "Заказ", в группу "Свойства доставки заказа". Модифицированный метод выполняют функцию слияния значений полей из "Адреса доставки" и потом записывает итоговое значение в дополнительное поле, которое можно будет выбрать при табличном отображении заказов.