UMI.CMS. Показать все товары со скидкой модуля «Интернет магазин»
Буквально на днях столкнулся с задачей — нужно было вывести на странице все товары из модуля «Интернет магазин» UMI.CMS.
Первым делом что я сделал, это начал искать решение подобной задачи на wiki.umisoft.ru. Не разочаровался и нашел решение - Вывод всех товаров, которым назначены скидки. В данном решение была достаточно сильная недоработка, а именно, если вы в разделе «скидки» модуля «Интернет магазин» назначаете скидку не на товары, а допустим на категорию товаров, то товары, которые входят в категорию, и на которые назначена скидка попросту не выведутся.
Но в любом случае решение от UMI.CMS мне очень помогло.
В общем приступаем.
Задача:
- Есть страница, на ней должны выводиться все объекты каталога, на которые сейчас назначена скидка в модуле "Интернет магазин", раздел «скидки»;
- Вы выдачу не должны попадать разделы каталога.
Планы по доработке:
- Постраничная навигация
- Фильтрация/сортировка
- Убрать повторение товаров, если таковы будут (по ошибке была назначена различная скидка на один товар)
- Думаю, что еще планы будут обновляться, а потом и реализовываться. Сейчас скромный функционал выборки.
Реализация.
Сначала нужно в UMI.CMS назначить скидку на товары/группу товаров/разделы. Сделали? Идем далее.
Создаем страницу в модуле «Структура», обзываем ее как хотим. На ней в дальнейшем будет выводиться все товары.
Чуть не забыл, данный пример рассматривает только XSLT-шаблонизатор. С TPL-шаблонизатором я более не работаю, да и вам не советую, если вы все мучаетесь с ним.
Также я использую стандартный шаблон demodizzy для реализации примеров и путь к шаблону может отличаться от вашего.
Далее нужно открыть созданную страницу и добавить к в конце URL .xml — это нужно для того, чтобы узнать id страницы на которой будут выводиться товары:
Id страницы есть, нужно открыть директорию - \templates\demodizzy\xslt\modules\content\common.xsl и туда добавить код:
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE xsl:stylesheet SYSTEM "ulang://i18n/constants.dtd:file"> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:umi="http://www.umi-cms.ru/TR/umi"> <xsl:template match="result[@module = 'content'][@pageId = '88']"> <div class="objects" umi:element-id="{category_id}" umi:module="catalog" umi:method="getObjectsList" umi:sortable="sortable"> <xsl:apply-templates select="document('udata://catalog/getAllDiscountItems/')/udata/items/item" mode="short-view" /> </div> </xsl:template> </xsl:stylesheet>
Далее в папке вашего шаблона создать, если нет, директории со следующей вложенностью — \classes\modules\catalog. В директории catalog нужно создать два файла class.php и permissions.php.
В файл class.php добавить код:
/* * Вывод всех товаров, которым назначены скидки */ public function getAllDiscountItems(){ // Системные данные $block_arr = array(); $line_arr = array(); $total = 0; $obj_coll = umiObjectsCollection::getInstance(); $disounts = new selector('objects'); $disounts->types('object-type')->guid('emarket-discount'); $disounts->where('is_active')->equals(1); foreach ($disounts as $discount){ $prop_id = $discount->getValue('discount_rules_id'); $prop = $obj_coll->getObject($prop_id[0]); if ($prop->getTypeGUID()=='emarket-discountrule-777'){ $items = $prop->getValue('catalog_items'); foreach ($items as $item){ // Получение category id для того, чтобы совершить выборку $item_id = $item->id; $type_id = $item->getTypeId(); $hierarchy = umiHierarchy::getInstance(); $hierarchy_type_id = umiHierarchyTypesCollection::getInstance()->getTypeByName("catalog", "object")->getId(); $category_element = $hierarchy->getElement($item_id); if($type_id == 45) { // указать type_id из http://ваш_домен/admin/data/config/.xml "Разделы каталога" $line_arr['attribute:id'] = $item->id; $line_arr['attribute:alt_name'] = $item->getAltName(); $line_arr['attribute:link'] = umiHierarchy::getInstance()->getPathById($item->id); $line_arr['xlink:href'] = "upage://" . $item->id; $line_arr['node:text'] = $item->getName(); $block_arr['items']['nodes:item'][] = $line_arr; // подсчет кол-ва элементов $total ++; } else if( $type_id == 44 ) { // указать type_id из http://ваш_домен/admin/data/config/.xml "Объекты каталога" $sel = new umiSelection; $sel->setElementTypeFilter(); $sel->addElementType($hierarchy_type_id); $sel->addHierarchyFilter($item_id, '2'); $sel->setPermissionsFilter(); $sel->addPermissions(); $hierarchy_type = umiHierarchyTypesCollection::getInstance()->getType($hierarchy_type_id); $type_id = umiObjectTypesCollection::getInstance()->getBaseType($hierarchy_type->getName(), $hierarchy_type->getExt()); $result = umiSelectionsParser::runSelection($sel); if(($sz = sizeof($result)) > 0) { for($i = 0; $i < $sz; $i++) { $element_id = $result[$i]; $element = umiHierarchy::getInstance()->getElement($element_id); $line_arr['attribute:id'] = $element_id; $line_arr['attribute:alt_name'] = $element->getAltName(); $line_arr['attribute:link'] = umiHierarchy::getInstance()->getPathById($element_id); $line_arr['xlink:href'] = "upage://" . $element_id; $line_arr['node:text'] = $element->getName(); $block_arr['items']['nodes:item'][] = $line_arr; // подсчет кол-ва элементов $total ++; umiHierarchy::getInstance()->unloadElement($element_id); } } } } } } if( $total > 0 ) { $block_arr['numpages'] = umiPagenum::generateNumPage($total, $per_page); $block_arr['total'] = $total; $block_arr['per_page'] = $per_page; return $block_arr; } else { $block_arr['info'] = 'Нет товаров'; $block_arr['total'] = $total; return $block_arr; } }
В файл permissions.php добавляете код:
<?php $permissions = Array( 'view' => Array( 'getAllDiscountItems' ) ); ?>
Обратите внимание на строки if ($type_id == 45) и else if ( $type_id == 44 ), в них нужно указать type_id объекта и раздела каталога вашего сайта — http://ваш_домен/admin/data/config/.xml
На этом все.