
К большому сожалению, у UMI.CMS отсутствует огромное количество функционала, как на популярный бесплатных CMS, но ничего, будет это исправлять.
В этой статье я коснусь достаточно интересной функции, а именно — хиты продаж.
Данный функционал будет вам полезен в качестве привлечение пользователя к продаваемым товарам. У них всегда на глазах будет те товары, которые являются наиболее покупаемыми у вас в интернет магазине.
Обновления товаров будет происходит каждый раз, когда пользователи совершают покупку в вашем интернет-магазине, или в интернет-магазине вашего заказчика.
Приступим к реализации. Она будет разбита на 3 части:
1. Добавление поля в шаблон данных;
2. Добавление события, для обработки свешенного заказа и обновление кол-ва покупок.
3. Добавление функции, которая обрабатывает купленные товары
4. Показ товаров на сайте.
1. Добавление шаблона данных.
Для этого нужно зайти в модуль «Шаблон данных» и выбывать из списка «объект каталога». Далее добавить в него новое поле:
Количество продаж, видимое, qty_of_sell, число
2. Добавление события, для обработки свешенного заказа и обновление кол-ва покупок
В папке с вашим шаблоном создаете следующую иерархию из папок — classes\modules\emarket\. Далее нужно добавить три файла - class.php, events.php, permissions.php.
В файла events.php следует добавить:
<?php
new umiEventListener('order-status-changed', 'emarket', 'setQtyOfSell');
?>
В файла permissions.php следует добавить:
<?php
$permissions = array(
'purchasing' => array(
'setQtyOfSell'
)
);
?>
В файла class.php следует добавить:
<?php
class emarket_custom extends def_module {
/*
Устанавливаем количество покупок одной единицы товара
*/
public function setQtyOfSell(iUmiEventPoint $event){
//получаем режим работы обработчика
$mode = $event->getMode();
//если режим 'после'
if ($mode == 'after'){
//получаем ссылку на значение из контекста вызова события (в нашем случае это объект "Заказ")
$order = $event->getRef('order');
$order_items = $order->getItems();
foreach($order_items as $order_item) {
$el = $order_item->getItemElement();
if ($order_item->getAmount()) $ia = $order_item->getAmount();
else $ia = 0;
if ($el->getValue('qty_of_sell')) $sc = $el->getValue('qty_of_sell');
else $sc = 0;
$el->setValue('qty_of_sell', $sc+$ia);
$el->commit();
}
}
}
}
?>
Теперь, каждый раз, когда пользователь совершает заказ в вашем интернет-магазине, системы ловит событие и в поле qty_of_sell обновляет информацию о том, какое кол-во раз был куплен товар.
3. Показ товаров на сайте.
Для того, чтобы продемонстрировать вашему пользователю самый хитовый товар нужно добавить функцию, которая делает выборку из БД, а далее вывести этот товар используя XSLT-шаблонизатор.
Данный пример рассматривает только XSLT-шаблонизатор. С TPL-шаблонизатором я более не работаю и вам не советую.
Также мною используется стандартный шаблон demodizzy для реализации примеров.
Для того, чтобы сделать выборку хитов продаж в вашем интернет магазине UMI.CMS, в папке вашего шаблона создаете следующую иерархию — classes\modules\catalog\. Далее нужно добавить два файла файла - class.php, permissions.php.
В файла permissions.php следует добавить:
<?php
$permissions = Array(
'view' =>
Array(
'getBestSellers'
)
);
?>
В файла class.php добавить:
<?php
class catalog_custom extends catalog {
/*
* getBestSellers - функция для получения хитов продаж
*
* @limit - количество объектов для показа
* @field - поле по которому следует сортировать объекты title | price | qty_of_sell
* @order - порядок сортировки desc | asc | rand
* @template - не участвует, так как используется xslt шаблоназатор
*/
public function getBestSellers($limit = 100, $field = false, $order = false, $template = 'default') {
/* Формирована для TPL-шаблоназитора*/
if(!$template) $template = "default"; // Имя шаблона по умолчанию
$template_line = 'objects_list'; // Имя секции для шаблона TPL
list($theme) = def_module::loadTemplates('catalog/' . $template, 'elements'); // Загрузка в шаблон
$pages = new selector('pages');
$pages->types('hierarchy-type')->name('catalog', 'object');
$pages->option('exclude-nested', true);
/* Устанавливаются значения поиска */
$pages->where('qty_of_sell')->more('1');
if ($field) {
if($order == 'desc')
$pages->order($field)->desc();
elseif ($order == 'asc')
$pages->order($field)->asc();
elseif ($order == 'rand')
$pages->order($field)->rand();
}
if(!$field && $order) {
if($order == 'desc')
$pages->order('id')->desc();
elseif ($order == 'asc')
$pages->order('id')->asc();
elseif ($order == 'rand')
$pages->order('id')->rand();
}
$lines = Array();
$total = 0; foreach($pages as $page) {$total ++;}
$lim = 0;
foreach($pages as $page) {
if ($limit == $lim) break;
$element = umiHierarchy::getInstance()->getElement($page->id);
$line_arr = Array();
$line_arr['attribute:id'] = $page->id;
$line_arr['attribute:link'] = $page->link;
$line_arr['xlink:href'] = "upage://" . $page->id;
$line_arr['h1'] = $element->getValue('h1');
$line_arr['qty_of_sell'] = $element->getValue('qty_of_sell');
$line_arr['name'] = $page->name;
$price = $element->getValue('price');
$line_arr['price'] = number_format($price, 0, '.', ' ');
$line_arr['photo'] = $element->getValue('photo');
$lines[] = self::parseTemplate($template_line, $line_arr, $page->id);
$lim ++;
umiHierarchy::getInstance()->unloadElement($page->id);
}
$block_arr = array();
if ($total != 0) {
$block_arr['subnodes:items'] = $lines;
$block_arr['total'] = $total;
} else {
$block_arr['subnodes:items'] = "Нет объектов, которые бы совпадали с указанными параметрами";
$block_arr['total'] = $total;
}
// Возвращаем значение
return def_module::parseTemplate($theme, $block_arr);
}
}
?>
Функция getBestSellers принимает параметры:
- @limit — количество объектов для показа
- @field — поле по которому следует сортировать объекты title | price | qty_of_sell
- @order — порядок сортировки desc | asc | rand
- @template — не участвует, так как используется xslt шаблоназатор
Теперь вам нужно определиться с блоком на сайте, в котором следует выводить ваши бестселлеры. Определились? Отлично. Я буду выводить в правой колонке своего интернет магазина и будет это выглядеть примерно следующим образом:
Добавляем вывод.
В том месте, где должны выводиться хиты добавляете:
<xsl:apply-templates select="document('udata://catalog/getBestSellers/3//rand')/udata" mode="getBestSellers" />
Далее в любое место шаблона, перед /xsl:stylesheet добавляете
<xsl:template match="udata[@method = 'getBestSellers']" mode="getBestSellers">
<!-- Если у есть хиты, то они будет на сайте. Если нет, блок не будет виден -->
<xsl:choose>
<xsl:when test="count(items/item) > 0">
<div class="infoblock">
<div class="title">
<h2>Хиты продаж!</h2>
</div>
<div class="body">
<div class="in">
<xsl:apply-templates select="items/item" mode="getBestSellers_item" />
</div>
</div>
</div>
</xsl:when>
</xsl:choose>
</xsl:template>
Далее, ниже добавляете сам шаблон формирования отображения:
<xsl:template match="item" mode="getBestSellers_item">
<div umi:element-id="37" umi:region="list" umi:sortable="none" umi:module="news" umi:method="lastlist" umi:button-position="top right">
<div class="news_item" umi:element-id="{@id}" umi:region="row">
<a href="{@link}" title="{h1}" class="title" umi:field-name="name" umi:delete="delete" umi:empty="Название страницы">
<xsl:value-of select="h1" />
</a>
<div class="descr">
<xsl:call-template name="catalog-thumbnail">
<xsl:with-param name="element-id" select="@id" />
<xsl:with-param name="field-name">photo</xsl:with-param>
<xsl:with-param name="width">100</xsl:with-param>
<xsl:with-param name="height">auto</xsl:with-param>
<xsl:with-param name="empty">&empty-photo;</xsl:with-param>
</xsl:call-template>
</div>
</div>
</div>
</xsl:template>
Хиты продаж для UMI.CMS готовы. Теперь ваши пользователи будет видеть товары, которые являются самыми продаваемыми.
Как вы могли заметить у вас есть возможность самостоятельно управлять вашими бестселлерами, для этого в объекте каталога просто отредактируйте поле «Количество продаж».
P.S. Если вы знакомились со статьей Оптимизация изображений в UMI.CMS, то вы можете вывести оптимизированные изображения. Для этого, просто замените вот этот участок кода:
<xsl:call-template name="catalog-thumbnail">
<xsl:with-param name="element-id" select="@id" />
<xsl:with-param name="field-name">photo</xsl:with-param>
<xsl:with-param name="width">100</xsl:with-param>
<xsl:with-param name="height">auto</xsl:with-param>
<xsl:with-param name="empty">&empty-photo;</xsl:with-param>
</xsl:call-template>
на данный участок кода:
<xsl:call-template name="makeSubDomainImage">
<xsl:with-param name="subdomain">img</xsl:with-param>
<xsl:with-param name="element_id" select="@id" />
<xsl:with-param name="field_name">photo</xsl:with-param>
<xsl:with-param name="width">100</xsl:with-param>
<xsl:with-param name="height">auto</xsl:with-param>
<xsl:with-param name="alt" select="name" />
<xsl:with-param name="class">image</xsl:with-param>
<xsl:with-param name="link" select="@link" />
<!--<xsl:with-param name="empty">&empty-photo;</xsl:with-param>-->
</xsl:call-template>
Надеюсь, что данный материал поможет вам.
Ну и последнее, если вам лень читать, то вы можете скачать готовый вариант