
Буквально на днях столкнулся с задачей — нужно было вывести на странице все товары из модуля «Интернет магазин» 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
На этом все.