UMIhelp

Разработка сайта на UMI.CMS => JS и AJAX => Тема начата: alex от 21 Апреля 2011, 08:16:28

Название: Меню JS+AJAX и все это на XSLT
Отправлено: alex от 21 Апреля 2011, 08:16:28
Создал тему в этом разделе, т.к. прежде всего тут будет AJAX, однако как реализовать вывод в xslt в моем случае я не знаю.
Итак..XSLT шаблонизатор.

Есть три справочника. Страны, города, улицы.
Сначала выводим страны из справочника стран - это смог,
<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'e).
И снова после выбора уже города, заменяем список городов списком улиц уже из третьего справочника.

Впринципе, будь это все на php с выборкой из базы, я бы справился (просто уникальный $id ссылкам, вывод, ajax ) сделал бы...но тут, ПРОШУ ПОМОЩИ!
Название: Re:Меню JS+AJAX и все это на XSLT
Отправлено: admin от 21 Апреля 2011, 17:32:59
подгружаемые списки... это интересная задача,

Несколько вопросов, от которых зависит способ реализации

у вас есть спискок стран, спискок городов (это один список со всеми городами всех стран или это отдельные списки ,в которых каждый список относиться только к одной стране),  тот же вопрос про улицы

списки находяться на одной странице? подгружаются  динамически?(то есть выбрал я страну подгрузились города)

я так понимаю есть объекты в системе (назовем их домами), которые имеют определенное значение города, страны и улицы и после этих списком мы увидим все объекты соответсвующие данному выбору, так?

если где-то ошибка опишите подробнее, как будет происходить механизм взаимодействия пользователя и этих списков, если есть скриншот, только в плюс
Название: Re:Меню JS+AJAX и все это на XSLT
Отправлено: alex от 21 Апреля 2011, 22:28:34
ДА! Вы все правильно написали. самый сложный вариант походу.

Есть пост блога, при добавлении выбирается три обязательных параметра: страна, город и улицы.
Для каждой страны свои города, для города каждого свои улицы.

На странице отображается список стран. При клике подгружается и отображается список городов (элементов справочника). При клике по городу подгружается список улиц (ну города скроются средствами jquery).

И, наконец, при клике по улице отображается кокретных пост (пускай про улицу описание или типа того), параметры которого совпадают с выбранными.

Еще раз повторюсь, что списки - просто элементы справочников, и еще в налиции посты с параметрами.


P.S. думал сегодня пару часов, но моих знаний о xslt явно не хватает (((
Название: Re:Меню JS+AJAX и все это на XSLT
Отправлено: admin от 21 Апреля 2011, 23:02:02
Цитировать
Для каждой страны свои города, для города каждого свои улицы.
вот тут я не совсем понял, все таки справочник с городами в системе один или их много и если много как вы их в админке размещаете?

Вообще делаете проще, у каждого блога есть 3 справочника, страна, город и улица.
При создании поста выбираете из имеющихся нужную страну, город и улицу (если таковых нет добавляете в список). Это все админская часть

Дальше, на сайте выводите форму со странами, при выборе какойто страны, вызываете ajax функцию выборки usel что то типа "выбрать все посты у которых такая же страна и вывести их списком отсортировав по названию города", этот вызов будет выглядеть примерно так, в параметр url ajax запроса прописываете usel запрос типа http://ваш_сайт/usel/Ваш_файл_выборки.json , результаты обрабатываете js и получаете справочник городов, потом такой же финт ушами с улицами

примечание:
1. почитать про json результат макросов можете тут http://wiki.umisoft.ru/%D0%9A%D0%B0%D0%BA_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D1%82%D1%8C_%D1%81_AJAX
2. Так как содержимое справочников будет формироваться динамически, а события на выбор (например города) вы будете прописывать сразу, то стоит учесть что jQuery обработчик выбора элемента списка, которого еще нет можно сделать при помощи функции jQuery.live посмотрите в интернете

ну и когда пользователь выбирает улицу ajax запрос подгружает все посты которые попадают под выбранные страна, город, улица и опять же js выводяться результаты.

Это если без перезагрузки делать.

Это механизм я опробовал сам, были варианты делать прямые обращения к базе, что повысило бы скорость обработки ajax запросов, но выигрыш в скорости не намного и для меня sql всегда головная боль)

советую для начала отписать просто страничку с голым html, то есть подключить к какой-нибудь тестовой странице тестовый tpl шаблон, в нем сделать рабочий механизм, а потом перенести его на xslt , чтобы было проще отслеживать откуда ноги растут, если что не так пойдет
Название: Re:Меню JS+AJAX и все это на XSLT
Отправлено: alex от 26 Апреля 2011, 22:05:11
Цитировать
выборки usel что то типа "выбрать все посты у которых такая же страна и вывести их списком отсортировав по названию города"
С json разобрался маленько, только вот нигде не нашел как в формате usel'ов делать фильтры всякие (посты соответствующие запросу), или в самом запросы <xsl:/> тоже не нашел.
Есть какой-нибудь пример?
Название: Re:Меню JS+AJAX и все это на XSLT
Отправлено: admin от 26 Апреля 2011, 22:19:46
usel выборки немного задел тут   %data doSelection()% и как передать ему параметр из адресной строки (http://umihelp.ru/219/data-doselection-%D0%B8-%D0%BA%D0%B0%D0%BA-%D0%BF%D0%B5%D1%80%D0%B5%D0%B4%D0%B0%D1%82%D1%8C-%D0%B5%D0%BC%D1%83-%D0%BF%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80-%D0%B8%D0%B7-%D0%B0%D0%B4%D1%80%D0%B5/) в частности пример xml файлы для выборки можете там посмотреть

а вообще описание usel ищи тут http://help-dev.umi-cms.ru/chapter.XSLTTemplates.usel.html

если будет совсем непонятно пиши подскажу
Название: Re:Меню JS+AJAX и все это на XSLT
Отправлено: alex от 27 Апреля 2011, 16:13:11
Хм..посмотрел...у меня XML есть, по выборке списка справочника...я понял как туда парамерт передается {1} например...и понял что сделать...только напортачил небось,т.к. не работает...

запрос:
<xsl:apply-templates select="document(concat('usel://guide/',123))/udata/item"  mode="guide.list"/>
usel:
<?xml version="1.0" encoding="utf-8"?>
<selection>
    <target result="objects">
        <property name="gruppa" value="Легковые автомобили"/>
        <type id="{1}" />
    </target>
</selection>
Выбирает все,а надо только один пост (где я выбрал легковые)
Название: Re:Меню JS+AJAX и все это на XSLT
Отправлено: admin от 27 Апреля 2011, 16:20:51
частая проблема

1. тег property располагается ниже тега target
2. так как поле gruppa у вас скорее всего выпадающий список, надо использовать немного другую форму записи для тега property (в документации описанно http://help-dev.umi-cms.ru/chapter.XSLTTemplates.usel.html)

то есть примерно так он должен выглядеть

<?xml version="1.0" encoding="utf-8"?>
<selection>
    <target result="objects">
        <type id="{1}" />
    </target>
   <property name="gruppa">
       <object>26564</object>
   </property>
</selection>

где 26564 это id элемента справочника "Легковые автомобили"
Название: Не хочу новую тему создавать...
Отправлено: alex от 27 Апреля 2011, 17:45:56
Вобщем я разобрался с шаблонами данных,но не до конца.
Кстати поражаюсь удобности ЮМИ.
Есть пост, есть шаблон, и при добалении поста в блог у меня те поля выводятся к заполнению, которые в шаблоне...
НО! как сделать, чтобы при добавлении постов в разные разделы (или блоги, всеравно, главное в разные), был и разный шаблон?
И как еще это к пользователям подвязать? Привилегии вроде где какой пользователь может что добавлять?
Название: Re:Меню JS+AJAX и все это на XSLT
Отправлено: admin от 27 Апреля 2011, 17:50:49
сделать проверку в самом главном template на то в каком разделе находиться данный пост и подгружать разные шаблоны
Название: Re:Меню JS+AJAX и все это на XSLT
Отправлено: alex от 27 Апреля 2011, 17:58:03
не понял...мне нужно в админке чтобы для разных разделов(блогов) разные шаблоны добавления были
Название: Re:Меню JS+AJAX и все это на XSLT
Отправлено: admin от 27 Апреля 2011, 18:02:34
а, то есть разные поля? тогда создаешь подтипы в шаблоне данных и добавляешь то что тебе надо, а при создании поста у тебя появиться выбор к какому типу данных их относить, там и будешь выбирать к каждой странице
Название: Re:Меню JS+AJAX и все это на XSLT
Отправлено: alex от 27 Апреля 2011, 19:12:53
А подробнее можно про подтипы?

И вот основное:
покопался в инете (http://xmlhack.ru/books/xslt/ch_11_05.html#ch_11_05_01)
и нашел циклы для xslt

НО НЕ ЗНАЮ КАК ОБРАЩАТЬСЯ!!!

это код самого скрипта, насколько я понял:
<xsl:template name="while">
  <xsl:param name="i"/>
  <xsl:param name="result"/>
  <xsl:choose>
    <xsl:when test="$i != 0">
      <xsl:call-template name="while">
        <xsl:with-param name="i" select="$i - 1"/>
        <xsl:with-param name="result" select="$result * $i"/>
      </xsl:call-template>
    </xsl:when>
    <xsl:otherwise>
      <xsl:value-of select="$result"/>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

это шаблон вывода результата скрипта:
<xsl:template match="/" mode="guide.while">
  <xsl:call-template name="while">
    <xsl:with-param name="i" select="6"/>
    <xsl:with-param name="result" select="1"/>
  </xsl:call-template>
  <xsl:value-of select="$result"/>
</xsl:template>
P.S. mode="guide.while" прописал сам,по аналогии со справочником..

НО!! как к нему обратиться из другого места страницы???

например мы делали так для справочника:
<xsl:apply-templates select="document('usel://guide/45/508')/udata/item"  mode="guide.list"/>

тут тоже апли темплэйтс будет, но как именно писать их для моего случая? подскажи, я по аналогии уже разберусь и дальше.
Название: Re:Меню JS+AJAX и все это на XSLT
Отправлено: admin от 27 Апреля 2011, 19:16:44
далеко не самый лучший способ, такая структура в чыде это перенос работы php в чыде, много ресурсов съест, чего в результате хочешь добиться? что у тебя есть и что тебе надо получитьт при помощи этого цикла?
Название: Re:Меню JS+AJAX и все это на XSLT
Отправлено: alex от 27 Апреля 2011, 19:25:00
Да чтоюы ссылки уник.id задать....но...Пока писал это сообщение в голову пришла мысль по поводу того,как отличать ссылки (для JS), чтобы по ним ajax делал выборку...но стопорнулся и сейчас вообще туплю сижу....

Мне нужно чтобы вывелся список стран ( :D) и JS при клике через ajax подгрузил какойнибудь определенный usel (ну json)..чтото пока никак
Название: Re:Меню JS+AJAX и все это на XSLT
Отправлено: admin от 27 Апреля 2011, 19:29:34
в списке у каждого элемента уже есть уникальный id

тебе надо только jquery отследить событие onchange. Как узнать выбранный элемент в списке ищи тут http://www.webnotes.com.ua/index.php/archives/699

или вот даже с примером навешивания функции на событие onchange списка http://www.webnotes.com.ua/index.php/archives/815
Название: Итак)))
Отправлено: alex от 30 Апреля 2011, 20:43:53
Вот что имеется:

Запрос /usel/guide/45/508 формируется автоматически в скрипте, в зависимости от кликнутой ссылки.

Вот сам json
{
"item": {
"0": {
"id": 512,
"guid": "",
"name": "Обыкновенный грузовик",
"type-id": 45,
"ownerId": 9,
"href": "/uobject/512.json"
}
},

"total": 3
}

Пришлось кстати убрать в самом движке юми генерацию строки this page generated in seconds в конце файла json...изза этой строки блин мучался целый час,думал скрипт не тот.

Вот сам скрипт обработки, он мне возвращает правильные значения total
$.getJSON(strings, {}, function(json){
                        $('#block1').html('');
                        $('#block1').append('Name: '   + json.total + '<br/>');
                    });

Но если мне нужны другие значения, то я ничего не могу поделать.
Строку
('#block1').append('Name: '   + json.item.0.name + '<br/>');
JS просто не воспринимает!!
item.1 - выделяется красным, дальше все хуже...короче не стоит типа использовать слово item, оно какбы системное чтоли..
НО Я НИЧЕГО НЕ МОГУ ПОДЕЛАТЬ, UMI ВЫДАЕТ СПИСОК ИМЕННО В ФОРМАТЕ item>номер>параметр

Как правильно прописать строку
$('#block1').append('Name: '   + json.item.0.name + '<br/>');
Чтобы заработало???

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>РАЗОБРАЛСЯ
json.item[0].name