https://wiki.umisoft.ru/index.php?title=%D0%92%D1%8B%D0%B2%D0%BE%D0%B4_%D1%84%D0%B8%D0%BB%D1%8C%D1%82%D1%80%D0%BE%D0%B2_%D0%B4%D0%BB%D1%8F_%D0%B2%D1%81%D0%B5%D1%85_%D1%80%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D0%BE%D0%B2_%D0%BA%D0%B0%D1%82%D0%B0%D0%BB%D0%BE%D0%B3%D0%B0&feed=atom&action=historyВывод фильтров для всех разделов каталога - История изменений2024-03-28T14:57:18ZИстория изменений этой страницы в викиMediaWiki 1.31.0https://wiki.umisoft.ru/index.php?title=%D0%92%D1%8B%D0%B2%D0%BE%D0%B4_%D1%84%D0%B8%D0%BB%D1%8C%D1%82%D1%80%D0%BE%D0%B2_%D0%B4%D0%BB%D1%8F_%D0%B2%D1%81%D0%B5%D1%85_%D1%80%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D0%BE%D0%B2_%D0%BA%D0%B0%D1%82%D0%B0%D0%BB%D0%BE%D0%B3%D0%B0&diff=6332&oldid=prevMad grant в 15:33, 23 сентября 20132013-09-23T15:33:47Z<p></p>
<table class="diff diff-contentalign-left" data-mw="interface">
<col class="diff-marker" />
<col class="diff-content" />
<col class="diff-marker" />
<col class="diff-content" />
<tr class="diff-title" lang="ru">
<td colspan="2" style="background-color: #fff; color: #222; text-align: center;">← Предыдущая</td>
<td colspan="2" style="background-color: #fff; color: #222; text-align: center;">Версия 15:33, 23 сентября 2013</td>
</tr><tr><td colspan="2" class="diff-lineno" id="mw-diff-left-l1" >Строка 1:</td>
<td colspan="2" class="diff-lineno">Строка 1:</td></tr>
<tr><td class='diff-marker'>−</td><td style="color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>  [[category:Верстка в XSLT]][[Категория:Модуль Каталог]]</div></td><td class='diff-marker'>+</td><td style="color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>  [[category:Верстка в XSLT]][[Категория:Модуль Каталог<ins class="diffchange diffchange-inline">]][[category:API</ins>]]</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>'''Актуально для версии 2.9.1'''</div></td><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>'''Актуально для версии 2.9.1'''</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>== Вывод фильтров для всех разделов каталога==</div></td><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>== Вывод фильтров для всех разделов каталога==</div></td></tr>
</table>Mad granthttps://wiki.umisoft.ru/index.php?title=%D0%92%D1%8B%D0%B2%D0%BE%D0%B4_%D1%84%D0%B8%D0%BB%D1%8C%D1%82%D1%80%D0%BE%D0%B2_%D0%B4%D0%BB%D1%8F_%D0%B2%D1%81%D0%B5%D1%85_%D1%80%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D0%BE%D0%B2_%D0%BA%D0%B0%D1%82%D0%B0%D0%BB%D0%BE%D0%B3%D0%B0&diff=6325&oldid=prevMad grant в 14:58, 23 сентября 20132013-09-23T14:58:59Z<p></p>
<table class="diff diff-contentalign-left" data-mw="interface">
<col class="diff-marker" />
<col class="diff-content" />
<col class="diff-marker" />
<col class="diff-content" />
<tr class="diff-title" lang="ru">
<td colspan="2" style="background-color: #fff; color: #222; text-align: center;">← Предыдущая</td>
<td colspan="2" style="background-color: #fff; color: #222; text-align: center;">Версия 14:58, 23 сентября 2013</td>
</tr><tr><td colspan="2" class="diff-lineno" id="mw-diff-left-l123" >Строка 123:</td>
<td colspan="2" class="diff-lineno">Строка 123:</td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>=== Результат ===</div></td><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>=== Результат ===</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>Результат будет такой же как через usel, только мы выиграем в быстродействии.</div></td><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>Результат будет такой же как через usel, только мы выиграем в быстродействии.</div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;">== Полезные ссылки ==</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;">*Документация по макросу %catalog getObjectList()% [http://dev.docs.umi-cms.ru/spravochnik_makrosov_umicms/katalog/catalog_getobjectslist/]</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;">*Документация по макросу %catalog search()% [http://dev.docs.umi-cms.ru/spravochnik_makrosov_umicms/katalog/catalog_search/]</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;">*Документация по протоколу USel [http://dev.docs.umi-cms.ru/shablony_i_makrosy/xslt-shablonizator_umi_cms/vyborki_iz_bd_protokol_usel/]</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;">*Документация по Selector [http://api.docs.umi-cms.ru/spravochnik_po_klassam_yadra_umicms/vyborki/selector/]</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;">*Документация по классу umiHierarchyElement [http://api.docs.umi-cms.ru/spravochnik_po_klassam_yadra_umicms/model_ierarhii/umihierarchyelement/]</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;">*Конструкция foreach [http://www.php.net/manual/ru/control-structures.foreach.php]</ins></div></td></tr>
</table>Mad granthttps://wiki.umisoft.ru/index.php?title=%D0%92%D1%8B%D0%B2%D0%BE%D0%B4_%D1%84%D0%B8%D0%BB%D1%8C%D1%82%D1%80%D0%BE%D0%B2_%D0%B4%D0%BB%D1%8F_%D0%B2%D1%81%D0%B5%D1%85_%D1%80%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D0%BE%D0%B2_%D0%BA%D0%B0%D1%82%D0%B0%D0%BB%D0%BE%D0%B3%D0%B0&diff=6321&oldid=prevMad grant: Новая страница: « category:Верстка в XSLTКатегория:Модуль Каталог '''Актуально для версии 2.9.1''' == Вывод фильтр…»2013-09-23T14:56:08Z<p>Новая страница: « <a href="/%D0%9A%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%8F:%D0%92%D0%B5%D1%80%D1%81%D1%82%D0%BA%D0%B0_%D0%B2_XSLT" title="Категория:Верстка в XSLT">category:Верстка в XSLT</a><a href="/%D0%9A%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%8F:%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C_%D0%9A%D0%B0%D1%82%D0%B0%D0%BB%D0%BE%D0%B3" title="Категория:Модуль Каталог">Категория:Модуль Каталог</a> '''Актуально для версии 2.9.1''' == Вывод фильтр…»</p>
<p><b>Новая страница</b></p><div> [[category:Верстка в XSLT]][[Категория:Модуль Каталог]]<br />
'''Актуально для версии 2.9.1'''<br />
== Вывод фильтров для всех разделов каталога==<br />
По-умолчанию в демошаблоне "demodizzy"(Современный интернет магазин) реализована следующая структура каталога:<br />
<br />
[[Файл:Structure.png]]<br />
<br />
И фильтры выводятся только в разделах каталога 3его уровня, а в разделах 2ого уровня фильтры не выводятся:<br />
<br />
[[Файл:Filter1.png]][[Файл:Filter4.png]]<br />
<br />
А нам нужно вывести фильтры для товаров и на 3ем и на 2ом уровне, при условии, что в каждом разделе 2ого уровня присутствуют товары<br />
только одного типа данных, то есть нам нужно как-то передавать тип данных объекта каталога, находящегося с разделе каталога на<br />
3ем уровне, в раздел каталога на 2ом уровне.<br />
=== Решение через макрос catalog getObjectList ===<br />
Сначала, попробуем решить задачу с помощью системного макроса %catalog getObjectList()%, см. "Полезные ссылки". Попробуем<br />
воспользоваться примером решения из статьи [[Как_вывести_фильтр_по_товарам_по_всему_каталогу(XSLT)]], для этого<br />
перед вызовом макроса %catalog search()%, см. "Полезные ссылки", в файле /templates/demodizzy/xslt/modules/catalog/category-view.xsl<br />
<source lang="xml"><br />
<xsl:apply-templates select="document('udata://catalog/search')" /><br />
</source><br />
добавим переменную "type" и присвоим ей значение типа данных первого объекта каталога, полученного с помощью catalog getObjectList:<br />
<source lang="xml"><br />
<xsl:variable name="type" select="document(concat('udata://catalog/getObjectsList/', page/@id, '////3/'))/udata/type_id"/><br />
</source><br />
и модифицируем вызов макроса catalog search, добавив 4 параметром нашу переменную "type"<br />
<source lang="xml"><br />
<xsl:apply-templates select="document(concat('udata://catalog/search////', $type))"/><br />
</source><br />
то есть в результате темплейт match="udata[@method = 'getObjectsList'][total]" будет начинаться со следующего:<br />
<source lang="xml"><br />
<xsl:variable name="type" select="document(concat('udata://catalog/getObjectsList/', page/@id, '////3/'))/udata/type_id"/><br />
<xsl:apply-templates select="document(concat('udata://catalog/search////', $type))"/><br />
</source><br />
=== Результат ===<br />
В результате страницах разделов каталога 2ого и 3его уровня отображаются фильтры, причем для каждого раздела каталога свои:<br />
<br />
[[Файл:Filter2.png]][[Файл:Filter3.png]]<br />
<br />
На первый взгляд задача была решена, но если мы зададим в фильтре такие значения, которым не будет удовлетворять ни один объект<br />
каталога (товар), то после нажатия кнопки "применить", окно фильтра пропадет, а так как и объектов нет - пользователю откроется пустой экран:<br />
<br />
[[Файл:Filter5.png]]<br />
<br />
Нас это не устраивает, так как, хотелось бы, чтобы форма осталась и пользователь мог ввести другие данные.<br />
Такая ситуация возникает из-за особенностей работы макроса catalog getObjectsList(), он взаимодействует с get параметрами,<br />
появляющимися в адресной строке браузера после применения фильтра, а так как ни один объект каталога не удовлетворяет заданным параметрам,<br />
то и переменную type равную типу данных объекта каталога мы получить не можем, а значит мы передаем макросу catalog search() пустую переменную, то и<br />
форма не выводится. Значит нам нужно получать тип данных каким-нибудь другим способом, независимым от работы catalog search(), из<br />
стандартных средства с этой задаче справиться USel, см. "Полезные ссылки".<br />
=== Решение через USel ===<br />
Сначала, создадим xml шаблон для USel выборки, для этого поместим в директорию /templates/demodizzy/usels/ файл getObjectOfCategory.xml следующего содержания:<br />
<source lang="xml"><br />
<?xml version="1.0" encoding="utf-8"?><br />
<selection><br />
<!-- результат выборки - страницы --><br />
<target result="pages"><br />
<!-- результат выборки - страницы объектов каталога --><br />
<type module="catalog" method="object" /><br />
<!-- результат выборки - страницы объектов каталога, находящиеся в директории с id или url равным {1} на 5 уровнях вложенности --><br />
<category depth="5">{1}</category><br />
</target><br />
<!-- выводить только один результат выборки --><br />
<limit page="0">1</limit><br />
</selection><br />
</source><br />
А теперь заменим присваивание переменной type значения через catalog getObjectsList() в файле /templates/demodizzy/xslt/modules/catalog/category-view.xsl<br />
<source lang="xml"><br />
<xsl:variable name="type" select="document(concat('udata://catalog/getObjectsList/', page/@id, '////3/'))/udata/type_id"/><br />
</source><br />
на присваивания через usel:<br />
<source lang="xml"><br />
<xsl:variable name="type" select="document(concat('usel://getObjectOfCategory/', $document-page-id))/udata/page/@type-id"/><br />
</source><br />
в этом селекте мы используем переменную $document-page-id, которая стандартно задана в файле /templates/demodizzy/xslt/default.xsl:<br />
<source lang="xml"><br />
<xsl:variable name="document-page-id" select="/result/@pageId" /><br />
</source><br />
и передаем её первым параметром {1} в наш USel.<br />
=== Результат ===<br />
В результате, вывод формы фильтрации не зависит от введенных раннее данных. Однако, usel это не оптимальное решение, так как он довольно медленный, лучше решить<br />
нашу задачу через API.<br />
=== Решение через API===<br />
В кастоме мы будем с помощью Selector, см. "Полезные ссылки", получать объект каталог из раздела с заданным id, а потом с помощью метода getObjectTypeId класса umiHierarchyElement, см. "Полезные ссылки". <br />
получать id его типа данных, собственно его кастом и будет возвращать.<br />
В файле /classes/modules/catalog/__custom.php после строки abstract class __custom_catalog { добавим следующий код:<br />
<source lang="php"><br />
public function getObjectsType($id)<br />
{<br />
// создаем $pages экземпляр класса selector<br />
$pages = new selector('pages');<br />
// определяем типы данных - объект каталога<br />
$pages->types('object-type')->name('catalog', 'object');<br />
// определяем параметры выборки - искать объекты каталога, дочерние страницы с id = $id с вложенностью в 5 уровней<br />
$pages->where('hierarchy')->page($id)->childs(5);<br />
// определяем выводимое количество результатов выборки - 1 результат<br />
$pages->limit(0,1);<br />
// см. "Полезные ссылки"<br />
foreach($pages as $page)<br />
// возвращаем тип данных полученной страницы<br />
return $page->getObjectTypeId();<br />
}<br />
</source><br />
и добавим созданному методу права, чтобы пользователи тоже могли наблюдать результат его работы, для этого приведем<br />
содержание файла /classes/modules/catalog/permissions.custom.php (если такого файла нет, то создайте его) к следующему виду:<br />
<source lang="php"><br />
<?php<br />
// В этом файле вы можете расширить существующую группу прав, или добавить свою<br />
$permissions = array(<br />
'tree' => array('getObjectsType'),<br />
'view' => array('getObjectsType')<br />
);<br />
?><br />
</source><br />
После этого, заменим присваивание переменной type значения через USel в файле /templates/demodizzy/xslt/modules/catalog/category-view.xsl:<br />
<source lang="xml"><br />
<xsl:variable name="type" select="document(concat('usel://getObjectOfCategory/', $document-page-id))/udata/page/@type-id"/><br />
</source><br />
на присваивание через наш кастомный макрос:<br />
<source lang="xml"><br />
<xsl:variable name="type" select="document(concat('udata://catalog/getObjectsType/', $document-page-id))/udata"/><br />
</source><br />
=== Результат ===<br />
Результат будет такой же как через usel, только мы выиграем в быстродействии.</div>Mad grant