Как фильтровать заказы по фио покупателя — различия между версиями
Mad grant (обсуждение | вклад) |
Mad grant (обсуждение | вклад) |
||
(не показано 7 промежуточных версий этого же участника) | |||
Строка 1: | Строка 1: | ||
− | [[category:Модуль Интернет магазин]] | + | [[category:Модуль Интернет магазин]][[category:API]] |
'''Актуально для версии 2.9.1''' | '''Актуально для версии 2.9.1''' | ||
== Задача == | == Задача == | ||
Строка 6: | Строка 6: | ||
[[Файл:Order default.png]] | [[Файл:Order default.png]] | ||
− | |||
− | |||
− | |||
− | |||
Как мы видим, в заказе есть логин покупателя, если это зарегистрированный пользователь, или ip адрес, если это гость. | Как мы видим, в заказе есть логин покупателя, если это зарегистрированный пользователь, или ip адрес, если это гость. | ||
Строка 46: | Строка 42: | ||
if ($mode == 'after'){ | if ($mode == 'after'){ | ||
− | //получаем ссылку на значение из контекста вызова события (в нашем случае это объект | + | //получаем ссылку на значение из контекста вызова события (в нашем случае это объект "Заказ") |
$order = $event->getRef('order'); | $order = $event->getRef('order'); | ||
$umiObjectCollection = umiObjectsCollection::getInstance(); | $umiObjectCollection = umiObjectsCollection::getInstance(); | ||
− | //получаем id покупателя из объекта | + | //получаем id покупателя из объекта "Заказ" |
$customerId = $order->getValue('customer_id'); | $customerId = $order->getValue('customer_id'); | ||
$customer = $umiObjectCollection->getObject($customerId); | $customer = $umiObjectCollection->getObject($customerId); | ||
− | //присваиваем нашим переменным имя, фамилию и отчество из объекта | + | //присваиваем нашим переменным имя, фамилию и отчество из объекта "Покупатель" |
$customerFirstName = $customer->getValue('fname'); | $customerFirstName = $customer->getValue('fname'); | ||
$customerLastName = $customer->getValue('lname'); | $customerLastName = $customer->getValue('lname'); | ||
$customerFatherName = $customer->getValue('father_name'); | $customerFatherName = $customer->getValue('father_name'); | ||
− | //присваиваем переменной customerFio строку, содержащую имя, фамилию и отчество | + | //присваиваем переменной $customerFio строку, содержащую имя, фамилию и отчество |
$customerFio = "$customerLastName $customerFirstName $customerFatherName"; | $customerFio = "$customerLastName $customerFirstName $customerFatherName"; | ||
− | //устанавливаем для объекта | + | //устанавливаем для объекта "Заказ" значение полей (которые мы добавляли в типе данных) |
//из объявленных в кастоме переменных | //из объявленных в кастоме переменных | ||
$order->setValue('fname', $customerFirstName); | $order->setValue('fname', $customerFirstName); | ||
Строка 65: | Строка 61: | ||
$order->setValue('fio', $customerFio); | $order->setValue('fio', $customerFio); | ||
} | } | ||
− | } | + | } |
+ | //по используемым методам в блоке "Полезные ссылки" приводятся ссылки на документацию | ||
</source> | </source> | ||
Строка 77: | Строка 74: | ||
); | ); | ||
</source> | </source> | ||
+ | |||
+ | == Результат == | ||
+ | |||
+ | В результате, в модуль "Интернет-магазин" в заказе будут присутствовать поля "Имя", "Фамилия", "Отчество" и "ФИО", которые будут | ||
+ | автоматически заполнять и по ним можно будет производить фильтрацию в интерфейсе модуля: | ||
+ | |||
+ | [[Файл:Order_with_addparams.png]] | ||
+ | |||
== Полезные ссылки == | == Полезные ссылки == | ||
+ | *Документация по модулю "Интернет-магазин" [http://help.docs.umi-cms.ru/rabota_s_modulyami/modul_internet-magazin/] | ||
+ | *Документация по модулю "Шаблоны данных" [http://help.docs.umi-cms.ru/rabota_s_modulyami/modul_shablony_dannyh/] | ||
+ | *Событий модель UMI.CMS [http://api.docs.umi-cms.ru/razrabotka_nestandartnogo_funkcionala/sobytijnaya_model_umicms/] | ||
+ | *Стандартные точки вызова [http://api.docs.umi-cms.ru/razrabotka_nestandartnogo_funkcionala/sobytijnaya_model_umicms/standartnye_tochki_vyzova/] | ||
+ | *Документация по методу getRef() [http://api.docs.umi-cms.ru/spravochnik_po_klassam_yadra_umicms/sobytiya/umieventpoint/getref/] | ||
+ | *Документация по методу getInstance() [http://api.docs.umi-cms.ru/spravochnik_po_klassam_yadra_umicms/model_dannyh/umiobjecttypescollection/getinstance/] | ||
+ | *Документация по методу getValue() [http://api.docs.umi-cms.ru/spravochnik_po_klassam_yadra_umicms/model_dannyh/umiobject/getvalue/] | ||
+ | *Документация по методу getObject() [http://api.docs.umi-cms.ru/spravochnik_po_klassam_yadra_umicms/model_dannyh/umiobjectscollection/getobject/] | ||
+ | *Документация по методу setValue() [http://api.docs.umi-cms.ru/spravochnik_po_klassam_yadra_umicms/model_dannyh/umiobject/setvalue/] |
Текущая версия на 15:32, 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'
)
);
Результат
В результате, в модуль "Интернет-магазин" в заказе будут присутствовать поля "Имя", "Фамилия", "Отчество" и "ФИО", которые будут автоматически заполнять и по ним можно будет производить фильтрацию в интерфейсе модуля:
Полезные ссылки
- Документация по модулю "Интернет-магазин" [1]
- Документация по модулю "Шаблоны данных" [2]
- Событий модель UMI.CMS [3]
- Стандартные точки вызова [4]
- Документация по методу getRef() [5]
- Документация по методу getInstance() [6]
- Документация по методу getValue() [7]
- Документация по методу getObject() [8]
- Документация по методу setValue() [9]