Как фильтровать заказы по фио покупателя — различия между версиями
Mad grant (обсуждение | вклад) |
Mad grant (обсуждение | вклад) |
||
| Строка 16: | Строка 16: | ||
Сначала создадим эти поля, для этого нужно перейти в модуль "Шаблоны Данных", найти тип данных "Заказ", открыть его на | Сначала создадим эти поля, для этого нужно перейти в модуль "Шаблоны Данных", найти тип данных "Заказ", открыть его на | ||
| − | редактирование и создать в блоке "Свойства заказа" создать следующие поля | + | редактирование и создать в блоке "Свойства заказа" создать следующие поля, см. "Полезные ссылки". |
[[Файл:New_field.png]] | [[Файл:New_field.png]] | ||
| − | ''' | + | '''Обязательно проставьте полям те же идентификаторы, что на скриншоте, и укажите параметр "Фильтруемое"''' |
| + | |||
| + | Теперь у заказа появились нужные поля и их можно добавить в фильтрацию в модуле "Интернет-магазин". | ||
| + | Дело осталось за малым - нужно их как-то заполнять нужными значениями, в этом нам поможет событийная модель UMI.CMS, см. "Полезные ссылки". | ||
| + | |||
| + | Нам подойдет стандартная точка вызова "order-status-changed", см. "Полезные ссылки". | ||
| + | |||
| + | Создадим кастомный обработчик для события order-status-changed, для этого в директории /classes/modules/emarket/ создадим файл custom_events.php | ||
| + | следующего содержания: | ||
| + | |||
| + | <source lang="php"> | ||
| + | new umiEventListener('order-status-changed', 'emarket', 'getCustomerInformation'); | ||
| + | </source> | ||
| + | Где order-status-changed - имя события, getCustomerInformation - метод, который будет вызываться при срабатывании этого события. | ||
| + | |||
| + | Теперь опишем этот метод getCustomerInformation, для этого, в файле /classes/modules/emarket/__custom.php после слов | ||
| + | "//TODO: Write here your own macroses" вставим следующий код: | ||
| + | |||
| + | <source lang="php"> | ||
| + | public function getCustomerInformation(iUmiEventPoint $event){ | ||
| + | //получаем режим работы обработчика | ||
| + | $mode = $event->getMode(); | ||
| + | |||
| + | //если режим 'после' | ||
| + | if ($mode == 'after'){ | ||
| + | |||
| + | //получаем ссылку на значение из контекста вызова события (в нашем случае это объект заказа) | ||
| + | $order = $event->getRef('order'); | ||
| + | $umiObjectCollection = umiObjectsCollection::getInstance(); | ||
| + | //получаем id покупателя из объекта заказ | ||
| + | $customerId = $order->getValue('customer_id'); | ||
| + | $customer = $umiObjectCollection->getObject($customerId); | ||
| + | //присваиваем нашим переменным имя, фамилию и отчество из объекта покупатель | ||
| + | $customerFirstName = $customer->getValue('fname'); | ||
| + | $customerLastName = $customer->getValue('lname'); | ||
| + | $customerFatherName = $customer->getValue('father_name'); | ||
| + | //присваиваем переменной customerFio строку, содержащую имя, фамилию и отчество | ||
| + | $customerFio = "$customerLastName $customerFirstName $customerFatherName"; | ||
| + | //устанавливаем для объекта заказ значение полей (которые мы добавляли в типе данных) | ||
| + | //из объявленных в кастоме переменных | ||
| + | $order->setValue('fname', $customerFirstName); | ||
| + | $order->setValue('lname', $customerLastName); | ||
| + | $order->setValue('father_name', $customerFatherName); | ||
| + | $order->setValue('fio', $customerFio); | ||
| + | } | ||
| + | } | ||
| + | </source> | ||
| + | |||
| + | и добавим на него права, для чего создадим в той же директории файл permissions.custom.php следующего содержания: | ||
| + | |||
| + | <source lang="php"> | ||
| + | $permissions = array( | ||
| + | 'purchasing' => array( | ||
| + | 'getCustomerInformation' | ||
| + | ) | ||
| + | ); | ||
| + | </source> | ||
== Полезные ссылки == | == Полезные ссылки == | ||
Версия 14:29, 23 сентября 2013
Актуально для версии 2.9.1
Задача
Стандартно, в модуле "Интернет-магазин" включена фильтрация по следующим параметрам заказа:
Также, можно добавить дополнительные параметры из следующего перечня:
Как мы видим, в заказе есть логин покупателя, если это зарегистрированный пользователь, или ip адрес, если это гость. Часто бывает необходимо найти заказ по фамилии, имени или ФИО пользователя, эту возможность мы и будем реализовывать.
Решение
Сначала создадим эти поля, для этого нужно перейти в модуль "Шаблоны Данных", найти тип данных "Заказ", открыть его на редактирование и создать в блоке "Свойства заказа" создать следующие поля, см. "Полезные ссылки".
Обязательно проставьте полям те же идентификаторы, что на скриншоте, и укажите параметр "Фильтруемое"
Теперь у заказа появились нужные поля и их можно добавить в фильтрацию в модуле "Интернет-магазин". Дело осталось за малым - нужно их как-то заполнять нужными значениями, в этом нам поможет событийная модель UMI.CMS, см. "Полезные ссылки".
Нам подойдет стандартная точка вызова "order-status-changed", см. "Полезные ссылки".
Создадим кастомный обработчик для события order-status-changed, для этого в директории /classes/modules/emarket/ создадим файл custom_events.php следующего содержания:
new umiEventListener('order-status-changed', 'emarket', 'getCustomerInformation');
Где order-status-changed - имя события, getCustomerInformation - метод, который будет вызываться при срабатывании этого события.
Теперь опишем этот метод getCustomerInformation, для этого, в файле /classes/modules/emarket/__custom.php после слов "//TODO: Write here your own macroses" вставим следующий код:
public function getCustomerInformation(iUmiEventPoint $event){
//получаем режим работы обработчика
$mode = $event->getMode();
//если режим 'после'
if ($mode == 'after'){
//получаем ссылку на значение из контекста вызова события (в нашем случае это объект заказа)
$order = $event->getRef('order');
$umiObjectCollection = umiObjectsCollection::getInstance();
//получаем id покупателя из объекта заказ
$customerId = $order->getValue('customer_id');
$customer = $umiObjectCollection->getObject($customerId);
//присваиваем нашим переменным имя, фамилию и отчество из объекта покупатель
$customerFirstName = $customer->getValue('fname');
$customerLastName = $customer->getValue('lname');
$customerFatherName = $customer->getValue('father_name');
//присваиваем переменной customerFio строку, содержащую имя, фамилию и отчество
$customerFio = "$customerLastName $customerFirstName $customerFatherName";
//устанавливаем для объекта заказ значение полей (которые мы добавляли в типе данных)
//из объявленных в кастоме переменных
$order->setValue('fname', $customerFirstName);
$order->setValue('lname', $customerLastName);
$order->setValue('father_name', $customerFatherName);
$order->setValue('fio', $customerFio);
}
}
и добавим на него права, для чего создадим в той же директории файл permissions.custom.php следующего содержания:
$permissions = array(
'purchasing' => array(
'getCustomerInformation'
)
);


