Подборка разработчиков как на umi-cms.ru

Материал из Umicms
Перейти к:навигация, поиск

Задача:
Необходимо организовать подбор разработчиков, как на сайте на 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 в вашей системе.

За написание этой статьи мы приносим особую благодарность Дмитрию Неуймину