Изменение имени объекта Незарегистрированного покупателя

Материал из Umicms
Версия от 07:32, 18 января 2012; VITL' (обсуждение | вклад)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к:навигация, поиск

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