Расширение функционала метода emarket basket
Часто возникает ситуация, что необходимо расширить функционал метода emarket basket(), который отвечает за добавление товара в корзину. В версии системы 2.8.4.3 и ниже в методе basket еще не прописано событие для кастомизации данного действия, поэтому для решения задачи из нашего примера вынесем метод basket в кастомный файл.
Задача: необходимо при добавлении товара в корзину дать покупателю оставить небольшой комментарий к товару, который он положит в корзину, также этот комментарий необходимо видеть в административной части при просмотре параметров заказа.
Решение: Скопируем код метода basket из файла __purchasing.php, в файл classes/modules/emarket/__custom.php и переименуем метод в basket_custom. В новом методе, строку:
$order = self::getBasketOrder(!in_array($mode, array('put', 'remove')));
необходимо изменить на:
$order = $this->getBasketOrder(!in_array($mode, array('put', 'remove')));
После строки:
if($itemType == 'element') {
добавим:
$orderItem->dop_info = htmlspecialchars(getRequest('dop_info'));
данный код будет добавлять в элемент заказа переданное значение из поля dop_info. В папке classes/modules/emarket/ необходимо создать файл permissions.custom.php:
<?php
$permissions = array('purchasing' => array('basket_custom'));
?>
В шаблонах сайта, должна быть создана форма для добавления товара в корзину, action формы, стандартный, за исключением того, что вместо метода basket необходимо прописать basket_custom. Также в саму форму необходимо добавить input:
<input name="dop_info" style="width: 100px;" type="text" />
В административой части, в модуле Шаблоны данных необходимо открыть на редактирование тип данных Заказ, получить его xml представление, добавив в конце адресной строки браузера: .xml
В полученных данных, будет примерно следующий блок:
<field id="236" name="order_items" title="Наименования заказа" field-type-id="12" visible="visible" guide-id="73">
<type id="12" name="Выпадающий список с множественным выбором" data-type="relation" multiple="multiple"/>
</field>
в которых guide-id="73", тогда открываем на редактирование тип данных с type_id = 73, по ссылке /admin/data/type_edit/73/ . В группу "Свойства наименования" добавим еще одно поле типа Строка, со строковым идентификатором dop_info. Для отображения сохраненного значения, при подробном просмотре заказа, переназначим некоторые шаблоны из файла \styles\skins\mac\data\modules\emarket\order-edit.xsl, если быть точнее добавим к имени элемента заказа, вывод значения из поля dop_info. Для реализации данной части заказа добавим файл: \styles\skins\mac\data\modules\emarket\form.modify.custom.xsl со следующим содержанием:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xlink="http://www.w3.org/TR/xlink">
<xsl:template match="object" mode="order-item-name">
<xsl:value-of select="@name" />
<br/>
<xsl:value-of select="//property[@name = 'dop_info']/value" />
</xsl:template>
<xsl:template match="object[//property/@name = 'item_link']" mode="order-item-name">
<a href="{$lang-prefix}/admin/catalog/edit/{//property/value/page/@id}/">
<xsl:value-of select="@name" />
</a><br/>
<xsl:value-of select="//property[@name = 'dop_info']/value" />
</xsl:template>
</xsl:stylesheet>
После выполнения всех описанных действий, при добавлении покупателем элемента заказа, он может указать краткий комментарий к добавляемому товару, а администратор магазина, при подробном просмотре заказа, этот комментарий сможет прочитать.