Курс 2016 года “Разработка на UMI.CMS от 0 до готового сайта”
Вывод количества объектов в категории. XSLT

Автор idu.kuruРаздел Шаблоны XSLT

Ответов: 6
Просмотров: 4762
Последний ответ 18 Октября 2014, 17:39:24
от idu.kuru
Сортировка по алфавиту в xslt

Автор VladimirРаздел Шаблоны XSLT

Ответов: 2
Просмотров: 4266
Последний ответ 14 Января 2012, 17:25:36
от admin
Не выводятся все теги в xslt

Автор goodprofyРаздел Шаблоны XSLT

Ответов: 2
Просмотров: 3897
Последний ответ 03 Июня 2014, 13:52:04
от goodprofy
webforms & XSLT & модальное окно

Автор graveРаздел JS и AJAX

Ответов: 8
Просмотров: 8636
Последний ответ 13 Июня 2011, 00:41:56
от talanter
Как вывести itemprop="position" content="" в XSLT?

Автор makarov2979Раздел Шаблоны XSLT

Ответов: 0
Просмотров: 1601
Последний ответ 15 Ноября 2018, 09:30:06
от makarov2979

0 Пользователей и 2 Гостей просматривают эту тему.

*

Rodogor

  • ***
  • 189
  • +24/-0
    • Просмотр профиля
Re:Изучаю UMI, XSLT.
« Ответ #15 : 07 Июня 2012, 23:29:40 »
Осознал как делать формы для 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 уже без проблем.... Разве что список друзей получить из всех пользователей, да и то если нужен.

*

Rodogor

  • ***
  • 189
  • +24/-0
    • Просмотр профиля
Re:Изучаю UMI, XSLT.
« Ответ #16 : 09 Июня 2012, 15:35:36 »
Походу я упёрся в тупик с тупым шаблонизированием.
не могу решить две задачи:
1. У блогов есть теги. Нужно вывести все блоги с соответствующими тегами. Не посты блогов, а именно сами блоги.
Варианты: изучить usel или написать свой макрос. Пора ковыряться по серьёзному.
2. Новости. "Все новости-Автомобили, Недвижимость, Государство,....". Нужно вывести последние новости из всех рубрик.
Варианты: usel или написать свой марокс.
А можно выкрутиться стандартным  udata/news/lastlist/(IDленты1)(UDленты2)//10/0, а если нужно для всех ID - то можно опять же получить это всё через XSLT....

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
Re:Изучаю UMI, XSLT.
« Ответ #17 : 09 Июня 2012, 16:04:59 »
usel в обоих вариантах, правда с первым вопросом не пробовал на практике, а второй точно

*

Rodogor

  • ***
  • 189
  • +24/-0
    • Просмотр профиля
Re:Изучаю UMI, XSLT.
« Ответ #18 : 11 Июня 2012, 12:21:27 »
А можно как-то дать возможность пользователям создавать фотоальбомы, добавлять фотоагрифии ? Смотрел в сторону getCreateForm - так и не понял, можно или нет.. Судя по всему нет.

*

BaceH

  • ***
  • 141
  • +21/-0
    • Просмотр профиля
Re:Изучаю UMI, XSLT.
« Ответ #19 : 13 Июня 2012, 00:03:46 »
можно,  getCreateForm поможет, но делал через кастом.

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
Re:Изучаю UMI, XSLT.
« Ответ #20 : 13 Июня 2012, 04:07:15 »
для добавления чего либо в систему, надо чтобы был макрос, который это делает, на данный момент можно добавить в систему элементы блога, комментарии, формы обратной связи или объект каталога

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

см темы в форуме например эту (http://umihelp.ru/forum/index.php/topic,1052.msg3313.html#msg3313), эту (http://umihelp.ru/forum/index.php/topic,1075.msg3227.html#msg3227) и эту (http://umihelp.ru/forum/index.php/topic,1071.0.html)

Следует также добавить, что для создания современного варианта загрузки фото, тебе желательно сделать загрузку фото на лету и отображение превью данной фотографии. Для этого в сети есть много примеров ajax uploader или files uploader. В общем эту визуальную часть на форуме еще не обсуждали

в итоге у тебя как минимум должно быть 2 составляющих для загрузки фото

1. форма с <input type="file" />
2. кастомный макрос который обрабатывает данные пересылаемые формой и сохраняющие их куда-то

*

Rodogor

  • ***
  • 189
  • +24/-0
    • Просмотр профиля
Re:Изучаю UMI, XSLT.
« Ответ #21 : 15 Июня 2012, 13:07:20 »
Пока ещё не посетило меня прозрение по поводу добавления картинок.
Ковырял модуль блоги. Посмотрел код. Там есть такие моменты:
Цитировать
$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 конкретного свойства конкретного типа данных.

Мне нужно выхватить загрузку картинок как при загрузке в админке, но пока не могу расковырять где это находится всё..

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
Re:Изучаю UMI, XSLT.
« Ответ #22 : 15 Июня 2012, 20:56:12 »
а можно посмотреть пример того что ты хочешь получить в итоге?

*

Rodogor

  • ***
  • 189
  • +24/-0
    • Просмотр профиля
Re:Изучаю UMI, XSLT.
« Ответ #23 : 15 Июня 2012, 22:14:23 »
Функционал:
Отправляем пост. Нужно прикрепить изображение.

Программа минимум:
Просто прикрепить заранее фиксированное количество фотографий к посту блога. Пример:

http://my.jetscreenshot.com/12061/20120615-9brt-29kb.jpg

Т.е. я отправляю POST action=' /blogs20/postAdd/{$document-page-id}/'. Этот вариант я ещё не опробовал, думаю он сработает. в POST передастся картинка input type="file" . Есть тень мысли о том, что может не сработать, т.к. в postAdd нигде не указана в какую папку складывать картинку ну и т.п. Вот тут возникают трудности.

Другой вариант.

Предположим, поле ввода поста блога оформлено ПРИБЛИЗИТЕЛЬНО вот так
http://my.jetscreenshot.com/12061/20120615-idsf-35kb.jpg
Нажав вставив изображение попадаем в загрузчик, который так же POST-ом отправит КАКОМУ-ТО модулю (скорее всего data, а метод будет самописным addimg), который сложит картинку в нужную папку, зарегистрирует её в базе данных, присвоит нужный шаблон данных(не понимаю какой) и т.п.
Выбрали файл, загрузили, закрыли загрузчик и получили ссылку на него в теге .


Проблема вот в чём - не понимаю как загрузить файл. Ни дописав изменения в модуль blogs, ни отдельно.

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
Re:Изучаю UMI, XSLT.
« Ответ #24 : 16 Июня 2012, 01:09:17 »
первый вариант значительно проще будет реализовать, для этого:

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. писал все сходу, проверок не делал

*

Rodogor

  • ***
  • 189
  • +24/-0
    • Просмотр профиля
Re:Изучаю UMI, XSLT.
« Ответ #25 : 16 Июня 2012, 12:06:49 »
Благодарю за помощь.
Сделал всё как Вы написали - точку с запятой в одном месте профиксил.
 %data getCreateForm(%post_type_id%,default, fotos)%
%post_type_id% ничего не возвращал, я вручную прописал ид.
В итоге появились нужные мне поля. Прикрепляю картинку, отправляю - она не запоминается.
Заменил action с /blogs20/postAdd/65/ на /blogs20/postAddCustom/65/ - не сработало так же. Заменил в classes.php postAdd на кастомный - не сработало так же.
Права у пользователя максимальные.
Сейчас буду вникать в процесс...
А можно ли как-нибудь отслеживать какой кастомный макрос срабатывает, какие переменные принимает и т.п. ? Есть ощущение, что не доходит до него мой input file


Дополнено: убедился, что выполняется именно кастомный макрос,
так же выполняется этот IF, внутри которого как я понимаю и происходит сохранение. $object_id получается корректно (перемещал сюда $oPost->setValue('tags', $sTags); и вместо $sTags подставлял $object_id.
Цитировать
      //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
« Последнее редактирование: 16 Июня 2012, 12:28:28 от Rodogor »

*

Rodogor

  • ***
  • 189
  • +24/-0
    • Просмотр профиля
Re:Изучаю UMI, XSLT.
« Ответ #26 : 16 Июня 2012, 12:48:35 »
Не понял прикола. Начал ковыряться в сторону saveEditedObjectData и развивать мысль, что передавать надо не $object_id а собственно объект, начал менять всё - получил ошибки.. Через ctrl-z изменения отменил, сохранил, обновляю окно umi с ошибками, браузер спрашивает отправить ли заново данные, я отправил... икартинка улетела.. теперь все отправляются. Не понятно.. Сверяю с первоначальным кодом - вроде 1в1. Но у меня уже два десятка постов без картинок.:)
Благодарю за помощь, Вы действительно очень много помогли мне. Более менее разбирусь сам - постараюсь проявлять активность на Вашем форуме. :)

*

Rodogor

  • ***
  • 189
  • +24/-0
    • Просмотр профиля
Re:Изучаю UMI, XSLT.
« Ответ #27 : 17 Июня 2012, 13:28:11 »
Снова не знаю в какую сторону капать, поиском что-то не смог найти, не знаю как сформулировать запрос.
Я делаю что-то вроде автоблогов. Пользователи регистрируются, создают блог о своей машине. Выбирая марку-модель у блога заполняются теги, к примеру "TOYOTA, COROLLA".
Навигацию по блогам хочется сделать такую: site.ru/blogs - сюда выводится список марок. Получения списка марок два варианта - 1) через USEL пробегаемся и формируем список из 1-ого тега блогов, сортируем по алфавиту 2) заранее задаём список марок. Имя марки = тег.
Заходим по ссылке blogs/toyota – по тегу Toyota получаем список марок. Заходя по ссылке blogs/Toyota/corolla – получаем посты блогов  с тегом TOYOTA COROLLA.
Проблема: не могу понять, как реализовать такую структуру, кроме как заранее создать кучу статичных страниц, и в зависимости от ID страницы выдавать результат.
Хотелось бы наоборот – есть блоги с названиями и тегами, и по этому названию и тегам сформировать страницу site.ru/blogs/марка/модель/, т.е. можно ли как-то создавать такие страницы ? Уверен, что можно, но пока для меня больно крутая задача.
Я немного не могу понять как UMI по псевдостатическому адресу подбирает модуль (ну это ещё можно понять) и метод. К примеру, заходим site.ru/test_blog - module="blogs20" method="blog", заходим site.ru/test_blog/test_post - module="blogs20" method="post".
Смотрим @id страниц и взглянем на эти страницы через upage.
<basetype id="25" module="blogs20" method="blog">Блог</basetype>
 <basetype id="28" module="blogs20" method="post">Пост блога</basetype>
Получается, что таким обращаясь к странице сайта, возможно по link находится id объекта, а по нему всё остальное восстанавливается.
Basetype - Элемент описывающий базовый тип для этой страницы (назначение страниц этого типа). Не совпадает с ID в шаблонах данных. Что это за тип пока не могу понять.
Предположим, что если мне сделать свои basetype для выдачи марок и моделей, назовём это более универсальнее - КАТЕГОРИИ БЛОГА, ну и соответствующие методы – то мне ещё нужно будет в целом переделать blogs20, что бы появились те самые категории. Опять же не понятно – категории это ведь динамические страницы, которые не создаются как блоги и посты блогов, хотя их создание можно просто автоматизировать при создание блога.

Вот так же не понятно  - хочу сделать страницу добавления блога. К примеру, site.ru/blogs/add. Можно создать статичную страницу blogs, указать её родительской к пользовательским блогам. Вложить в неё страницу с псевдостатическим адресом add и получим site.ru/blogs/add, потом по ID страницы можно выдать нужный контент….

*

Rodogor

  • ***
  • 189
  • +24/-0
    • Просмотр профиля
Re:Изучаю UMI, XSLT.
« Ответ #28 : 17 Июня 2012, 14:26:23 »
Я вроде понял как сформулировать свой вопрос за малое количество букв:
нужно что бы обращаясь к site.ru/blogs/toyota/corola происходило вот что:
site.ru/blogs - это ведёт к макросу, а /toyota/corola были аргументами


Ковыряю в сторону xsl:param

Анализируя модуль поиска понял, что можно реализовать через xsl:raram - search/search_do/?search_string=поиск
« Последнее редактирование: 17 Июня 2012, 16:15:42 от Rodogor »

*

Rodogor

  • ***
  • 189
  • +24/-0
    • Просмотр профиля
Re:Изучаю UMI, XSLT.
« Ответ #29 : 09 Июля 2012, 17:54:46 »
Может быть кто-нибудь подскажет, можно ли в XSLT шаблонизаторе использовать такие конструкции:

<xsl:apply-templates select="document('udata://content/pagesByAccountTags/(проверка)/')" /> - русский тег
<xsl:apply-templates select="document('udata://content/pagesByAccountTags/(проверка проверка)/')" />  - тег с пробелами. Если у меня к примеру картинки получают теги Toyota Corolla и когда я нахожусь внутри каталога Toyota Corolla - автоматом хочу выводить все картинки. У каталога тег так же состоит из двух слов. Можно ли как-то вставить там %20 вместо пробела ?
Или придётся переписать много всего, что бы всюду пробелы заменялись на точки ?