Как фильтровать заказы по фио покупателя — различия между версиями

Материал из Umicms
Перейти к:навигация, поиск
 
(не показано 7 промежуточных версий этого же участника)
Строка 1: Строка 1:
[[category:Модуль Интернет магазин]]
+
[[category:Модуль Интернет магазин]][[category:API]]
 
'''Актуально для версии 2.9.1'''
 
'''Актуально для версии 2.9.1'''
 
== Задача ==
 
== Задача ==
Строка 6: Строка 6:
  
 
[[Файл:Order default.png]]
 
[[Файл:Order default.png]]
 
Также, можно добавить дополнительные параметры из следующего перечня:
 
 
[[Файл:All params.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

Задача

Стандартно, в модуле "Интернет-магазин" включена фильтрация по следующим параметрам заказа:

Order default.png

Как мы видим, в заказе есть логин покупателя, если это зарегистрированный пользователь, или ip адрес, если это гость. Часто бывает необходимо найти заказ по фамилии, имени или ФИО пользователя, эту возможность мы и будем реализовывать.

Решение

Сначала создадим эти поля, для этого нужно перейти в модуль "Шаблоны Данных", найти тип данных "Заказ", открыть его на редактирование и создать в блоке "Свойства заказа" создать следующие поля, см. "Полезные ссылки".

New field.png

Обязательно проставьте полям те же идентификаторы, что на скриншоте, и укажите параметр "Фильтруемое"

Теперь у заказа появились нужные поля и их можно добавить в фильтрацию в модуле "Интернет-магазин". Дело осталось за малым - нужно их как-то заполнять нужными значениями, в этом нам поможет событийная модель 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'
		)
	);

Результат

В результате, в модуль "Интернет-магазин" в заказе будут присутствовать поля "Имя", "Фамилия", "Отчество" и "ФИО", которые будут автоматически заполнять и по ним можно будет производить фильтрацию в интерфейсе модуля:

Order with addparams.png

Полезные ссылки

  • Документация по модулю "Интернет-магазин" [1]
  • Документация по модулю "Шаблоны данных" [2]
  • Событий модель UMI.CMS [3]
  • Стандартные точки вызова [4]
  • Документация по методу getRef() [5]
  • Документация по методу getInstance() [6]
  • Документация по методу getValue() [7]
  • Документация по методу getObject() [8]
  • Документация по методу setValue() [9]