UMI.CMS. Показать все товары со скидкой модуля «Интернет магазин»

umi-cms-vertical-sale
Буквально на днях столкнулся с задачей — нужно было вывести на странице все товары из модуля «Интернет магазин» UMI.CMS.

Первым делом что я сделал, это начал искать решение подобной задачи на wiki.umisoft.ru. Не разочаровался и нашел решение - Вывод всех товаров, которым назначены скидки. В данном решение была достаточно сильная недоработка, а именно, если вы в разделе «скидки» модуля «Интернет магазин» назначаете скидку не на товары, а допустим на категорию товаров, то товары, которые входят в категорию, и на которые назначена скидка попросту не выведутся.

Но в любом случае решение от UMI.CMS мне очень помогло.

В общем приступаем.

Задача:

  1. Есть страница, на ней должны выводиться все объекты каталога, на которые сейчас назначена скидка в модуле "Интернет магазин", раздел «скидки»;
  2. Вы выдачу не должны попадать разделы каталога.

Планы по доработке:

  1. Постраничная навигация
  2. Фильтрация/сортировка
  3. Убрать повторение товаров, если таковы будут (по ошибке была назначена различная скидка на один товар)
  4. Думаю, что еще планы будут обновляться, а потом и реализовываться. Сейчас скромный функционал выборки.

Реализация.

Сначала нужно в UMI.CMS назначить скидку на товары/группу товаров/разделы. Сделали? Идем далее.

Создаем страницу в модуле «Структура», обзываем ее как хотим. На ней в дальнейшем будет выводиться все товары.

Чуть не забыл, данный пример рассматривает только XSLT-шаблонизатор. С TPL-шаблонизатором я более не работаю, да и вам не советую, если вы все мучаетесь с ним.

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

Далее нужно открыть созданную страницу и добавить к в конце URL .xml — это нужно для того, чтобы узнать id страницы на которой будут выводиться товары:

umi-cms-pokazat-vse-tovary-so-skidkoj-modulya-internet-magazin-1

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
umi-cms-pokazat-vse-tovary-so-skidkoj-modulya-internet-magazin-2

На этом все.