Версия: 4.x
Добавляем к заказу(ORM объекту) поле с произвольным шаблоном отображения, а также доп.информацию к товару

Иногда требуется добавить поле к ORM объекту, которое должно иметь какое-нибудь сложное отображение. Предположим у вас есть объект "заказ" и вы желаете отобразить в нем надпись красным цветом "Нужно срочно позвонить клиенту и уточнить его данные", если заказ был оформлен без регистрации, в противном случае отображать надпись "Все ок".

Реализовывать данную задачу мы будем из нашего кастомного модуля ModuleName. Исходим из того, что простейший модуль создан и установлен в вашем магазине.

Для добавления поля обработаем событие orm.init.shop-order в нашем модуле. Создадим файл config/handlers.inc.php со следующим содержимым:

<?php
namespace ModuleName\Config;
/**
* Класс предназначен для объявления событий, которые будет прослушивать данный модуль и обработчиков этих событий.
*/
class Handlers extends \RS\Event\HandlerAbstract
{
function init()
{
//Подписываемся на обработку события
$this->bind('orm.init.shop-order');
}
/**
* Добавляет поля в объект заказа
*
* @param \Shop\Model\Orm\Order $order
*/
public static function ormInitShopOrder(\Shop\Model\Orm\Order $order)
{
$order->getPropertyIterator()->append(array(
'custom_field' => new \RS\Orm\Type\Mixed(array(
'description' => t('Важная информация'),
'infoVisible' => true, //Добавили видимость поля в зоне info
'template' => '%modulename%/form/order/custom_field.tpl' //Задали шаблон поля
))
));
}
}

Форма заказа в административной панели разделена на несколько зон. Мы можем включить отображение поля в одной из следующих зон:

  • footer (в нижней части заказа)
  • depend (в части заказа, зивисимой от статуса)
  • info (в левой информационной части)
  • delivery (в блоке доставки)
  • payment (в блоке оплаты)

Для указания зоны отображения полю ORM объекта, в свойствах следует установить в true ключ footerVisible или dependVisible или infoVisible и т.д.

Для того, чтобы вывести произвольную информацию в заказ мы создали новое поле custom_field с типом . Такое поле не будет записываться в базу данных. Мы можем указать произвольный шаблон отображения данного поля через свойство template.

Создадим файл custom_field.tpl в папке /view/form/order нашего модуля со следующим содержанием:

1 {* В переменной $elem мы имеем объект заказа \Shop\Model\Orm\Order *}
2 {* В переменной $field мы имеем объект поля custom_field - \Orm\Type\Mixed, но в данном примере мы его использовать не будем *}
3 {$user_id = $elem.user_id} {* получаем ID пользователя *}
4 
5 {if $user_id>0}
6  <span style="color:green">Все OK</span>
7 {else}
8  <span style="color:red">Нужно срочно позвонить клиенту и уточнить его данные</span>
9 {/if}

В переменной $elem мы имеем объект заказа, соответственно можем обращаться ко всем его свойствам и методам. В данном примере нас интересует поле user_id - ID пользователя.

В итоге, получаем результат, если заказ оформлен без регистрации:

demo2_1.jpg

Если заказ оформлен от имени зарегистрированного пользователя:

demo2_2.jpg