Подборка разработчиков как на umi-cms.ru
Задача:
Необходимо организовать подбор разработчиков, как на сайте на umi-cms.ru, но только по городу. Пользователю предлагается список городов. При выборе города, система возвращает список разработчиков в этом городе. В административной панели, город - это выпадающий список со справочником.
При решении данной задачи мы использовали передачу параметров из адресной строки и два usel'а
Исходные данные:
Объекты каталога с type-id="830", среди которых производится выборка по значению поля типа "выпадающий список" с названием "os" .
Решение:
Для начала выведем список наших городов, который представляет собой элементы в справочнике для поля gorod.
Найдём (создадим) этот справочник в модуле "Шаблоны данных". Просмотр содержимого справочника доступен по адресу /admin/data/guide_items/817/, где 817 - id справочника.
Теперь составим usel. Создадим в папке /usels/ новый файл goroda.xml следующего содержания:
<?xml version="1.0" encoding="utf-8"?> <selection> <target result="objects"> <type id="{1}" /> </target> <limit page="0">100</limit> </selection>
Этот usel делает выборку всех объектов того типа, который задаётся при вызове usel'а.
Проверить его можно, вызвав через адресную строку http://имя_сайта/usel/goroda/817/
В данном случае - мы выбираем все объекты типа 817, что соответствует всем элементам справочника для поля "os".
Результат должен быть примерно таким:
<udata generation-time="0.016162"> <item id="27537" name="SMB" type-id="817" ownerId="14" xlink:href="uobject://27537"/> <item id="27539" name="Windows M" type-id="817" ownerId="14" xlink:href="uobject://27539"/> <item id="27541" name="TXT" type-id="817" ownerId="14" xlink:href="uobject://27541"/> <item id="27542" name="gsm" type-id="817" ownerId="14" xlink:href="uobject://27542"/> <total>4</total> </udata>
Теперь создадим usel для выборки всех объектов каталога с типом 830 с определенным значением поля os, причем само значение будем передавать в качестве параметра.
Создадим в папке /usels/ новый файл goroda-res.xml следующего содержания:
<?xml version="1.0" encoding="utf-8"?> <selection> <target result="pages"> <type id="830" /> </target> <property name="os"> <object>{1}</object> </property> <limit page="0">100</limit> </selection>
Проверим его работу. Сделаем выборку всех объектов каталога, у которых в выпадающем списке выбрано "Windows M". id этого значения, как мы можем убедиться в выборке goroda, равно 27539. Соответственно, вызов выборки будет выглядеть следующим образом: http://адрес_сайта/usel/goroda-res/27539/
Примерный результат: <udata generation-time="0.030022">
<page id="59" parentId="58" link="/shop/mobil_naya_svyaz/kommunikatory/elektronika_71/" is-active="1" object-id="27654" type-id="830" update-time="1289758610" alt-name="elektronika_71" xlink:href="upage://59"> <basetype id="6" module="catalog" method="object">Объекты каталога</basetype> <name>Elektronika 71</name> </page> <page id="63" parentId="62" link="/shop/mobil_naya_svyaz/smartfony/ericssont_415/" is-active="1" object-id="27658" type-id="830" update-time="1289762117" alt-name="ericssont_415" xlink:href="upage://63"> <basetype id="6" module="catalog" method="object">Объекты каталога</basetype> <name>Ericssont 415</name> </page> <total>2</total> </udata>
Это и есть два объекта каталога нужного нам типа, в поле os которых выбрано "Windows M". Более подробно о возможностях usel можно прочитать здесь: http://help-dev.umi-cms.ru/chapter.XSLTTemplates.usel.html
Теперь выведем информацию на сайт:
Создадим две страницы: /vyborka/ с pageId = 89 для вывода списка значения справочника с ссылками на результат конкретной выборки и /rezultat/ pageId = 90 c для отображения результатов.
Мы, для удобства, создали новую таблицу стилей (файл .xsl), которую подключили к основной таблице стилей с помощью <xsl:include>
Добавим туда шаблон для обработки страницы /vyborka/
<xsl:param name="gorod" select="0" /> <xsl:template match="result[@pageId = '89']"> <xsl:apply-templates select="document('usel://goroda/817')/udata" mode="goroda" /> </xsl:template> <xsl:template match="udata" mode="goroda" > <xsl:apply-templates select="item" mode="goroda" /> </xsl:template> <xsl:template match="item" mode="goroda" > <a href="/rezultat/?gorod={@id}"><xsl:value-of select="@name" /></a> </xsl:template>
Эти шаблоны выведут на странице /vyborka/ (с pageId = '89') список всех элементов справочника с id = 817 в строчку, причем каждый их элементов будет представлять из себя ссылку вида /rezultat/?gorod=27539
Теперь зададим шаблоны для вывода нужной выборки:
<xsl:template match="result[@pageId = '90']"> <xsl:apply-templates select="document(concat('usel://goroda-res/',$gorod))/udata" mode="goroda-res" /> </xsl:template> <xsl:template match="udata" mode="goroda-res" > <xsl:apply-templates select="page" mode="goroda-res" /> </xsl:template> <xsl:template match="page" mode="goroda-res" > <a href="{@link}"><xsl:value-of select="name" /></a> </xsl:template>
Эти шаблоны выведут на странице /rezultat/ (с pageId = '90') ту или иную выборку объектов каталога в зависимости от того, какой параметр будет присутствовать в адресной строке. Параметр у нас будет браться из ссылок на странице /vyborka/
Необходимо создать три файла: gorod.xsl нужно положить в /xsltTpls/ и подключить к основной таблице с помощью инструкции <xsl:include href = "gorod.xsl"> goroda.xml и goroda-res.xml нужно положить в usels.
Жирным выделены id , которые нужно будет изменить в соответствии с id в вашей системе.
За написание этой статьи мы приносим особую благодарность Дмитрию Неуймину