действительно направление поиска очень интересное, радует что люди лезут в суть, хотя и временин а это придется убить больше) Насчет написанных вопросов...
1. К примеру, <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 – интуитивно понятно, что сохранить формы сайта, но хочется более подробно вчитать про такие конструкции.
action проставлен в шаблон, так как создатели шаблона заранее знают куда надо отправить форму, чтобы произошло нужное действие (сохранение редактируемого блога). Для того, чтобы система знала какой блог редактируется надо передать его id, что и достигается за счет динамической подстановки значения $post/pid, а фигурные скобки нужны чтобы система поняла что сюда надо подставить значение из переменной post (которая определяется где-то выше) и взять из этой переменной узел pid.
do подставляется в action как дополнительный параметр к макросу %blogs20 postEdit()%. Если ты заглянешь в код данной функии (или макроса в терминологии umi) в файле /classes/modules/blog20/class.php , то увидишь там (найдя функцию public function postEdit) такой кусочек
if(!$postId) {
$iTmp = getRequest('param0');
if($iTmp) {
$postId = $iTmp;
} else {
$this->redirect(getServer('HTTP_REFERER'));
}
}
он подтягивает значение id текущего сообщения из param0. Param0, param1 и т.д это значения из строчки вызова макроса /модуль/метод/param0/param1
Там же ниже ты увидишь кусок кода начинающийся со строк...
if(getRequest('param1') == 'do') {
....
вот если if срабатывает , то выполняется блок отвечающий за сохранение изменений
onsubmit это событие которое срабатывает при отправке почты, как ты правильно заметил, оно нужно чтобы если при заполнении формы что-то пользователь не заполнил из обязательного или заполнил не верно и его выкинуло обратно, значения которые он заполнял не обнулились а восстановились из куков или сесси (уже не помню точно). Это просто js функции, их ты можешь посмотреть в файле /js/site/form.js, файл этот ты в подключаемых не увидишь, так как он подключается файлом /js/site/__common.js (заглянув в конец этого файла поймешь о чем я)
2. Я не могу понять, как вставить TPL шаблон в %blogs20 editUserBlogs()% XSLT
tpl не надо встраивать в xslt это разные шаблоны. Надо просто создать свой xslt шаблон если он отсутствовал в demodizzy или если ты делаешь шаблон с нуля (для начала разбирательств лучше конечно разбираться с demodizzy)
Выполняю blogs20/editUserBlogs – получаю Debug message for UC-pages http://my.jetscreenshot.com/12061/20120529-xx4u-80kb.jpg. Это говорит о том, что в шаблоне не описано как обрабатывать вызов этого модуля и метода.
Все верно только ты позже создаешь шаблон для страницы
<xsl:template match="result[@module = 'blogs20'][@method='editUserBlogs']" >
<xsl:apply-templates select="document('udata://blogs20/editUserBlogs')" />
</xsl:template>
то что это шаблон для страницы, можно понять из того что у тебя match начинается с result узла. Result узелвстречается только в xml страниц, а не в результатах работы макроса (через протокол udata), протоколов upage, uobject, usel. В итоге у тебя есть шаблон для страницы которая возвращает result с @module = 'blogs20' и @method='editUserBlogs', и в этом шаблоне ты делаешь вызов макроса через протокол udata.... и тут момент, а где шаблон для вывода результатов макроса udata/blogs20/editUserBlogs для них надо тоже создать шаблон... что-то вроде то что проиcходит для макроса %blogs20 postEdit()%
<xsl:template match="udata[@module = 'blogs20'][@method = 'postEdit']">
<xsl:variable name="post" select="document('udata://blogs20/postView/')/udata" />
<xsl:copy-of select="$post" />
<div class="add_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);">
<div class="form_element">
<label class="required">
<span><xsl:text>Тема:</xsl:text></span>
<input type="text" name="title" class="textinputs" value="{$post/name}"/>
</label>
</div>
<div class="form_element">
<label class="required">
<span><xsl:text>Сообщение:</xsl:text></span>
<textarea name="content"><xsl:value-of select="$post/content" disable-output-escaping="yes" /></textarea>
</label>
</div>
<div class="form_element">
<input type="submit" class="button" value="Сохранить" />
</div>
</form>
</div>
</xsl:template>
<xsl:template match="udata[@module = 'blogs20'][@method = 'postEdit'][error]">
<xsl:apply-templates select="error" />
</xsl:template>
3. disable-output-escaping="yes" тут не причём, это экранирование тегов, если уже готовый HTML выдаётся
Да, все верно
4. Начинаю смотреть по коду, как организовывается вывод поста блога. Нахожу такую строчку –
<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) ?
<xsl:value-of select="document(concat('udata://blogs20/postView/',$document-page-id))/udata/content" disable-output-escaping="yes" /> делает следующее... получает через concat подстановку динамически формируемой переменной $document-page-id содержащей id текущей страницы (допустим она равна 95) и получаем строчку udata://blogs20/postView/95. Данyая строчка попав в атрибут document (вот так она выглядит - document('udata://blogs20/postView/95') ) вернет результат обращения к макросу %blogs20 postView(95)%. Далее к полученному xml (можешь просмотреть его отдельно чтобы понять что дальше происходит или заглянуть в документацию http://help-dev.umi-cms.ru/blogs20.postView.html#xsltDesc) применяют обычную выборку... вернее сказать берут из этого xml узел /udata/content, то есть содержимое поля content и так как поле контент содержит html теги чтобы их не экранировало добавляют disable-output-escaping="yes" атрибут
Для того чтобы вывести любое поле какой-то страницы, ты всегда можешь обратиться через протокол upage к нужной тебе странице (upage://95 например) и получишь все поля что есть в этой странице. Далее дело техники, просто вытяни его.... Если тебе надо конкретное поле "Новое поле", то в том шаблоне где у тебя стоит <xsl:value-of select="document(concat('udata://blogs20/postView/',$document-page-id))/udata/content" disable-output-escaping="yes" />
пишешь такой вызов <xsl:value-of select="document(concat('upage://',$document-page-id))/udata//property[@name='test']/value" />
P.S. Задача вывода значения произвольного поля из страницы или объекта, это тот басиз который обязательно понадобиться при разработке шаблонов на xslt. Если еще не читали, советую глянуть книгу Данила Кострова (http://www.umi-cms.ru/support/docs/xslt-umi-devbook/) там есть весь необходимый базис касающийся xslt
суть такая... конечно если у вас есть различия между главной и внутренними то надо что-то менять
один вариант менять внутри шаблона выборочные кустrи, или через конструкции xsl:if и xsl:choose, или через создание отдельного шаблона
например первый случай будет выглядеть так
<xsl:template match="/" mode="layout">
<html>
....
<xsl:choose>
<xsl:when test="result/page/@is-default='1'">
блок который выводиться на главной
</xsl:when>
<xsl:otherwise>
блок который выводиться на всех остальных
</xsl:otherwise>
</xsl:choose>
....
</html>
</xsl:template>
этот вариант хорош если таких отличающихся блоков в верстке главной и внутренних немного и их можно локализовать, причем эти отличия не в области вывода контента текущей страницы, а например вывод слайдера на главной, а на внутренних нет, или на главной есть правая колонка, а на внутренних нет... то есть тогда, когда создавать отдельный шаблон будет больше увеличивать количества кода, чем при вставке блоков с условиями
если же у вас куча отличий то стоит уже посмотреть в сторону отдельного шаблона, тогда делаете такой финт
<xsl:template match="/" mode="layout">
<xsl:choose>
<xsl:when test="result/page/@is-default='1'">
<xsl:apply-templates select="." mode="layout_main_page" />
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="." mode="layout_other_page" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="/" mode="layout_main_page">
<html>
...
</html>
</xsl:template>
<xsl:template match="/" mode="layout_other_page">
<html>
...
</html>
</xsl:template>
если же у вас отличия страниц выводятся в области контента, например на странице контактов надо помимо текста страницы контактов еще и вывести карту проезда, то тогда шаблон общий один, мы его не трогаем, а идем в то место где выводяться страницы контента, то есть /xslTpls/modules/content/common.xsl
и пониже шаблона описывающего шаблон для страниц типа content
<xsl:template match="result[@module = 'content']">
<div id="page_{$document-page-id}" umi:element-id="{$document-page-id}" umi:field-name="content" umi:empty="&empty-page-content;">
<xsl:value-of select=".//property[@name = 'content']/value" disable-output-escaping="yes" />
</div>
</xsl:template>
добавляем уточняющий шаблон для страницы контакты (например ориентируясь на то что её id =33)
<xsl:template match="result[@module = 'content' and @pageId=33]">
<div id="page_{$document-page-id}" umi:element-id="{$document-page-id}" umi:field-name="content" umi:empty="&empty-page-content;">
<xsl:value-of select=".//property[@name = 'content']/value" disable-output-escaping="yes" />
</div>
<img src="/images/map.jpg" /> здесь выводим карту проезда, или что там еще надо вывести
</xsl:template>
А не подскажите такой момент:
Структура каталога: Автомобили-Марка-Модель.
В "модель" нужно получить ссылку на "Марка".
Необходимо использовать Upage?
Я пока начал подбираться так - <xsl:value-of select="document(concat('upage://',page/@parentId))"/>
Это я получаю родителя. У родителя
<page id="5" parentId="1" link="/avtomobili/toyota1/" is-active="1" object-id="317" type-id="71" type-guid="catalog-category" update-time="1338539083" alt-name="toyota1">
link="/avtomobili/toyota1/ это то что мне нужно. Как подобраться - не могу понять... Чисто интуитивно понимаю, что нужно полученный результат рассматривать как udata и оттуда вытянуть /page/@link.. Но что-то не выходит
странно что не выходит, ведь все верно описал, в итоге у тебя будет такой код
<xsl:value-of select="document(concat('upage://',page/@parentId))/udata/page/@link" />
Благодарю за ответ. Прошу прощения, действительно верно написано. Походу засиделся вчера.
Утро вечера мудренее.
Думаю, не мне одному понадобиться.. Что бы поиском люди нашли эти вопросы - накидаю теги:
как вывести ссылку на родительскую страницу
Собственно я сформировал так:
<a href="{document(concat('upage://',page/@parentId))/udata/page/@link}" class="a_link"><xsl:value-of select="document(concat('upage://',page/@parentId))/udata/page/name"/></a>
Цели я добился, но не слишком ли извращённый способ ? Или это нормально ?
Каталог, к нему прикреплён фотоальбом. Мне нужно при просмотре объекта каталога вывести фото (jquery карусель). Получаю url таким способом
select="document(concat('upage://',./@id))/udata/page/properties/group[@name='photo_props']/property[@name='photo']/value/@path"/>
Есть плотное ощущение, что нужно копать в сторону %photoalbum photo()% и т.п., но в описании %photoalbum photo()% сказано, что нужно использовать upage или udata... Т.е. обратиться localhost/udata/photoalbum/photo/14 нельзя. Хотя ответ есть, выглядит вот так:
<udata xmlns:xlink="http://www.w3.org/TR/xlink" module="photoalbum" method="photo" generation-time="0.015039">
<id>14</id>
<name>Toyota</name>
</udata>
select="document(concat('upage://',./@id))//property[@name='photo']/value"/>
property[@name='photo'] - property с именем photo одно, полный путь указывать не обязательно.
%photoalbum photo()% описывает отображение фотографии, при жквери этого не нужно. Последний шаблон описывающий миниатюру из album.xsl
<xsl:template match="page" mode="photo_list">
<xsl:variable name="image_full" select="document(concat('upage://',@id))//property[@name='photo']/value" />
<a href="{$image_full}" >
<xsl:call-template name="catalog-thumbnail">
<xsl:with-param name="element-id" select="@id" />
<xsl:with-param name="field-name">photo</xsl:with-param>
<xsl:with-param name="empty">&empty-photo;</xsl:with-param>
<xsl:with-param name="width">95</xsl:with-param>
<xsl:with-param name="height">64</xsl:with-param>
</xsl:call-template>
</a>
</xsl:template>
$image_full - получаем путь к оригиналу(это если оригинал не нужно подганять под размеры)
получаем
<a href="$image_full"><img src="$image_thum" ></a>
вот такой простой у меня слайдер:)
Я ещё не особо хорошо умею работать с переменными, походу самое время изучить.
Благодарю за совет.
Мой слайдер получился так:
<xsl:template match="udata" mode="object-view">
..........
<div id="slides">
<div class="slides_container">
<xsl:apply-templates select=".//group[@name='foto']/property/value" mode="foto"/>
</div>
</div>
</xsl:template>
<xsl:template match="value/page" mode="foto">
<img src="{document(concat('upage://',./@id))/udata/page/properties/group[@name='photo_props']/property[@name='photo']/value}" width="570" height="270"/>
</xsl:template>
Осталось решить вопрос с разрешением изображений и будет норм. :)
У меня ещё не сформировалось окончательно понимание XSLT и порой есть ощущение, что я пишу всякий бред.
У меня есть ощущение, что я неправильно применяю шаблоны, когда мне надо вывести более одного элемента, как в этом случае. Или всё же это правильно ? Изучая демо-шаблоны я натыкался на несколько способов.
<xsl:apply-templates select=".//group[@name='foto']/property/value" mode="foto"/> - применить шаблон к части XML документа где такие proup/@name и т.п.
Далее нужно описать как обрабатывать.
<xsl:template match="value/page" mode="foto"> я написал value/page т.к. меня интересует только @id, которое в самом-самом конце дерева. Можно было написать value и пусть к @id указывать как ./page/@id...
Проапгрейдил карусель, теперь к объекту каталога привязывается альбом и карусель с навигацией.
Может кому поможет, кто поиском забредёт:
Карусель http://slidesjs.com/
<xsl:template match="udata" mode="object-view">
....................
<div id="products_example">
<div id="products">
<div class="slides_container">
<xsl:apply-templates select="document(concat('udata://photoalbum/album/(',.//group[@name='foto']/property/value/page/@link,')'))/udata/items" mode="foto"/>
</div>
<ul class="pagination">
<xsl:apply-templates select="document(concat('udata://photoalbum/album/(',.//group[@name='foto']/property/value/page/@link,')'))/udata/items" mode="foto_pagination"/>
</ul>
</div>
</xsl:template>
<xsl:template match="item" mode="foto">
<a href="#" target="_blank"><img src="{document(concat('upage://',./@id))/udata/page/properties/group[@name='photo_props']/property[@name='photo']/value}" width="570" /></a>
</xsl:template>
<xsl:template match="item" mode="foto_pagination">
<li><a href="#"><img src="{document(concat('upage://',./@id))/udata/page/properties/group[@name='photo_props']/property[@name='photo']/value}" width="55" /></a></li>
</xsl:template>
Осознал как делать формы для XSLT шаблонов, если нет описания.
К примеру, в описание нет XSLT для %blogs20 editUserBlogs()%
Находим TPL, в нём видим:
$FORMS['blog_new_line'] = <<<END
<div style="padding-top:10px;">
<h3>Создать новый блог</h3>
<div style="padding-left:15px;">
<form id="form_%bid%_edit" method="post" action="/blogs20/editUserBlogs/%bid%/">
<input type="hidden" name="redirect" value="%current_page%" />
<label for="blog_%bid%_title">Название</label><br />
<input type="text" id="blog_%bid%_title" name="blog[%bid%][title]" style="width:99%;border:1px solid #ccc;" value="%title%" /><br /><br />
<label for="blog_%bid%_description">Описание</label><br />
<input type="text" id="blog_%bid%_description" name="blog[%bid%][description]" style="width:99%;border:1px solid #ccc;" value="%description%" /><br /><br />
<label for="blog_%bid%_friendlist">Друзья</label><br />
<select id="blog_%bid%_friendlist" name="blog[%bid%][friendlist][]" multiple="multiple" style="width:99%;height:100px;border:1px solid #ccc;">%friends%</select><br /><br />
<span style="display:block;text-align:right;"><input type="submit" value="Сохранить" /></span>
</form>
</div>
</div>
END;
Пока не ясно что за %bid%, это ведь BlogID, а у нас новый блог. Выполняем TPL шаблон, смотрим его html:
<div style="padding-left:15px;">
<form id="form_new_edit" method="post" action="http://localhost/blogs20/editUserBlogs/new/">
<input type="hidden" name="redirect" value="/users/settings/">
<label for="blog_new_title">Название111111</label><br>
<input type="text" id="blog_new_title" name="blog[new][title]" style="width:99%;border:1px solid #ccc;" value=""><br><br>
<label for="blog_new_description">Описание</label><br>
<input type="text" id="blog_new_description" name="blog[new][description]" style="width:99%;border:1px solid #ccc;" value=""><br><br>
<label for="blog_new_friendlist">Друзья</label><br>
<select id="blog_new_friendlist" name="blog[new][friendlist][]" multiple="multiple" style="width:99%;height:100px;border:1px solid #ccc;"><option value="10">admin</option><option value="518">user</option><option value="299">Гость</option></select><br><br>
<span style="display:block;text-align:right;"><input type="submit" value="Сохранить"></span>
</form>
</div>
Понимаем, что %bid%=NEW. Дальше запиливаем XSTL уже без проблем.... Разве что список друзей получить из всех пользователей, да и то если нужен.
Пока ещё не посетило меня прозрение по поводу добавления картинок.
Ковырял модуль блоги. Посмотрел код. Там есть такие моменты:
$sTitle = getRequest('title');
$sContent = htmlspecialchars(trim(getRequest('content')));
Для меня становится понятно, что это из POST запроса выдёргиваются переменные и дальше присваиваются объекту Post.
$oPost->setValue('title', $sTitle);
Есть плотное ощущение, что так же я могу добавить img. Плюс нужно сделать функции ввода-вывода-редактирования сообщений с учётом этой переменной. Сейчас это попробую всё сделать, но почему-то думаю, что получиться должно.
Но мне остаётся не понятным такой момент:
Если я хочу сделать поле ввода сообщений блога с кнопками как на этом форуме (для добавления тегов), то там же я могу запилить загрузку картинки. Но для этого мне нужно, что бы какой-то макрос принял POST с фотографией, положил её в определённую папку и вернул уже ссылку.
Читал http://wiki.umisoft.ru/%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86_%D1%87%D0%B5%D1%80%D0%B5%D0%B7_%D0%BA%D0%BB%D0%B8%D0%B5%D0%BD%D1%82%D1%81%D0%BA%D1%83%D1%8E_%D1%87%D0%B0%D1%81%D1%82%D1%8C Добавление страниц через клиентскую часть.
есть ощущение что не подойдёт такой вариант, т.к. там нужно указывать ID шаблона данных.. А какой ID у фотографий ? Я добавил через амдинку к блогу фотографию, посмотрел xml:
<group id="292" name="izobrazheniya">
<title>Изображения</title>
[b]<property id="380" name="kartinka" type="img_file">[/b]
<title>Картинка</title>
<value path="./images/cms/data/img_9.jpg" folder="/images/cms/data" name="img_9" ext="jpg" width="380" height="179">/images/cms/data/img_9.jpg</value>
</property>
</group>
Пытался манипулировать с ID 380, но понимаю что это ID конкретного свойства конкретного типа данных.
Мне нужно выхватить загрузку картинок как при загрузке в админке, но пока не могу расковырять где это находится всё..
первый вариант значительно проще будет реализовать, для этого:
1. Создаешь в типе данных "Пост блога 2.0" группу полей с несколькими фотками (пусть группа называется fotos)
2. Создаешь кастомный макрос %blogs20 postAddCustom()% примерно такого вида (добавил туда сохранение всех стандартных полей и вывод id иерархического типа данных "Пост блога 2.0").
public function postAddCustom($blogId = false, $template = 'default') {
if($blogId === false) {
$iTmp = getRequest('param0');
if($iTmp) $blogId = $iTmp;
else $blogId = getRequest('bid');
}
$blogId = intval($blogId);
if($oUsers = cmsController::getInstance()->getModule('users')) {
list($canRead, $canWrite) = permissionsCollection::getInstance()->isAllowedObject($oUsers->user_id, $blogId);
if(!$oUsers->is_auth() || (!$canWrite && $blogId)) {
return false;
}
} else {
return false;
}
$sTitle = htmlspecialchars(trim(getRequest('title')));
$sContent = htmlspecialchars(trim(getRequest('content')));
if(strlen($sTitle) && strlen($sContent) && $blogId) {
if (!umiCaptcha::checkCaptcha()) {
$this->errorNewMessage("%errors_wrong_captcha%");
$this->errorPanic();
}
if(!($blog = umiHierarchy::getInstance()->getElement($blogId)) ||
($blog->getTypeId() != umiHierarchyTypesCollection::getInstance()->getTypeByName("blogs20", "blog")->getId()) ) {
$this->errorNewMessage('%error_wrong_parent%');
$this->errorPanic();
}
$iFriendsOnly = getRequest('visible_for_friends') ? 1 : 0;
$bActivity = getRequest('draught') ? false : true;
$sTags = getRequest('tags');
$oHierarchy = umiHierarchy::getInstance();
$hierarchy_type_id = umiHierarchyTypesCollection::getInstance()->getTypeByName("blogs20", "post")->getId();
$iPostId = $oHierarchy->addElement($blogId, $hierarchy_type_id, $sTitle, $sTitle);
permissionsCollection::getInstance()->setDefaultPermissions($iPostId);
$oPost = $oHierarchy->getElement($iPostId, true);
if($bActivity) {
$bActivity = antiSpamHelper::checkContent($sContent.$sTitle.$sTags);
}
//umihelp add
$data = cmsController::getInstance()->getModule("data");
if($data instanceof def_module) {
$object_id = $oPost->getObjectId();
$data->saveEditedObject($object_id, true);
}
$oPost->getObject()->commit();
$oPost->commit();
//\umihelp add
$oPost->setIsActive($bActivity);
$oPost->setValue('title', $sTitle);
$oPost->setValue('content', $sContent);
$oPost->setValue('tags', $sTags);
$oPost->setValue('publish_time', new umiDate());
$oPost->setValue('only_for_friends', $iFriendsOnly);
// Raise Event
$oEventPoint = new umiEventPoint("blogs20PostAdded");
$oEventPoint->setMode("after");
$oEventPoint->setParam("id", $iPostId);
$oEventPoint->setParam('template', $template);
$this->setEventPoint($oEventPoint);
// Redirecting
$sRefererUri = getServer('HTTP_REFERER');
if(strlen($sRefererUri)) $this->redirect(str_replace("_err=","",$sRefererUri));
return null;
} else {
if($blogId && !strlen($sTitle) && strlen($sContent)) {
$this->errorNewMessage('Не заполнен заголовок');
} else if($blogId && strlen($sTitle) && !strlen($sContent)) {
$this->errorNewMessage('Не заполнен текст публикации');
}
}
list($sFormTemplate) = $this->loadTemplates('blogs20/'.$template, 'post_add_form');
$aParams = array('action' => '/blogs20/postAdd/'.$blogId.'/',
'id' => 'new',
//umihelp add
'post_type_id' => umiHierarchyTypesCollection::getInstance()->getTypeByName("blogs20", "post")->getId();,
//\umihelp add
'title' => '',
'content' => '',
'tags' => '',
'visible_for_friends' => '',
'blog_select' => $this->prepareBlogSelect($blogId, false, $template)
);
return $this->parseTemplate($sFormTemplate, $aParams);
}
Кастом кидаешь в файл /classes/modules/blog20/__custom.php. Не забывай создать файл permissions.custom.php с содержимым:
<?php
$permissions = Array(
'add' => array('postAddCustom')
);
?>
3. выводишь форму добавления блока (post_add_form) и внутрь формы вставляешь %data getCreateForm(%post_type_id%,default, fotos)%
после чего у тебя в форме добавления post для блока появятся поля из группы полей fotos с name типа data[new][foto1], они и сохраняться кодом
//umihelp add
$data = cmsController::getInstance()->getModule("data");
if($data instanceof def_module) {
$object_id = $oPost->getObjectId();
$data->saveEditedObject($object_id, true);
}
$oPost->getObject()->commit();
$oPost->commit();
//\umihelp add
p.s. писал все сходу, проверок не делал
Всё заработало, и русские буквы и пробелы. Благодарю..
Ранее я уже делал такую конструкцию - отдельно обрабатывал первые 5 элементов, а потом оставшиеся. Вроде всё работало.
Сейчас пробую получить первые n элементов - не выходит.
<xsl:apply-templates select="document('udata://content/menu/')/udata/items/item[position() <= 2]"/>
<xsl:apply-templates select="document('udata://content/menu/')/udata/items/item[position() > 2]"/>
Получаем сначала первые 2 элемента, а потом остальные.
Сейчас копирую этот же код - не работает.
Warning: XSLTProcessor::transformToXml() [xsltprocessor.transformtoxml]: Invalid context position in /var/www/.........
Не могу понять как так получается. читая документацию, вижу что "Сущность < используется в XML вместо < (меньше), а сущность > — вместо > (больше)" - после < отсутствует равно. Но и так не работает.....