UMIhelp

Разработка дополнительного функционала => Custom макросы => Тема начата: alex от 16 Апреля 2011, 22:59:54

Название: Вывод всех значений конкретного справочника
Отправлено: alex от 16 Апреля 2011, 22:59:54
Вот уже который день пытаюсь понять, почему не работает вывод всех значений конкретного справочника..

http://umi-cms.spb.su/api/167/215/ и другие,похожие,туториалы проштудировал уже....

ТЕМ НЕ МЕНЕЕ, если через контент страницы использую %custom getGuideList(115)% (115-как раз ид моего справочника), то все работает НА УРА!,

но

если пытаюсь подключить в xsl (мне в файле шаблона требуется вывести) черех <xsl:value-of select="document(concat('udata://custom/getGuideList/',115))/udata" />
то почему-то вместо списка у меня слова array в количестве элементов списка...что делать ума не приложу!

Помогите, пожалуйста!

P.S.собственно цель моих мучений - нужно просто получить список всех значений справочника, их идентификаторы и сгенерировать ссылки.но все это делается не в контенте, а в меню + js еще.так что куда вставить %макрос% в xsl шаблоне даже не знаю..)
Название: Re:Вывод всех значений конкретного справочника
Отправлено: admin от 17 Апреля 2011, 00:09:05
))дело в том что этот скрипт подходит для tpl шаблонизатора, а в xslt он не нужен.

у вас есть id объекта справочник равный 115. Воспользуйтесь протоколом uobject (для того чтобы посмотреть что вернет этот протокол относительно вашего справочника вбейте в адресную строку http://ваш_сайт/uobject/115)

соответсвенно в шаблоне  вы прописываете <xsl:apply-templates select="document(concat('uobject://',115))/udata" />

и используя отдельный template в чыде выводите результат.

Если не получается или не понятно, пришлите сюда содержимое xml, которое выдаст система при запросе http://ваш_сайт/uobject/115, а напишу как должен выглядеть типичный template для вывода элементов списка (имен и id)
Название: Re:Вывод всех значений конкретного справочника
Отправлено: alex от 17 Апреля 2011, 11:24:06
Пытался пробывать через USEL, но понял, что это далеко не самый простой вариант.

При запросе в строку браузера http://site/uobject/115 выдается следующее:

<udata xmlns:xlink="http://www.w3.org/TR/xlink" generation-time="0.001959">
<object id="115" guid="sytem-citylist-26993" name="Норильск" type-id="14" ownerId="9"/>
</udata>

Какойто город из системного списка. погуглив про Uobject понял, что могут быть еще много доп.параметров, может как-нибудь указать, что id именно справочника, а не вообще в системе?
Т.к. при редактировании справочника урл какраз с ид 115 ---> http://localhost/admin/data/guide_items/115/

Еще раз повторюсь, что мне нужно:
1)Выводится по шаблону (как раз научусь их делать) список всех элементов справочника в виде ссылок с использованием их идентификаторов
2)при переходе на страницу делается выборка уже из другого справочника, в зависимости от id предыдущего.
3)в итоге мы попадаем на страницу, где находится запись (пост) с подходящими id (например первый раз мы выбрали россия,затем москва, и центральный район. попали на запись поста,где при добавлении указали именно эти поля в выпадающих списках.)

Вот еще что понял....
http://site/admin/data/guide_items/115/ так выглядит ссылка на редактирование всего справочника.тоесть id справочника 115.
Когда я редактирую все элементы, то тоже вижу ссылки на каждый, например
http://site/admin/data/guide_item_edit/377/
http://site/admin/data/guide_item_edit/378/
http://site/admin/data/guide_item_edit/379/
Вот какраз если вводить id конкретного элемента справочника в uobject,то все правильно выдает,

http://site/uobject/377
<udata xmlns:xlink="http://www.w3.org/TR/xlink" generation-time="0.001194">
<object id="377" name="Россия" type-id="115" ownerId="9"/>
</udata>

Где type-id какраз id нашего справочника. Подозреваю, что казывать будем както в запросе <xsl/>.

Вопрос: Как указать в uobject type-id?
Название: Re:Вывод всех значений конкретного справочника
Отправлено: admin от 17 Апреля 2011, 14:58:45
да вы правы, справочник это не объект, в смысле, через него нельзя вытащить его содержимое, нужно делать выборку ищя все объекты, type-id у которых равен id справочнику. В кастомном макросе getGuideList это делает функция getGuidedItems, ну а мы сделаем это usel выборкой

Подробное описание читайте в статье http://umihelp.ru/310/guide-list-usel-xslt/ (http://umihelp.ru/310/guide-list-usel-xslt/)

насчет пунктов 2 и 3 из того что вам нужно, думаю вы разберетесь зная как выводить справочник вы сможете подставить id справочника и на второй сстранице и вывести потом результативный пост
Название: Re:Вывод всех значений конкретного справочника
Отправлено: alex от 17 Апреля 2011, 15:52:43
Снова проблемы...создал guide.xml в папке Usels. Все пашет, т.е. запрос http://site/usel/guide/115 выдает мне список из справочника.

Вставка в шаблон кода <xsl:apply-templates select="document(concat('usel://guide/',115)/udata/item" mode="guide.list"/>(1)  ниче не дала.

Что тут означает mode="guide.list", и почему ничего об этому не указано в самом guide.xml, и соответственно для чего вообще нужно писать mode='' ?

Когда я вставил в шаблон код 
<xsl:template match="udata/item"  mode="guide.list">
    <xsl:param name="guide-list-id" select="@id" />
    <xsl:param name="guide-list-name" select="@name" />
    object_id="<xsl:value-of select="$guide-list-id" />" object_name=<xsl:value-of select="$guide-list-name" /><br/>
</xsl:template> (2)
естественно ниче не заработало,пустая страница.
1.Код (1) нужно вообще вставлять перед (2) ??
2.Что в коде (2) нужно изменить?
3.Откуда в xslt беруться (задаются) переменные,как в php (например в коде (2) переменные $guide-list-id и $guide-list-name ?
4.А что такое @id и @name.Тоже переменные получается, со знаками @ перед ними.,Что означают?

Буду очень благодарен, если вы поможете мне разобраться в этих шаблонах и переменных!
Название: Re:Вывод всех значений конкретного справочника
Отправлено: admin от 17 Апреля 2011, 16:37:14
mode="guide.list" это что то вроде именования шаблона. Он упоминается при вызове обработчика контента xsl:apply-templates , а также в самом шаблоне для обработки контента <xsl:template match="udata/item"  mode="guide.list">
Примечание: так как шаблонов для обработки одного и тогоже контента может быть много их различают через параметры тега template http://www.w3schools.com/Xsl/el_template.asp (http://www.w3schools.com/Xsl/el_template.asp)
Цитировать
Вставка в шаблон кода <xsl:apply-templates select="document(concat('usel://guide/',115)/udata/item" mode="guide.list"/>(1)  ниче не дала.

проверте внимательно количество скобок и других спец символов если у вас в коде тоже самое что и в сообщении то код неверно написан, пропустили скобку надо так
<xsl:apply-templates select="document(concat('usel://guide/',115))/udata/item" mode="guide.list"/>

последовательность шаблонов и вызова этого шаблона не важна, хотя обычно я вставляю в файл шаблона вызываемый шаблон ниже его вызова (для удобства поиска)

Цитировать
2.Что в коде (2) нужно изменить?
зависит от того что вы хотите получить если хотите ссылку на страницу с параметром в адресной строке (я такое использую иногда), то ваш шаблон будет выглядеть
<xsl:template match="udata/item"  mode="guide.list">
    <xsl:param name="guide-list-id" select="@id" />
    <xsl:param name="guide-list-name" select="@name" />
    <a href="result_page?id={$guide-list-id}">object_name=<xsl:value-of select="$guide-list-name"/></a><br/>
</xsl:template>
Цитировать
3.Откуда в xslt беруться (задаются) переменные,как в php (например в коде (2) переменные $guide-list-id и $guide-list-name ?
Вообще для развернутого ответа лучше читайте документацию по xslt, например на странице Ссылки (http://umihelp.ru/links/) есть подборка xslt материалов. Но в данном случае мы объявляем переменные через тег <xsl:param /> указываем его имя через аттрибут name (для вызова используем имя со знаком $ перед ним), а через аттирбут select указываем что в этот параметр внести (в частности мы вносим аттрибут id тега udata/item. см тот xml который получил  вбив в адресную строку http://site/usel/guide/115

Наверно путанно, но xPath не объяснить на пальцах в 4 строчках)



Название: Re:Вывод всех значений конкретного справочника
Отправлено: alex от 17 Апреля 2011, 17:44:55
Все, что вы написали, я понял.вроде)

Когда оставляю только
<xsl:apply-templates select="document(concat('usel://guide/',115))/udata/item" mode="guide.list"/>
снова не пашет, просто пусто. А если убираю до
<xsl:apply-templates select="document(concat('usel://guide/',115))/udata/item" />
то выдает вполне нормальный список..

И даже немного разобрался.


2.Однако никак не могу понять,почему не пашет ваш вариант с длинным кодом???

это часть grid.xsl
<div id="center">
<xsl:apply-templates select="document(concat('usel://guide/',115))/udata/item" mode="guide.list"/>
<xsl:template match="udata/item"  mode="guide.list">
      <xsl:param name="guide-list-id" select="@id" />
       <xsl:param name="guide-list-name" select="@name" />
       <a href="result_page?id={$guide-list-id}">object_name=<xsl:value-of select="$guide-list-name"/></a><br/>
</xsl:template>
</div>

а это guide.xml
<?xml version="1.0" encoding="utf-8"?>
<selection>
    <target result="objects">
        <type id="{1}" />
    </target>
    <sort order="{3}">{2}</sort>
</selection>


Вот опять по отдельности все работает, а вместе ну никак не хочет!

Не обрабатывается ничего((( пустая страница блин(

Уже голова кругом, но осилить нужно..
Название: Re:Вывод всех значений конкретного справочника
Отправлено: admin от 17 Апреля 2011, 17:57:24
а
<xsl:template match="udata/item"  mode="guide.list">
      <xsl:param name="guide-list-id" select="@id" />
       <xsl:param name="guide-list-name" select="@name" />
       <a href="result_page?id={$guide-list-id}">object_name=<xsl:value-of select="$guide-list-name"/></a><br/>
</xsl:template>

у вас внутри другого
<xsl:template >
      ...
</xsl:template>
??
если так, то поэтому и не работает, так как каждый шаблон должен быть отдельно прописан, напишите его ниже любого </xsl:template>
Название: Re:Вывод всех значений конкретного справочника
Отправлено: alex от 17 Апреля 2011, 18:25:37
Юхху!! наконец-то заработало! теперь понял к чему тут mode нужен был!!
Вобщем пока буду дальше делать, скоро с новыми проблемами сюда же обращусь)))
Спасибо!

----------------------------------------------

А можно ли такое делать, как в php. Чтобы при заполнении ссылками (по шаблону) у каждой из них цифра менялась...мм аналогия:

в php я мог бы сделать так
for ($i=0; $i<10(пускай 10); $i++)
{
echo "<a href='' id='".$i."'>ссылка</a>";
}

в xml у нас написано
<a href="result_page?id={$guide-list-id}"><xsl:value-of select="$guide-list-name"/></a>

и нужно чтобы у каждой ссылки вписывался уникальный id
<a href="result_page?id={$guide-list-id}" id="тут каждый раз +1"><xsl:value-of select="$guide-list-name"/></a>

если в xml никак нельзя, то как сделать?
Смысл в том, чтобы я мог из JS обращаться к каждой ссылке по ее уникальному id (ну наприме id="link1" id="link2" и т.д.)  

Хотя бы укажите куда копать..)
Название: Re:Вывод всех значений конкретного справочника
Отправлено: admin от 22 Апреля 2011, 23:00:09
ну.... вместо уникального id который как счетчик увеличивается на 1 можете использовать $guide-list-id это id объекта в системе он уникален. То есть получиться
<a href="result_page?id={$guide-list-id}" id="{$guide-list-id}"><xsl:value-of select="$guide-list-name"/></a>

Если же нужен именно id типа от 1 до ..., то делаешь так

получаем список справочника таким образом
<xsl:apply-templates select="document(concat('usel://guide/',115)/udata" mode="guide.list"/>

он вернет нам чьд со всеми шеуь у которых есть свой номер (по порядку проставленный от 1 и далее, типа номер узла в xml результате)

обрабатываем этот список таким шаблоном (в нем мы передаем позицию данного элемента в xml документе)

<xsl:template match="udata"  mode="guide.list">
      <xsl:apply-templates select="item" mode="guide.list">
             <xsl:with-param name="pos" select="position()"/>
     </xsl:apply-templates>     
</xsl:template>

<xsl:template match="item"  mode="guide.list">
       <xsl:param name="pos" />
       <xsl:param name="guide-list-id" select="@id" />
       <xsl:param name="guide-list-name" select="@name" />
      <a href="result_page?id={$guide-list-id}" id="{$pos}"><xsl:value-of select="$guide-list-name"/></a>
</xsl:template>

опять же не проверял, писал сходу, но все должно быть ок)