Здравствуйте. Помогите пожалуйста разобраться с XSLT шаблонами.
Я в целом только изучаю систему и разбираюсь, поэтому могу сильно ошибаться. Пожалуйста, поправьте если что.
На примере одного конкретного макроса я пытаюсь понять как в целом взаимодействовать с системой.
Сейчас в голове такая картина:
Для добавлении функционала какого-либо из модулей, нужно найти его описания
http://help-dev.umi-cms.ru/. Найти макрос, который реализует нужный функционал. Если макрос должен выводить информацию – пишем шаблон <xsl:template match="udata[@module = 'МОДУЛЬ'][@method = 'метод']">, затем пишем шаблон для элементов item данного макроса. Если макрос связан с вводом инфы - точно так же <xsl:template match="udata[@module = 'МОДУЛЬ'][@method = 'метод']">, в описание шаблона создаём <form> </form>. К примеру, <form name="frm_editblogmsg" method="post" action="/blogs20/postEdit/{$post/pid}/do/" onsubmit="site.forms.data.save(this); return site.forms.data.check(this);"> отправляет новый пост.
Проясните пожалуйста 1) откуда взялась инфа action, что делает …/do (интуитивно тут понятно, с фигурными скобками тоже ясно) 2) onsubmit – интуитивно понятно, что сохранить формы сайта, но хочется более подробно вчитать про такие конструкции.Поставил такую задачу: тестовый демо-сайт demodizzy. Нужно добавить возможность пользователям создавать СВОИ блоги и видеть в users/settings созданные блоги. Использовать XSLT шаблоны.
1)Изучив документацию, я пришёл к выводу, что за добавление своих блогов отвечает %blogs20 editUserBlogs()%.
Первый трабл - Я не могу понять, как вставить TPL шаблон в %blogs20 editUserBlogs()% XSLT.
Выполняю в адресной строке udata/blogs20/editUserBlogs – получаю XML, где вижу список имеющихся блогов(скрин не делаю, ничего необычного). Выполняю blogs20/editUserBlogs – получаю Debug message for UC-pages
http://my.jetscreenshot.com/12061/20120529-xx4u-80kb.jpg. Это говорит о том, что в шаблоне не описано как обрабатывать вызов этого модуля и метода. Добавляю в файл Default.xsl
<xsl:template match="result[@module = 'blogs20'][@method='editUserBlogs']" >
<xsl:apply-templates select="document('udata://blogs20/editUserBlogs')" />
</xsl:template>
Теперь я получаю XML в теле сайта.
http://my.jetscreenshot.com/12061/20120529-hmme-114kb.jpgИмеющийся вопросы: 1)Почему он не преобразовывается в HTML ?
Попытка ответа: Потому что нет описания для этого, необходимо добавить обрабатывание этой раздачи, т.е. шаблонизатор для module="blogs20" method="editUserBlogs", должен быть шаблон.
disable-output-escaping="yes" тут не причём, это экранирование тегов, если уже готовый HTML выдаётся.
Я правильно понял ?
2) Смотрю как организован просмотр блогов. Предположим, я хочу добавить новое поле для блога. Добавляю поле, тип число. Просматриваю через сайт– его нет. Дописываю к адресу поста блога .xml – вижу, что новое поле таки формируется XML документом.
http://my.jetscreenshot.com/12061/20120529-avhz-114kb.jpgВ голове появляется тень мыслей 1) выводятся только конкретные статичные поля 2) нужно ковырять как и где выводятся
Начинаю смотреть по коду, как организовывается вывод поста блога. Нахожу такую строчку –
<xsl:value-of select="document(concat('udata://blogs20/postView/',$document-page-id))/udata/content" disable-output-escaping="yes" />
concat('udata://blogs20/postView/',$document-page-id) это грубо говоря udata://blogs20/postView/95/ если 95 ID поста блога, а что возвращает в этом случае всё выражение с дописанном в конце document(…udata/content) ?
Ткните пожалуйста в читалку, это реальный пробел в моих знаниях, а голова уже кругом.Анализируем дальше… udata://blogs20/postView возвращает пост без нового поля, которое я сам создал.
http://my.jetscreenshot.com/12061/20120529-coat-105kb.jpgВопрос: Как сделать так, что бы возвращались все поля ?Я попробовал искать, где же уже есть подобный механизм… Нашёл в emarket/personal/ в персональной информации.. Смотрю код - ссылается на users/settings: <xsl:apply-templates select="document('udata://user/settings')" />. Нахожу код этого фрагмента:
<xsl:template match="udata[@method = 'settings']">
<form enctype="multipart/form-data" method="post" action="{$lang-prefix}/users/settings_do/" id="con_tab_profile">
<div>
<label>
<span>
<xsl:text>&login;: </xsl:text>
</span>
<input type="text" name="login" class="textinputs" disabled="disabled" value="{$user-info//property[@name = 'login']/value}" />
</label>
</div>
…… убеждаемся, что тут всё прописано статично – вот логин вывелся, &login;, что бы на разных языках подмена была… дальше статинчные поля… а вот поле расширенная информация – не статично, т.е. добавив в типе данных новое поле – оно тут появляется.
<xsl:apply-templates select="document(concat('udata://data/getEditForm/', $user-id))" />
В data/common-edit-form.xsl находим <xsl:template match="udata[@method = 'getCreateForm' or @method = 'getEditForm']"> и смотрим каким образом выводятся эти поля, которые мы добавляем сами. В файле data/properties.xsl понимаем, что там просто вычисляются значения этих полей и выводятся. <xsl:template match="property|fields/field//value">
<xsl:value-of select="value" />
</xsl:template>
Неужели для того, что бы автоматом выводить новые поля блога, придётся столько раскопать и сделать ? Пусть в стоящей предомной задаче это и не нужно, но в целях углублённой экскурсии в UMI CMS лишним не будет..