Расширение функционала метода emarket basket

Материал из Umicms
Перейти к:навигация, поиск

Часто возникает ситуация, что необходимо расширить функционал метода 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.

Для настройки функционала увеличения или уменьшения количества какого-либо элемента заказа, необходимо:

после строки:

$options = getRequest('options');

добавить:

$mode_change = (int) getRequest('change_item');

и также после строки:

$amount = $amount ? $amount : ($orderItem->getAmount() + 1);

добавить:

if($mode_change) $amount = ($mode_change == 1) ? $orderItem->getAmount() + 1 : $orderItem->getAmount() - 1;

Если говорить на примере TPL-шаблонизатора, то при использовании в шаблоне tpls/emarket/default.tpl, в блоке order_item, ссылок:

<a href="/emarket/basket/put/item/%id%/?change_item=1">+</a>
<a href="/emarket/basket/put/item/%id%/?change_item=2">-</a>

к которым можно прикрепить кнопки, можно увеличивать или уменьшать количество любого элемента заказа на единицу.

Далее, в папке 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>

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