https://wiki.umisoft.ru/api.php?action=feedcontributions&user=PilipenkAV&feedformat=atomUmicms - Вклад участника [ru]2024-03-29T08:31:12ZВклад участникаMediaWiki 1.31.0https://wiki.umisoft.ru/index.php?title=%D0%97%D0%B0%D0%BF%D1%80%D0%B5%D1%82%D0%B8%D1%82%D1%8C_%D0%B2%D1%8B%D0%BF%D0%BE%D0%BB%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%B0_%D0%B2_XSLT_%D0%BF%D1%80%D0%B8_%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%D0%B5_%D0%B5%D0%B3%D0%BE_%D1%87%D0%B5%D1%80%D0%B5%D0%B7_%D0%B1%D1%80%D0%B0%D1%83%D0%B7%D0%B5%D1%80&diff=6732Запретить выполнение метода в XSLT при вызове его через браузер2014-02-11T09:31:06Z<p>PilipenkAV: </p>
<hr />
<div>'''Актуально для версии 2.9.5'''<br />
<br />
== Задача ==<br />
<br />
Запретить пользователям вызов функции через адресную строку браузера.<br />
<br />
== Решение ==<br />
<br />
Для запрета выполнения метода через адресную строку вы можете добавить следующую проверку в методе:<br />
<br />
<source lang='php'><br />
if (defined('VIA_HTTP_SCHEME')) {<br />
return false;<br />
}<br />
</source><br />
<br />
Расположить данную проверку необходимо в самом начале метода что бы дальнейшее исполнение макроса можно было предотвратить.</div>PilipenkAVhttps://wiki.umisoft.ru/index.php?title=%D0%A2%D1%80%D0%B5%D1%85%D1%83%D1%80%D0%BE%D0%B2%D0%BD%D0%B5%D0%B2%D0%BE%D0%B5_%D0%B2%D1%8B%D0%BF%D0%B0%D0%B4%D0%B0%D1%8E%D1%89%D0%B5%D0%B5_%D0%BC%D0%B5%D0%BD%D1%8E_%D0%BD%D0%B0_CSS&diff=6731Трехуровневое выпадающее меню на CSS2014-02-06T14:48:42Z<p>PilipenkAV: </p>
<hr />
<div>1.Создаем файл menu.css со стилями, подключаем его в теге head. Следим за тем, чтобы прописываемые правила не конфликтовали с уже имеющимися на сайте.<br />
<source lang="css"><br />
ul#cssmenu {<br />
margin: 0;<br />
border: 0 none;<br />
padding: 0;<br />
list-style: none;<br />
background: #003366;<br />
height: 30px;<br />
font: bold 12px/28px Verdana, Arial;<br />
border-left:#003366 1px solid;<br />
}<br />
<br />
ul#cssmenu li {<br />
margin: 0;<br />
border: 0 none;<br />
padding: 0;<br />
float: left;<br />
display: inline;<br />
list-style: none;<br />
position: relative;<br />
height: 30px;<br />
}<br />
<br />
ul#cssmenu ul {<br />
margin: 0;<br />
border: 0 none;<br />
padding: 0;<br />
width: 160px;<br />
list-style: none;<br />
display: none;<br />
position: absolute;<br />
top: 30px;<br />
left: 0;<br />
}<br />
<br />
ul#cssmenu ul:after {<br />
clear: both;<br />
display: block;<br />
font: 1px/0px serif;<br />
content: ".";<br />
height: 0;<br />
visibility: hidden;<br />
}<br />
<br />
ul#cssmenu ul li {<br />
width: 170px;<br />
float: left;<br />
display: block !important;<br />
display: inline;<br />
}<br />
<br />
/* Main Menu */<br />
ul#cssmenu a {<br />
border: 0px;<br />
padding: 0 10px;<br />
float: none !important;<br />
float: left;<br />
display: block;<br />
background: #003366;<br />
color: #FFFFFF;<br />
font: bold 12px/28px Verdana, Arial;<br />
text-decoration: none;<br />
height: auto !important;<br />
height: 1%;<br />
}<br />
<br />
/* Main Menu Hover */<br />
ul#cssmenu a:hover,<br />
ul#cssmenu li:hover a,<br />
ul#cssmenu li.iehover a {<br />
background: #FFFFFF;<br />
color:#003366;<br />
border-top:#003366 1px solid;<br />
}<br />
<br />
/* Second Menu */<br />
ul#cssmenu li:hover li a,<br />
ul#cssmenu li.iehover li a {<br />
border-top: 2px solid #FFFFFF;<br />
float: none;<br />
background: #003366;<br />
color: #FFFFFF;<br />
}<br />
<br />
/* Second Menu Hover */<br />
ul#cssmenu li:hover li a:hover,<br />
ul#cssmenu li:hover li:hover a,<br />
ul#cssmenu li.iehover li a:hover,<br />
ul#cssmenu li.iehover li.iehover a {<br />
border-top: 2px solid #FFFFFF;<br />
background: #FFFFFF;<br />
color:#003366;<br />
border:#003366 1px solid;<br />
}<br />
<br />
ul#cssmenu ul ul {<br />
display: none;<br />
position: absolute;<br />
top: 0;<br />
left: 170px;<br />
}<br />
<br />
ul#cssmenu li:hover ul ul,<br />
ul#cssmenu li.iehover ul ul {<br />
display: none;<br />
}<br />
<br />
ul#cssmenu li:hover ul,<br />
ul#cssmenu ul li:hover ul,<br />
ul#cssmenu li.iehover ul,<br />
ul#cssmenu ul li.iehover ul {<br />
display: block;<br />
}<br />
<br />
</source><br />
2.Создаем шаблон tpls/content/menu/drop.tpl со следующим содержанием:<br />
<source lang="html4strict"><br />
<?php<br />
<br />
$FORMS = Array();<br />
<br />
$FORMS['menu_block_level1'] = <<<END<br />
<br />
<ul id="cssmenu"><br />
%lines%<br />
</ul><br />
<br />
END;<br />
<br />
$FORMS['menu_line_level1'] = <<<END<br />
<li><a href="%link%">%text%</a><br />
%sub_menu%<br />
</li><br />
END;<br />
<br />
$FORMS['menu_line_level1_a'] = <<<END<br />
<li><a href="%link%">%text%</a><br />
%sub_menu%<br />
</li><br />
END;<br />
<br />
<br />
$FORMS['menu_block_level2'] = <<<END<br />
<ul><br />
%lines%<br />
</ul><br />
END;<br />
<br />
$FORMS['menu_line_level2'] = <<<END<br />
<li><a href="%link%">%text%</a><br />
%sub_menu%<br />
</li><br />
END;<br />
<br />
$FORMS['menu_line_level2_a'] = <<<END<br />
<li><a href="%link%">%text%</a><br />
%sub_menu%<br />
</li><br />
END;<br />
<br />
$FORMS['menu_block_level3'] = <<<END<br />
<ul><br />
%lines%<br />
</ul><br />
END;<br />
<br />
$FORMS['menu_line_level3'] = <<<END<br />
<li><a href="%link%">%text%</a></li><br />
END;<br />
<br />
$FORMS['menu_line_level3_a'] = <<<END<br />
<li><a href="%link%">%text%</a></li><br />
END;<br />
<br />
?><br />
</source><br />
3.Прописываем в шаблоне страницы макрос вывода меню <br />
<source lang="html4strict"><br />
%content menu('drop', 3)%<br />
</source><br />
<br />
Важно, чтобы вторым параметром было указано число не меньше 3-х, иначе выпадание работать не будет. Также, следим за тем, чтобы у страниц, выводящихся в меню, были проставлены опции "показывать подменю" и "меню всегда развернуто".<br />
[[Категория:Вопросы и уроки разработки сайтов на UMI.CMS]]</div>PilipenkAVhttps://wiki.umisoft.ru/index.php?title=%D0%90%D1%83%D0%B4%D0%B8%D1%82_%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B&diff=6721Аудит безопасности системы2014-01-31T15:55:51Z<p>PilipenkAV: </p>
<hr />
<div>[[Категория:Модуль Конфигурация]]<br />
'''Актуально для версии 2.9.5'''<br />
<br />
<br />
В закладке "Безопасность" модуля "Конфигурация" есть инструмент проверки безопасности системы. Данный раздел проверяет насколько защищенная система и позволяет отслеживать доступ обычных пользователей к наиболее важным средствам работы с системой и сайтом в целом.<br />
<br />
<br />
Так как в официальной документации находиться только описание каждого пункта но не оговаривается какие именно проверяются данные и где берется информация для теста мы рассмотрим их поподробнее, что бы можно было настроить все пункты на успешное прохождение теста.<br />
<br />
<br />
1. '''Протокол UFS закрыт''' - данный пункт проверяет на наличие в файле ''config.ini'' разрешения использовать через адресную строку протокол '''UFS'''. Данное разрешение прописывается строкой ''ufs.http.allow = '' в секции ''[streams]''. Для удачного прохождения теста необходимо что бы ее значение было равно "0".<br />
<br />
<br />
2. '''Протокол UObject закрыт''' - данный пункт проверяет на наличие в файле ''config.ini'' разрешения использовать через адресную строку протокол '''UObject'''. Данное разрешение прописывается строкой ''"uobject.http.allow = "'' в секции ''[streams]''. Для удачного прохождения теста необходимо что бы ее значение было равно ''"0"''.<br />
<br />
<br />
3. '''Подключение к БД не под root-ом''' - здесь проверяется какой логин используется для подключение к базе данных MySQL, стандартно у каждой базы данных есть главный пользователь который может полностью ей управлять, его логин ''root'', но так как для работы сайта достаточно одной базы данных то создается отдельный пользователь со своими логином и паролем который может управлять только одной базой данных на сервере. Проверка делается по файлу ''config.ini'', где в секции ''[connections]'' указываются данные для подключения к базе данных. Для успешного прохождения теста необходимо, что бы значение поля ''"login="'' было отличным от значения ''root''.<br />
<br />
<br />
4. '''Пароль для БД не пустой''' - как можно понять из названия тут проверяется та же секция ''[connections]'' файла ''config.ini'', где поле ''"password="'' обязательно должно иметь какое либо значение кроме ''""'', то есть что бы был указан обязательно пароль для подключения к базе данных MySQL.<br />
<br />
<br />
5. '''Доступ к файлу конфигурации закрыт''' - в данном пункте проверяется доступность файла ''config.ini'' через адресную строку браузера. То есть если файл ''config.ini'' можно открыть введя в адресной строке браузера ''http://domain.ru/config.ini'', значит тест будет провален. Для успешного прохождения данного теста в файле ''".htaccess"'' предусмотренно правило ''"RewriteRule ^config\.ini$ / [L,R]"'', если этого правила нет или оно "закомментировано" (то есть перед строкой стоит символ "#"), то необходимо либо добавить эту строку перед строкой ''"RewriteRule ^install\.ini$ / [L,R]"'', либо раскомментировать (то есть удалить символ "#" перед строкой).<br />
<br />
<br />
6. '''Доступ к системным папкам закрыт''' - в данном тесте система проверяет запрос к папке ''/classes'' через адресную строку браузера. Что бы тест прошел удачно необходимо в ответ присылать системе либо 403 ошибку сервера, либо ничего не должно приходить вообще. Стандартно это делается добавлением файла ''".htaccess"'' в папку ''/classes''. В самом файле находиться одна строка ''Deny from all'' которая закрывает всем доступ к этой папке через браузер.<br />
<br />
<br />
7. '''Выполнение php скриптов в /files/''' - данный тест проверяет выполняются ли ''".php"'' скрипты из папки ''/files/''. Стандартно исполнение скриптов в папке ''/files/'' закрывается. Для того что бы тест проходил удачно необходимо наличие в папке ''/files/'' файла ''.htaccess'' где должна быть прописана строка ''php_flag engine off'' которая запрещает работу php-скриптов в папке и вложенных папках рекурсивно.<br />
<br />
<br />
8. '''Доступ к файлу php_for_del_connector.php''' - данным тестом проверяется доступность системного файла ''php_for_del_connector.php'' в папке ''/styles/common/other/elfinder/php/''. Тест проходит удачно при наличии в данной папке файла ''.htaccess'' в котором присутствует строка ''Deny from all''.</div>PilipenkAVhttps://wiki.umisoft.ru/index.php?title=%D0%90%D1%83%D0%B4%D0%B8%D1%82_%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B&diff=6714Аудит безопасности системы2014-01-31T15:05:49Z<p>PilipenkAV: Новая страница: «Категория:Модуль Конфигурация '''Актуально для версии 2.9.5''' В закладке "Безопасность" мо…»</p>
<hr />
<div>[[Категория:Модуль Конфигурация]]<br />
'''Актуально для версии 2.9.5'''<br />
<br />
<br />
В закладке "Безопасность" модуля "Конфигурация" есть инструмент проверки безопасности системы. Данный раздел проверяет насколько защищенная система и позволяет отслеживать доступ обычных пользователей к наиболее важным средствам работы с системой и сайтом в целом.<br />
<br />
<br />
Так как в официальной документации находиться только описание каждого пункта но не оговаривается какие именно проверяются данные и где берется информация для теста мы рассмотрим их поподробнее, что бы можно было настроить все пункты на успешное прохождение теста.<br />
<br />
<br />
1. '''Протокол UFS закрыт''' - данный пункт проверяет на наличие в файле ''config.ini'' разрешения использовать через адресную строку протокол '''UFS'''. Данное разрешение прописывается строкой ''ufs.http.allow = '' в секции ''[streams]''. Для удачного прохождения теста необходимо что бы ее значение было равно "0".<br />
<br />
<br />
2. '''Протокол UObject закрыт''' - данный пункт проверяет на наличие в файле ''config.ini'' разрешения использовать через адресную строку протокол '''UObject'''. Данное разрешение прописывается строкой ''"uobject.http.allow = "'' в секции ''[streams]''. Для удачного прохождения теста необходимо что бы ее значение было равно ''"0"''.<br />
<br />
<br />
3. '''Подключение к БД не под root-ом''' - здесь проверяется какой логин используется для подключение к базе данных MySQL, стандартно у каждой базы данных есть главный пользователь который может полностью ей управлять, его логин ''root'', но так как для работы сайта достаточно одной базы данных то создается отдельный пользователь со своими логином и паролем который может управлять только одной базой данных на сервере. Проверка делается по файлу ''config.ini'', где в секции ''[connections]'' указываются данные для подключения к базе данных. Для успешного прохождения теста необходимо, что бы значение поля ''"login="'' было отличным от значения ''root''.<br />
<br />
<br />
4. '''Пароль для БД не пустой''' - как можно понять из названия тут проверяется та же секция ''[connections]'' файла ''config.ini'', где поле ''"password="'' обязательно должно иметь какое либо значение кроме ''""'', то есть что бы был указан обязательно пароль для подключения к базе данных MySQL.<br />
<br />
<br />
5. '''Доступ к файлу конфигурации закрыт''' - в данном пункте проверяется доступность файла ''config.ini'' через адресную строку браузера. То есть если файл ''config.ini'' можно открыть введя в адресной строке браузера ''http://domain.ru/config.ini'', значит тест будет провален. Для успешного прохождения данного теста в файле ''".htaccess"'' предусмотренно правило ''"RewriteRule ^config\.ini$ / [L,R]"'', если этого правила нет или оно "закомментировано" (то есть перед строкой стоит символ "#"), то необходимо либо добавить эту строку перед строкой ''"RewriteRule ^install\.ini$ / [L,R]"'', либо раскомментировать (то есть удалить символ "#" перед строкой).<br />
<br />
<br />
6. '''Доступ к системным папкам закрыт''' - в данном тесте система проверяет запрос к папке ''/classes'' через адресную строку браузера. Что бы тест прошел удачно необходимо в ответ присылать системе либо 403 ошибку сервера, либо ничего не должно приходить вообще. Стандартно это делается добавлением файла ''".htaccess"'' в папку ''/classes''. В самом файле находиться одна строка ''Deny from all'' которая закрывает всем доступ к этой папке через браузер.<br />
<br />
<br />
7. '''Выполнение php скриптов в /files/''' -<br />
<br />
<br />
8. '''Доступ к файлу php_for_del_connector.php''' -</div>PilipenkAVhttps://wiki.umisoft.ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:PilipenkAV&diff=6710Участник:PilipenkAV2014-01-31T14:46:59Z<p>PilipenkAV: /* Январь */</p>
<hr />
<div>== Январь ==<br />
*[[Запрет на редактирование прав при редактировании страницы для группы пользователей]]<br />
*[[запретить выполнение метода в XSLT при вызове его через браузер]]<br />
*[[Аудит безопасности системы]]<br />
<br />
== Актуализированно за декабрь ==<br />
*[[Кастомизация макроса catalog getObjectsList для ускорения формирования страницы]]<br />
*#Добавлена проверка на false для элемента массива $line_arr['status_zakaza_id']<br />
<br />
== Декабрь ==<br />
*[[Добавление ссылки на версию для печати заказа в личном кабинете]]<br />
<br />
== Ноябрь ==<br />
*[[Изменение цены в зависимости от веса товара]]<br />
<br />
== Октябрь: ==<br />
*[[Отключение пагинации для макроса blogs20 postList]]<br />
*[[Отключение активности поста блога при добавлении через postAdd]]<br />
<br />
== Сентябрь: ==<br />
*[[Формирование прайс листа на основе каталога XSLT]]<br />
<br />
== Август: ==<br />
*[[Как редактировать всплывающую форму обратной связи на шаблоне готового сайта]]<br />
<br />
== Актуализированно за август ==<br />
<br />
*[[Изменение количества товаров в корзине tpl]]<br />
*#добавил проверку на нулевое значение<br />
<br />
== Июнь: ==<br />
<br />
*[[Перенос сайта с одного сервера на другой]]<br />
*#создана для перенаправления на существующую статью<br />
*[[Как вывести все товары выбранного раздела каталога вне зависимости от вложенности XSLT]]<br />
*[[Уведомление менеджеру о заказе, со всем необходимыми данными (emarket) XSLT]]<br />
*[[Смена отображения товаров в каталоге таблицей и списком без перезагрузки страницы TPL]]<br />
<br />
== Актуализированно за июнь ==<br />
<br />
*[[Использование модуля GeoIP в XSLT-шаблоне]]<br />
*#добавлена информация в раздел ''' Общая информация ''' о подключении модуля<br />
*#добавлена информация в раздел ''' Примеры использования ''' о подключении шаблона<br />
*#добавлены ссылки на справочную информацию о GeoIP, Google Maps и на Службу Заботы<br />
*[[Эффект jCarousel для фотоальбома TPL]]<br />
*#добавлены категории и плашка 2.9<br />
*[[Эффект jCarousel для фотоальбома XSLT]]<br />
*#добавлены категории и плашка 2.9<br />
*[[Эффекты Lytebox для объектов каталога TPL]]<br />
*#добавлены категории и плашка 2.9<br />
*[[Замена кнопки "Добавить в корзину" сообщением об отсутствии товара TPL]]<br />
*#добавлены категории и плашка 2.9<br />
*[[Как сделать различный вывод разделов, содержащих объекты, и пустых разделов каталога TPL]]<br />
*#Изменено название с указанием шаблонизатора<br />
*[[Уведомление менеджеру о заказе, со всем необходимыми данными (emarket)]]<br />
*#Изменено название с указанием шаблонизатора<br />
*[[ФИО на e-mail менеджеру]]<br />
*#Изменено название с указанием шаблонизатора<br />
*[[Как добавить адрес доставки в письмо ответственному менеджеру о заказе в интернет-магазине?]]<br />
*#Изменено название с указанием шаблонизатора<br />
*[[Работа с корзиной без перезагрузки TPL]]<br />
*#Изменено название с указанием шаблонизатора<br />
*#Отредактировано указание файлов и папок<br />
*#Добавлено предупреждение о проверке на подключение библиотеки jQuery<br />
<br />
== Май: ==<br />
<br />
*[[Эффект jCarousel для фотоальбома TPL]]<br />
*[[Эффект jCarousel для фотоальбома XSLT]]<br />
<br />
== Апрель: ==<br />
<br />
*[[Эффекты Lytebox для объектов каталога TPL]]<br />
*[[Замена кнопки "Добавить в корзину" сообщением об отсутствии товара TPL]]</div>PilipenkAVhttps://wiki.umisoft.ru/index.php?title=%D0%97%D0%B0%D0%BF%D1%80%D0%B5%D1%82_%D0%BD%D0%B0_%D1%80%D0%B5%D0%B4%D0%B0%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BF%D1%80%D0%B0%D0%B2_%D0%BF%D1%80%D0%B8_%D1%80%D0%B5%D0%B4%D0%B0%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B8_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D1%8B_%D0%B4%D0%BB%D1%8F_%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D1%8B_%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D0%B5%D0%B9&diff=6655Запрет на редактирование прав при редактировании страницы для группы пользователей2014-01-14T16:08:31Z<p>PilipenkAV: </p>
<hr />
<div>'''Актуально для версии 2.9.5'''<br />
<br />
== Задача ==<br />
<br />
Иногда необходимо оставить пользователям возможность изменять только контент страниц, но что бы они не могли ни удалить ее, ни переместить. Стандартными средствами системы можно только ограничить группе пользователе или конкретному пользователю доступные для просмотра или редактирования модули, но нету возможности например включив возможность редактировать страницы ограничить права на изменение прав доступа для данных страниц. Наглядно видно это если таким пользователем прокрутить страницу в самый низ где мы увидим блок "Права доступа" и доступные ячейки для галочек.<br />
<br />
<br />
== Решение ==<br />
<br />
Для решения данного вопроса мы сделаем новый обработчик события который будет срабатывать каждый раз когда кто-либо будет сохранять страницу через административный интерфейс. В данном обработчике нам необходимо первым делом проверить к какой группе пользователей принадлежит тот кто сохраняет изменения на странице. Если это та группа пользователей которая не должна менять "Права доступа" к странице мы проверяем наличие галочек для тех прав которые мы не хотим давать пользователю.<br />
<br />
Сначала в файле '''\classes\modules\events\__custom.php''' мы добавляем код обработчика события:<br />
<br />
<source lang='php'><br />
<?php<br />
abstract class __custom_events {<br />
//TODO: Write here your own macroses<br />
<br />
public function changePagePermission ( iUmiEventPoint $event ) {<br />
<br />
//Проверяем вызывается ли событие сохранения изменений на странице через админку<br />
if($event->getMode() == 'before') {<br />
<br />
//Получаем ID пользователя который вызвал сохранение изменений на странице через админку<br />
$user_id = $event->getParam('user_id');<br />
<br />
//Получаем объект пользователя<br />
$user_object = umiObjectsCollection::getInstance()->getObject($user_id);<br />
<br />
// Получаем группу, в которую входит объект с ранее найденным id<br />
$groups = $user_object->getValue("groups");<br />
<br />
foreach ($groups as $val){<br />
//Проверяем по ID является ли группа пользователя супервайзер<br />
$svPermission = permissionsCollection ::getInstance()->isSv($val);<br />
if (!$svPermission) {<br />
//Делаем запрос передачи изменения прав на пользование страницей<br />
//и сохраняем данные в массив<br />
$permiss['perms_create'] = getRequest('perms_create');<br />
$permiss['perms_delete'] = getRequest('perms_delete');<br />
$permiss['perms_move'] = getRequest('perms_move');<br />
<br />
//Проверяем были ли изменения прав на странице <br />
if ($permiss['perms_create'] != NULL || $permiss['perms_delete'] != NULL || $permiss['perms_move'] != NULL) {<br />
//Делаем перенаправление на страницу с которой был отправлен запрос на сохранение<br />
def_module::redirect(getServer('HTTP_REFERER'));<br />
<br />
//завершаем обработку скрипта без сохранения данных<br />
exit();<br />
}<br />
}<br />
}<br />
};<br />
}<br />
};<br />
?><br />
</source><br />
<br />
в переменной $val указывается ID группы пользователей поэтому мы проверяем та ли эта группа пользователей которая может менять "Права доступа" для страницы.<br />
<br />
Теперь нам надо добавить перехватчик данного события который будет срабатывать каждый раз когда кто то сохраняет страницу в административном интерфейсе. Добавляем в файле '''\classes\modules\events\custom_events.php''' необходимый код:<br />
<br />
<source lang='php'><br />
<?php<br />
<br />
$pageExchangePermission = new umiEventListener( "systemModifyElement", "events", "changePagePermission" );<br />
<br />
?><br />
</source><br />
<br />
где systemModifyElement это [http://api.docs.umi-cms.ru/razrabotka_nestandartnogo_funkcionala/sobytijnaya_model_umicms/standartnye_tochki_vyzova/ стандартная точка вызова].<br />
<br />
Теперь если пользователь из группы пользователей которые не имеют привилегий изменения "Прав доступа" для страницы то ему не удастся проставить нужные галочки и тем самым расширить свои возможности редактирования.<br />
<br />
[[Категория:Модуль Пользователи]]</div>PilipenkAVhttps://wiki.umisoft.ru/index.php?title=%D0%97%D0%B0%D0%BF%D1%80%D0%B5%D1%82_%D0%BD%D0%B0_%D1%80%D0%B5%D0%B4%D0%B0%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BF%D1%80%D0%B0%D0%B2_%D0%BF%D1%80%D0%B8_%D1%80%D0%B5%D0%B4%D0%B0%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B8_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D1%8B_%D0%B4%D0%BB%D1%8F_%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D1%8B_%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D0%B5%D0%B9&diff=6654Запрет на редактирование прав при редактировании страницы для группы пользователей2014-01-14T15:42:49Z<p>PilipenkAV: </p>
<hr />
<div>'''Актуально для версии 2.9.5'''<br />
<br />
== Задача ==<br />
<br />
Иногда необходимо оставить пользователям возможность изменять только контент страниц, но что бы они не могли ни удалить ее, ни переместить. Стандартными средствами системы можно только ограничить группе пользователе или конкретному пользователю доступные для просмотра или редактирования модули, но нету возможности например включив возможность редактировать страницы ограничить права на изменение прав доступа для данных страниц. Наглядно видно это если таким пользователем прокрутить страницу в самый низ где мы увидим блок "Права доступа" и доступные ячейки для галочек.<br />
<br />
<br />
== Решение ==<br />
<br />
Для решения данного вопроса мы сделаем новый обработчик события который будет срабатывать каждый раз когда кто-либо будет сохранять страницу через административный интерфейс. В данном обработчике нам необходимо первым делом проверить к какой группе пользователей принадлежит тот кто сохраняет изменения на странице. Если это та группа пользователей которая не должна менять "Права доступа" к странице мы проверяем наличие галочек для тех прав которые мы не хотим давать пользователю.<br />
<br />
Сначала в файле '''\classes\modules\events\__custom.php''' мы добавляем код обработчика события:<br />
<br />
<source lang='php'><br />
<?php<br />
abstract class __custom_events {<br />
//TODO: Write here your own macroses<br />
<br />
public function changePagePermission ( iUmiEventPoint $event ) {<br />
<br />
//Проверяем вызывается ли событие сохранения изменений на странице через админку<br />
if($event->getMode() == 'before') {<br />
<br />
//Получаем ID пользователя который вызвал сохранение изменений на странице через админку<br />
$user_id = $event->getParam('user_id');<br />
<br />
//Получаем объект пользователя<br />
$user_object = umiObjectsCollection::getInstance()->getObject($user_id);<br />
<br />
// Получаем группу, в которую входит объект с ранее найденным id<br />
$groups = $user_object->getValue("groups");<br />
<br />
foreach ($groups as $val){<br />
//Проверяем по ID является ли группа пользователя супервайзер<br />
if ($val == 693) {<br />
//Делаем запрос передачи изменения прав на пользование страницей<br />
//и сохраняем данные в массив<br />
$permiss['perms_create'] = getRequest('perms_create');<br />
$permiss['perms_delete'] = getRequest('perms_delete');<br />
$permiss['perms_move'] = getRequest('perms_move');<br />
<br />
//Проверяем были ли изменения прав на странице <br />
if ($permiss['perms_create'] != NULL || $permiss['perms_delete'] != NULL || $permiss['perms_move'] != NULL) {<br />
//Делаем перенаправление на страницу с которой был отправлен запрос на сохранение<br />
def_module::redirect(getServer('HTTP_REFERER'));<br />
<br />
//завершаем обработку скрипта без сохранения данных<br />
exit();<br />
}<br />
}<br />
}<br />
};<br />
}<br />
};<br />
?><br />
</source><br />
<br />
в переменной $val указывается ID группы пользователей поэтому мы проверяем та ли эта группа пользователей которая может менять "Права доступа" для страницы.<br />
<br />
Теперь нам надо добавить перехватчик данного события который будет срабатывать каждый раз когда кто то сохраняет страницу в административном интерфейсе. Добавляем в файле '''\classes\modules\events\custom_events.php''' необходимый код:<br />
<br />
<source lang='php'><br />
<?php<br />
<br />
$pageExchangePermission = new umiEventListener( "systemModifyElement", "events", "changePagePermission" );<br />
<br />
?><br />
</source><br />
<br />
где systemModifyElement это [http://api.docs.umi-cms.ru/razrabotka_nestandartnogo_funkcionala/sobytijnaya_model_umicms/standartnye_tochki_vyzova/ стандартная точка вызова].<br />
<br />
Теперь если пользователь из группы пользователей которые не имеют привилегий изменения "Прав доступа" для страницы то ему не удастся проставить нужные галочки и тем самым расширить свои возможности редактирования.<br />
<br />
[[Категория:Модуль Пользователи]]</div>PilipenkAVhttps://wiki.umisoft.ru/index.php?title=%D0%97%D0%B0%D0%BF%D1%80%D0%B5%D1%82_%D0%BD%D0%B0_%D1%80%D0%B5%D0%B4%D0%B0%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BF%D1%80%D0%B0%D0%B2_%D0%BF%D1%80%D0%B8_%D1%80%D0%B5%D0%B4%D0%B0%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B8_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D1%8B_%D0%B4%D0%BB%D1%8F_%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D1%8B_%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D0%B5%D0%B9&diff=6653Запрет на редактирование прав при редактировании страницы для группы пользователей2014-01-14T15:39:58Z<p>PilipenkAV: Новая страница: «== Задача == Иногда необходимо оставить пользователям возможность изменять только контент…»</p>
<hr />
<div>== Задача ==<br />
<br />
Иногда необходимо оставить пользователям возможность изменять только контент страниц, но что бы они не могли ни удалить ее, ни переместить. Стандартными средствами системы можно только ограничить группе пользователе или конкретному пользователю доступные для просмотра или редактирования модули, но нету возможности например включив возможность редактировать страницы ограничить права на изменение прав доступа для данных страниц. Наглядно видно это если таким пользователем прокрутить страницу в самый низ где мы увидим блок "Права доступа" и доступные ячейки для галочек.<br />
<br />
<br />
== Решение ==<br />
<br />
Для решения данного вопроса мы сделаем новый обработчик события который будет срабатывать каждый раз когда кто-либо будет сохранять страницу через административный интерфейс. В данном обработчике нам необходимо первым делом проверить к какой группе пользователей принадлежит тот кто сохраняет изменения на странице. Если это та группа пользователей которая не должна менять "Права доступа" к странице мы проверяем наличие галочек для тех прав которые мы не хотим давать пользователю.<br />
<br />
Сначала в файле '''\classes\modules\events\__custom.php''' мы добавляем код обработчика события:<br />
<br />
<source lang='php'><br />
<?php<br />
abstract class __custom_events {<br />
//TODO: Write here your own macroses<br />
<br />
public function changePagePermission ( iUmiEventPoint $event ) {<br />
<br />
//Проверяем вызывается ли событие сохранения изменений на странице через админку<br />
if($event->getMode() == 'before') {<br />
<br />
//Получаем ID пользователя который вызвал сохранение изменений на странице через админку<br />
$user_id = $event->getParam('user_id');<br />
<br />
//Получаем объект пользователя<br />
$user_object = umiObjectsCollection::getInstance()->getObject($user_id);<br />
<br />
// Получаем группу, в которую входит объект с ранее найденным id<br />
$groups = $user_object->getValue("groups");<br />
<br />
foreach ($groups as $val){<br />
//Проверяем по ID является ли группа пользователя супервайзер<br />
if ($val == 693) {<br />
//Делаем запрос передачи изменения прав на пользование страницей<br />
//и сохраняем данные в массив<br />
$permiss['perms_create'] = getRequest('perms_create');<br />
$permiss['perms_delete'] = getRequest('perms_delete');<br />
$permiss['perms_move'] = getRequest('perms_move');<br />
<br />
//Проверяем были ли изменения прав на странице <br />
if ($permiss['perms_create'] != NULL || $permiss['perms_delete'] != NULL || $permiss['perms_move'] != NULL) {<br />
//Делаем перенаправление на страницу с которой был отправлен запрос на сохранение<br />
def_module::redirect(getServer('HTTP_REFERER'));<br />
<br />
//завершаем обработку скрипта без сохранения данных<br />
exit();<br />
}<br />
}<br />
}<br />
};<br />
}<br />
};<br />
?><br />
</source><br />
<br />
в переменной $val указывается ID группы пользователей поэтому мы проверяем та ли эта группа пользователей которая может менять "Права доступа" для страницы.<br />
<br />
Теперь нам надо добавить перехватчик данного события который будет срабатывать каждый раз когда кто то сохраняет страницу в административном интерфейсе. Добавляем в файле '''\classes\modules\events\custom_events.php''' необходимый код:<br />
<br />
<source lang='php'><br />
<?php<br />
<br />
$pageExchangePermission = new umiEventListener( "systemModifyElement", "events", "changePagePermission" );<br />
<br />
?><br />
</source><br />
<br />
где systemModifyElement это [http://api.docs.umi-cms.ru/razrabotka_nestandartnogo_funkcionala/sobytijnaya_model_umicms/standartnye_tochki_vyzova/ стандартная точка вызова].<br />
<br />
Теперь если пользователь из группы пользователей которые не имеют привилегий изменения "Прав доступа" для страницы то ему не удастся проставить нужные галочки и тем самым расширить свои возможности редактирования.</div>PilipenkAVhttps://wiki.umisoft.ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:PilipenkAV&diff=6652Участник:PilipenkAV2014-01-14T14:46:05Z<p>PilipenkAV: /* Январь */</p>
<hr />
<div>== Январь ==<br />
*[[Запрет на редактирование прав при редактировании страницы для группы пользователей]]<br />
*[[запретить выполнение метода в XSLT при вызове его через браузер]]<br />
<br />
== Актуализированно за декабрь ==<br />
*[[Кастомизация макроса catalog getObjectsList для ускорения формирования страницы]]<br />
*#Добавлена проверка на false для элемента массива $line_arr['status_zakaza_id']<br />
<br />
== Декабрь ==<br />
*[[Добавление ссылки на версию для печати заказа в личном кабинете]]<br />
<br />
== Ноябрь ==<br />
*[[Изменение цены в зависимости от веса товара]]<br />
<br />
== Октябрь: ==<br />
*[[Отключение пагинации для макроса blogs20 postList]]<br />
*[[Отключение активности поста блога при добавлении через postAdd]]<br />
<br />
== Сентябрь: ==<br />
*[[Формирование прайс листа на основе каталога XSLT]]<br />
<br />
== Август: ==<br />
*[[Как редактировать всплывающую форму обратной связи на шаблоне готового сайта]]<br />
<br />
== Актуализированно за август ==<br />
<br />
*[[Изменение количества товаров в корзине tpl]]<br />
*#добавил проверку на нулевое значение<br />
<br />
== Июнь: ==<br />
<br />
*[[Перенос сайта с одного сервера на другой]]<br />
*#создана для перенаправления на существующую статью<br />
*[[Как вывести все товары выбранного раздела каталога вне зависимости от вложенности XSLT]]<br />
*[[Уведомление менеджеру о заказе, со всем необходимыми данными (emarket) XSLT]]<br />
*[[Смена отображения товаров в каталоге таблицей и списком без перезагрузки страницы TPL]]<br />
<br />
== Актуализированно за июнь ==<br />
<br />
*[[Использование модуля GeoIP в XSLT-шаблоне]]<br />
*#добавлена информация в раздел ''' Общая информация ''' о подключении модуля<br />
*#добавлена информация в раздел ''' Примеры использования ''' о подключении шаблона<br />
*#добавлены ссылки на справочную информацию о GeoIP, Google Maps и на Службу Заботы<br />
*[[Эффект jCarousel для фотоальбома TPL]]<br />
*#добавлены категории и плашка 2.9<br />
*[[Эффект jCarousel для фотоальбома XSLT]]<br />
*#добавлены категории и плашка 2.9<br />
*[[Эффекты Lytebox для объектов каталога TPL]]<br />
*#добавлены категории и плашка 2.9<br />
*[[Замена кнопки "Добавить в корзину" сообщением об отсутствии товара TPL]]<br />
*#добавлены категории и плашка 2.9<br />
*[[Как сделать различный вывод разделов, содержащих объекты, и пустых разделов каталога TPL]]<br />
*#Изменено название с указанием шаблонизатора<br />
*[[Уведомление менеджеру о заказе, со всем необходимыми данными (emarket)]]<br />
*#Изменено название с указанием шаблонизатора<br />
*[[ФИО на e-mail менеджеру]]<br />
*#Изменено название с указанием шаблонизатора<br />
*[[Как добавить адрес доставки в письмо ответственному менеджеру о заказе в интернет-магазине?]]<br />
*#Изменено название с указанием шаблонизатора<br />
*[[Работа с корзиной без перезагрузки TPL]]<br />
*#Изменено название с указанием шаблонизатора<br />
*#Отредактировано указание файлов и папок<br />
*#Добавлено предупреждение о проверке на подключение библиотеки jQuery<br />
<br />
== Май: ==<br />
<br />
*[[Эффект jCarousel для фотоальбома TPL]]<br />
*[[Эффект jCarousel для фотоальбома XSLT]]<br />
<br />
== Апрель: ==<br />
<br />
*[[Эффекты Lytebox для объектов каталога TPL]]<br />
*[[Замена кнопки "Добавить в корзину" сообщением об отсутствии товара TPL]]</div>PilipenkAVhttps://wiki.umisoft.ru/index.php?title=%D0%97%D0%B0%D0%BF%D1%80%D0%B5%D1%82%D0%B8%D1%82%D1%8C_%D0%B2%D1%8B%D0%BF%D0%BE%D0%BB%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%B0_%D0%B2_XSLT_%D0%BF%D1%80%D0%B8_%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%D0%B5_%D0%B5%D0%B3%D0%BE_%D1%87%D0%B5%D1%80%D0%B5%D0%B7_%D0%B1%D1%80%D0%B0%D1%83%D0%B7%D0%B5%D1%80&diff=6651Запретить выполнение метода в XSLT при вызове его через браузер2014-01-09T09:03:33Z<p>PilipenkAV: Новая страница: «'''Актуально для версии 2.9.5''' == Задача == Запретить пользователям вызов функции через адрес…»</p>
<hr />
<div>'''Актуально для версии 2.9.5'''<br />
<br />
== Задача ==<br />
<br />
Запретить пользователям вызов функции через адресную строку браузера.<br />
<br />
== Решение ==<br />
<br />
Для запрета выполнения метода через адресную строку вы можете добавить следующую проверку в методе:<br />
<br />
<source lang='php'><br />
if (defined('VIA_HTTP_SCHEME') {<br />
return false;<br />
}<br />
</source><br />
<br />
Расположить данную проверку необходимо в самом начале метода что бы дальнейшее исполнение макроса можно было предотвратить.</div>PilipenkAVhttps://wiki.umisoft.ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:PilipenkAV&diff=6650Участник:PilipenkAV2014-01-09T08:59:24Z<p>PilipenkAV: </p>
<hr />
<div>== Январь ==<br />
*[[запретить выполнение метода в XSLT при вызове его через браузер]]<br />
<br />
== Актуализированно за декабрь ==<br />
*[[Кастомизация макроса catalog getObjectsList для ускорения формирования страницы]]<br />
*#Добавлена проверка на false для элемента массива $line_arr['status_zakaza_id']<br />
<br />
== Декабрь ==<br />
*[[Добавление ссылки на версию для печати заказа в личном кабинете]]<br />
<br />
== Ноябрь ==<br />
*[[Изменение цены в зависимости от веса товара]]<br />
<br />
== Октябрь: ==<br />
*[[Отключение пагинации для макроса blogs20 postList]]<br />
*[[Отключение активности поста блога при добавлении через postAdd]]<br />
<br />
== Сентябрь: ==<br />
*[[Формирование прайс листа на основе каталога XSLT]]<br />
<br />
== Август: ==<br />
*[[Как редактировать всплывающую форму обратной связи на шаблоне готового сайта]]<br />
<br />
== Актуализированно за август ==<br />
<br />
*[[Изменение количества товаров в корзине tpl]]<br />
*#добавил проверку на нулевое значение<br />
<br />
== Июнь: ==<br />
<br />
*[[Перенос сайта с одного сервера на другой]]<br />
*#создана для перенаправления на существующую статью<br />
*[[Как вывести все товары выбранного раздела каталога вне зависимости от вложенности XSLT]]<br />
*[[Уведомление менеджеру о заказе, со всем необходимыми данными (emarket) XSLT]]<br />
*[[Смена отображения товаров в каталоге таблицей и списком без перезагрузки страницы TPL]]<br />
<br />
== Актуализированно за июнь ==<br />
<br />
*[[Использование модуля GeoIP в XSLT-шаблоне]]<br />
*#добавлена информация в раздел ''' Общая информация ''' о подключении модуля<br />
*#добавлена информация в раздел ''' Примеры использования ''' о подключении шаблона<br />
*#добавлены ссылки на справочную информацию о GeoIP, Google Maps и на Службу Заботы<br />
*[[Эффект jCarousel для фотоальбома TPL]]<br />
*#добавлены категории и плашка 2.9<br />
*[[Эффект jCarousel для фотоальбома XSLT]]<br />
*#добавлены категории и плашка 2.9<br />
*[[Эффекты Lytebox для объектов каталога TPL]]<br />
*#добавлены категории и плашка 2.9<br />
*[[Замена кнопки "Добавить в корзину" сообщением об отсутствии товара TPL]]<br />
*#добавлены категории и плашка 2.9<br />
*[[Как сделать различный вывод разделов, содержащих объекты, и пустых разделов каталога TPL]]<br />
*#Изменено название с указанием шаблонизатора<br />
*[[Уведомление менеджеру о заказе, со всем необходимыми данными (emarket)]]<br />
*#Изменено название с указанием шаблонизатора<br />
*[[ФИО на e-mail менеджеру]]<br />
*#Изменено название с указанием шаблонизатора<br />
*[[Как добавить адрес доставки в письмо ответственному менеджеру о заказе в интернет-магазине?]]<br />
*#Изменено название с указанием шаблонизатора<br />
*[[Работа с корзиной без перезагрузки TPL]]<br />
*#Изменено название с указанием шаблонизатора<br />
*#Отредактировано указание файлов и папок<br />
*#Добавлено предупреждение о проверке на подключение библиотеки jQuery<br />
<br />
== Май: ==<br />
<br />
*[[Эффект jCarousel для фотоальбома TPL]]<br />
*[[Эффект jCarousel для фотоальбома XSLT]]<br />
<br />
== Апрель: ==<br />
<br />
*[[Эффекты Lytebox для объектов каталога TPL]]<br />
*[[Замена кнопки "Добавить в корзину" сообщением об отсутствии товара TPL]]</div>PilipenkAVhttps://wiki.umisoft.ru/index.php?title=%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8_%D0%BD%D0%B0_%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D1%8E_%D0%B4%D0%BB%D1%8F_%D0%BF%D0%B5%D1%87%D0%B0%D1%82%D0%B8_%D0%B7%D0%B0%D0%BA%D0%B0%D0%B7%D0%B0_%D0%B2_%D0%BB%D0%B8%D1%87%D0%BD%D0%BE%D0%BC_%D0%BA%D0%B0%D0%B1%D0%B8%D0%BD%D0%B5%D1%82%D0%B5&diff=6649Добавление ссылки на версию для печати заказа в личном кабинете2014-01-09T08:07:16Z<p>PilipenkAV: </p>
<hr />
<div>'''Актуально для версии 2.9.5'''<br />
<br />
== Задача ==<br />
Вывести в личном кабинете для заказа ссылку на версию для печати.<br />
<br />
== Решение ==<br />
<br />
Первоначально необходимо создать кастомный макрос для вывода версии для печати, на основе уже существующего макроса ''order_printable'', для этого в файл '''/classes/modules/emarket/__custom.php''' скопируем текст макроса и назовем этот макрос например ''order_printable_custom''.<br />
Так же в данном макросе необходимо будет изменить условие получения ID заказа. В конечном итоге код в файле должен выглядеть примерно так как показано ниже:<br />
<br />
<source lang="php"><br />
<?php<br />
abstract class __emarket_custom {<br />
//TODO: Write here your own macroses<br />
public function order_printable_custom( $orderIdCustom = false ) {<br />
<br />
if(!$orderIdCustom) {<br />
$orderIdCustom = getRequest('orderId');<br />
if (!$orderIdCustom) {<br />
$this->redirect("/emarket/");<br />
}<br />
}<br />
<br />
$uri = "uobject://{$orderId}/?transform=sys-tpls/emarket-order-printable_custom.xsl";<br />
//$uri = "uobject://{$orderId}/";<br />
$result = file_get_contents($uri);<br />
$buffer = outputBuffer::current();<br />
$buffer->charset('utf-8');<br />
$buffer->contentType('text/html');<br />
//$buffer->contentType('text/xml');<br />
$buffer->clear();<br />
$buffer->push($result);<br />
$buffer->end();<br />
return;<br />
}<br />
};<br />
?><br />
</source><br />
<br />
В переменной ''$uri'' у нас указана ссылка на шаблон по которому будет выводиться версия для печати, мы указали файл '''emarket-order-printable_custom.xsl''' и в папке '''/templates/demodizzy/xslt/sys-tpls/''' нам необходимо создать файл с таким же названием (можно скопировать уже имеющийся шаблон '''emarket-order-printable.xsl''').<br />
<br />
Далее нам необходимо добавить пользователям права на использование данного макроса, для этого в папке '''/classes/modules/emarket/''' необходимо создать файл ''permission.custom.php'' и в нем разместить код:<br />
<br />
<source lang="php"><br />
<?php<br />
$permissions = array(<br />
'personal' => array(<br />
'order_printable_custom'<br />
)<br />
);<br />
?><br />
</source><br />
<br />
== Вывод ссылки на печатную версию ==<br />
<br />
Для отображения заказов в личном кабинете, на примере xslt шаблона demodizzy, используется шаблон в файле '''/templates/demodizzy/xslt/modules/emarket/orders-list.xsl'''<br />
Мы можем добавить туда вызов ссылки ''<a href="/emarket/order_printable_custom/{@id}">Печатная версия заказа</a>'' по которой будет открываться печатная версия заказа.</div>PilipenkAVhttps://wiki.umisoft.ru/index.php?title=%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8_%D0%BD%D0%B0_%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D1%8E_%D0%B4%D0%BB%D1%8F_%D0%BF%D0%B5%D1%87%D0%B0%D1%82%D0%B8_%D0%B7%D0%B0%D0%BA%D0%B0%D0%B7%D0%B0_%D0%B2_%D0%BB%D0%B8%D1%87%D0%BD%D0%BE%D0%BC_%D0%BA%D0%B0%D0%B1%D0%B8%D0%BD%D0%B5%D1%82%D0%B5&diff=6648Добавление ссылки на версию для печати заказа в личном кабинете2014-01-09T08:06:34Z<p>PilipenkAV: /* Вывод ссылки на печатную версию */</p>
<hr />
<div>== Задача ==<br />
Вывести в личном кабинете для заказа ссылку на версию для печати.<br />
<br />
== Решение ==<br />
<br />
Первоначально необходимо создать кастомный макрос для вывода версии для печати, на основе уже существующего макроса ''order_printable'', для этого в файл '''/classes/modules/emarket/__custom.php''' скопируем текст макроса и назовем этот макрос например ''order_printable_custom''.<br />
Так же в данном макросе необходимо будет изменить условие получения ID заказа. В конечном итоге код в файле должен выглядеть примерно так как показано ниже:<br />
<br />
<source lang="php"><br />
<?php<br />
abstract class __emarket_custom {<br />
//TODO: Write here your own macroses<br />
public function order_printable_custom( $orderIdCustom = false ) {<br />
<br />
if(!$orderIdCustom) {<br />
$orderIdCustom = getRequest('orderId');<br />
if (!$orderIdCustom) {<br />
$this->redirect("/emarket/");<br />
}<br />
}<br />
<br />
$uri = "uobject://{$orderId}/?transform=sys-tpls/emarket-order-printable_custom.xsl";<br />
//$uri = "uobject://{$orderId}/";<br />
$result = file_get_contents($uri);<br />
$buffer = outputBuffer::current();<br />
$buffer->charset('utf-8');<br />
$buffer->contentType('text/html');<br />
//$buffer->contentType('text/xml');<br />
$buffer->clear();<br />
$buffer->push($result);<br />
$buffer->end();<br />
return;<br />
}<br />
};<br />
?><br />
</source><br />
<br />
В переменной ''$uri'' у нас указана ссылка на шаблон по которому будет выводиться версия для печати, мы указали файл '''emarket-order-printable_custom.xsl''' и в папке '''/templates/demodizzy/xslt/sys-tpls/''' нам необходимо создать файл с таким же названием (можно скопировать уже имеющийся шаблон '''emarket-order-printable.xsl''').<br />
<br />
Далее нам необходимо добавить пользователям права на использование данного макроса, для этого в папке '''/classes/modules/emarket/''' необходимо создать файл ''permission.custom.php'' и в нем разместить код:<br />
<br />
<source lang="php"><br />
<?php<br />
$permissions = array(<br />
'personal' => array(<br />
'order_printable_custom'<br />
)<br />
);<br />
?><br />
</source><br />
<br />
== Вывод ссылки на печатную версию ==<br />
<br />
Для отображения заказов в личном кабинете, на примере xslt шаблона demodizzy, используется шаблон в файле '''/templates/demodizzy/xslt/modules/emarket/orders-list.xsl'''<br />
Мы можем добавить туда вызов ссылки ''<a href="/emarket/order_printable_custom/{@id}">Печатная версия заказа</a>'' по которой будет открываться печатная версия заказа.</div>PilipenkAVhttps://wiki.umisoft.ru/index.php?title=%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8_%D0%BD%D0%B0_%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D1%8E_%D0%B4%D0%BB%D1%8F_%D0%BF%D0%B5%D1%87%D0%B0%D1%82%D0%B8_%D0%B7%D0%B0%D0%BA%D0%B0%D0%B7%D0%B0_%D0%B2_%D0%BB%D0%B8%D1%87%D0%BD%D0%BE%D0%BC_%D0%BA%D0%B0%D0%B1%D0%B8%D0%BD%D0%B5%D1%82%D0%B5&diff=6647Добавление ссылки на версию для печати заказа в личном кабинете2014-01-09T08:05:41Z<p>PilipenkAV: /* Вывод ссылки на печатную версию */</p>
<hr />
<div>== Задача ==<br />
Вывести в личном кабинете для заказа ссылку на версию для печати.<br />
<br />
== Решение ==<br />
<br />
Первоначально необходимо создать кастомный макрос для вывода версии для печати, на основе уже существующего макроса ''order_printable'', для этого в файл '''/classes/modules/emarket/__custom.php''' скопируем текст макроса и назовем этот макрос например ''order_printable_custom''.<br />
Так же в данном макросе необходимо будет изменить условие получения ID заказа. В конечном итоге код в файле должен выглядеть примерно так как показано ниже:<br />
<br />
<source lang="php"><br />
<?php<br />
abstract class __emarket_custom {<br />
//TODO: Write here your own macroses<br />
public function order_printable_custom( $orderIdCustom = false ) {<br />
<br />
if(!$orderIdCustom) {<br />
$orderIdCustom = getRequest('orderId');<br />
if (!$orderIdCustom) {<br />
$this->redirect("/emarket/");<br />
}<br />
}<br />
<br />
$uri = "uobject://{$orderId}/?transform=sys-tpls/emarket-order-printable_custom.xsl";<br />
//$uri = "uobject://{$orderId}/";<br />
$result = file_get_contents($uri);<br />
$buffer = outputBuffer::current();<br />
$buffer->charset('utf-8');<br />
$buffer->contentType('text/html');<br />
//$buffer->contentType('text/xml');<br />
$buffer->clear();<br />
$buffer->push($result);<br />
$buffer->end();<br />
return;<br />
}<br />
};<br />
?><br />
</source><br />
<br />
В переменной ''$uri'' у нас указана ссылка на шаблон по которому будет выводиться версия для печати, мы указали файл '''emarket-order-printable_custom.xsl''' и в папке '''/templates/demodizzy/xslt/sys-tpls/''' нам необходимо создать файл с таким же названием (можно скопировать уже имеющийся шаблон '''emarket-order-printable.xsl''').<br />
<br />
Далее нам необходимо добавить пользователям права на использование данного макроса, для этого в папке '''/classes/modules/emarket/''' необходимо создать файл ''permission.custom.php'' и в нем разместить код:<br />
<br />
<source lang="php"><br />
<?php<br />
$permissions = array(<br />
'personal' => array(<br />
'order_printable_custom'<br />
)<br />
);<br />
?><br />
</source><br />
<br />
== Вывод ссылки на печатную версию ==<br />
<br />
Для отображения заказов в личном кабинете используется шаблон в файле '''/templates/demodizzy/xslt/modules/emarket/orders-list.xsl'''<br />
Мы можем добавить туда вызов ссылки ''<a href="/emarket/order_printable_custom/{@id}">Печатная версия заказа</a>'' по которой будет открываться печатная версия заказа.</div>PilipenkAVhttps://wiki.umisoft.ru/index.php?title=%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8_%D0%BD%D0%B0_%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D1%8E_%D0%B4%D0%BB%D1%8F_%D0%BF%D0%B5%D1%87%D0%B0%D1%82%D0%B8_%D0%B7%D0%B0%D0%BA%D0%B0%D0%B7%D0%B0_%D0%B2_%D0%BB%D0%B8%D1%87%D0%BD%D0%BE%D0%BC_%D0%BA%D0%B0%D0%B1%D0%B8%D0%BD%D0%B5%D1%82%D0%B5&diff=6646Добавление ссылки на версию для печати заказа в личном кабинете2014-01-09T08:05:27Z<p>PilipenkAV: </p>
<hr />
<div>== Задача ==<br />
Вывести в личном кабинете для заказа ссылку на версию для печати.<br />
<br />
== Решение ==<br />
<br />
Первоначально необходимо создать кастомный макрос для вывода версии для печати, на основе уже существующего макроса ''order_printable'', для этого в файл '''/classes/modules/emarket/__custom.php''' скопируем текст макроса и назовем этот макрос например ''order_printable_custom''.<br />
Так же в данном макросе необходимо будет изменить условие получения ID заказа. В конечном итоге код в файле должен выглядеть примерно так как показано ниже:<br />
<br />
<source lang="php"><br />
<?php<br />
abstract class __emarket_custom {<br />
//TODO: Write here your own macroses<br />
public function order_printable_custom( $orderIdCustom = false ) {<br />
<br />
if(!$orderIdCustom) {<br />
$orderIdCustom = getRequest('orderId');<br />
if (!$orderIdCustom) {<br />
$this->redirect("/emarket/");<br />
}<br />
}<br />
<br />
$uri = "uobject://{$orderId}/?transform=sys-tpls/emarket-order-printable_custom.xsl";<br />
//$uri = "uobject://{$orderId}/";<br />
$result = file_get_contents($uri);<br />
$buffer = outputBuffer::current();<br />
$buffer->charset('utf-8');<br />
$buffer->contentType('text/html');<br />
//$buffer->contentType('text/xml');<br />
$buffer->clear();<br />
$buffer->push($result);<br />
$buffer->end();<br />
return;<br />
}<br />
};<br />
?><br />
</source><br />
<br />
В переменной ''$uri'' у нас указана ссылка на шаблон по которому будет выводиться версия для печати, мы указали файл '''emarket-order-printable_custom.xsl''' и в папке '''/templates/demodizzy/xslt/sys-tpls/''' нам необходимо создать файл с таким же названием (можно скопировать уже имеющийся шаблон '''emarket-order-printable.xsl''').<br />
<br />
Далее нам необходимо добавить пользователям права на использование данного макроса, для этого в папке '''/classes/modules/emarket/''' необходимо создать файл ''permission.custom.php'' и в нем разместить код:<br />
<br />
<source lang="php"><br />
<?php<br />
$permissions = array(<br />
'personal' => array(<br />
'order_printable_custom'<br />
)<br />
);<br />
?><br />
</source><br />
<br />
== Вывод ссылки на печатную версию ==<br />
<br />
Для отображения заказов в личном кабинете используется шаблон в файле '''/templates/demodizzy/xslt/modules/emarket/orders-list.xsl'''<br />
Мы можем добавить туда вызов ссылки ''<a href="/emarket/order_printable_custom/{@id}">Печатная версия заказа</a>'' по которой будет открываться печатная версия заказа. <br />
<br />
<a href="/emarket/order_printable_custom/{@id}">Печатная версия заказа</a></div>PilipenkAVhttps://wiki.umisoft.ru/index.php?title=%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8_%D0%BD%D0%B0_%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D1%8E_%D0%B4%D0%BB%D1%8F_%D0%BF%D0%B5%D1%87%D0%B0%D1%82%D0%B8_%D0%B7%D0%B0%D0%BA%D0%B0%D0%B7%D0%B0_%D0%B2_%D0%BB%D0%B8%D1%87%D0%BD%D0%BE%D0%BC_%D0%BA%D0%B0%D0%B1%D0%B8%D0%BD%D0%B5%D1%82%D0%B5&diff=6645Добавление ссылки на версию для печати заказа в личном кабинете2014-01-09T07:59:55Z<p>PilipenkAV: </p>
<hr />
<div>== Задача ==<br />
Вывести в личном кабинете для заказа ссылку на версию для печати.<br />
<br />
== Решение ==<br />
<br />
Первоначально необходимо создать кастомный макрос для вывода версии для печати, на основе уже существующего макроса ''order_printable'', для этого в файл '''/classes/modules/emarket/__custom.php''' скопируем текст макроса и назовем этот макрос например ''order_printable_custom''.<br />
Так же в данном макросе необходимо будет изменить условие получения ID заказа. В конечном итоге код в файле должен выглядеть примерно так как показано ниже:<br />
<br />
<source lang="php"><br />
<?php<br />
abstract class __emarket_custom {<br />
//TODO: Write here your own macroses<br />
public function order_printable_custom( $orderIdCustom = false ) {<br />
<br />
if(!$orderIdCustom) {<br />
$orderIdCustom = getRequest('orderId');<br />
if (!$orderIdCustom) {<br />
$this->redirect("/emarket/");<br />
}<br />
}<br />
<br />
$uri = "uobject://{$orderId}/?transform=sys-tpls/emarket-order-printable_custom.xsl";<br />
//$uri = "uobject://{$orderId}/";<br />
$result = file_get_contents($uri);<br />
$buffer = outputBuffer::current();<br />
$buffer->charset('utf-8');<br />
$buffer->contentType('text/html');<br />
//$buffer->contentType('text/xml');<br />
$buffer->clear();<br />
$buffer->push($result);<br />
$buffer->end();<br />
return;<br />
}<br />
};<br />
?><br />
</source><br />
<br />
В переменной ''$uri'' у нас указана ссылка на шаблон по которому будет выводиться версия для печати, мы указали файл '''emarket-order-printable_custom.xsl''' и в папке '''/templates/demodizzy/xslt/sys-tpls/''' нам необходимо создать файл с таким же названием (можно скопировать уже имеющийся шаблон '''emarket-order-printable.xsl''').<br />
<br />
Далее нам необходимо добавить пользователям права на использование данного макроса, для этого в папке '''/classes/modules/emarket/''' необходимо создать файл ''permission.custom.php'' и в нем разместить код:<br />
<br />
<source lang="php"><br />
<?php<br />
<br />
?><br />
</source><br />
<br />
== Вывод ссылки на печатную версию ==<br />
<br />
U:\home\localhost\www\templates\demodizzy\xslt\modules\emarket\orders-list.xsl<br />
<br />
<a href="/emarket/order_printable_custom/{@id}">Печатная версия заказа</a></div>PilipenkAVhttps://wiki.umisoft.ru/index.php?title=%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8_%D0%BD%D0%B0_%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D1%8E_%D0%B4%D0%BB%D1%8F_%D0%BF%D0%B5%D1%87%D0%B0%D1%82%D0%B8_%D0%B7%D0%B0%D0%BA%D0%B0%D0%B7%D0%B0_%D0%B2_%D0%BB%D0%B8%D1%87%D0%BD%D0%BE%D0%BC_%D0%BA%D0%B0%D0%B1%D0%B8%D0%BD%D0%B5%D1%82%D0%B5&diff=6644Добавление ссылки на версию для печати заказа в личном кабинете2014-01-07T20:25:57Z<p>PilipenkAV: </p>
<hr />
<div>== Задача ==<br />
Вывести в личном кабинете для заказа ссылку на версию для печати.<br />
<br />
== Решение ==<br />
<br />
Первоначально необходимо создать кастомный макрос для вывода версии для печати, на основе уже существующего макроса ''order_printable'', для этого в файл '''\classes\modules\emarket\__custom.php''' скопируем текст макроса и назовем этот макрос например ''order_printable_custom''.<br />
Так же в данном макросе необходимо будет изменить условие получения ID заказа. В конечном итоге код в файле должен выглядеть примерно так как показано ниже:<br />
<br />
<source lang="php"><br />
<?php<br />
abstract class __emarket_custom {<br />
//TODO: Write here your own macroses<br />
public function order_printable_custom( $orderIdCustom = false ) {<br />
<br />
if(!$orderIdCustom) {<br />
$orderIdCustom = getRequest('orderId');<br />
if (!$orderIdCustom) {<br />
$this->redirect("/emarket/");<br />
}<br />
}<br />
<br />
$uri = "uobject://{$orderId}/?transform=sys-tpls/emarket-order-printable_custom.xsl";<br />
//$uri = "uobject://{$orderId}/";<br />
$result = file_get_contents($uri);<br />
$buffer = outputBuffer::current();<br />
$buffer->charset('utf-8');<br />
$buffer->contentType('text/html');<br />
//$buffer->contentType('text/xml');<br />
$buffer->clear();<br />
$buffer->push($result);<br />
$buffer->end();<br />
return;<br />
}<br />
};<br />
?><br />
</source><br />
<br />
В переменной ''$uri'' у нас указана ссылка на шаблон по которому будет выводиться версия для печати, мы указали файл '''emarket-order-printable_custom.xsl''' и в папке '''/templates/demodizzy/xslt/sys-tpls/''' нам необходимо создать файл с таким же названием (можно скопировать уже имеющийся шаблон '''emarket-order-printable.xsl''').<br />
<br />
== Вывод ссылки на печатную версию ==<br />
<br />
U:\home\localhost\www\templates\demodizzy\xslt\modules\emarket\orders-list.xsl<br />
<br />
<a href="/emarket/order_printable_custom/{@id}">Печатная версия заказа</a></div>PilipenkAVhttps://wiki.umisoft.ru/index.php?title=%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8_%D0%BD%D0%B0_%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D1%8E_%D0%B4%D0%BB%D1%8F_%D0%BF%D0%B5%D1%87%D0%B0%D1%82%D0%B8_%D0%B7%D0%B0%D0%BA%D0%B0%D0%B7%D0%B0_%D0%B2_%D0%BB%D0%B8%D1%87%D0%BD%D0%BE%D0%BC_%D0%BA%D0%B0%D0%B1%D0%B8%D0%BD%D0%B5%D1%82%D0%B5&diff=6643Добавление ссылки на версию для печати заказа в личном кабинете2014-01-07T13:06:19Z<p>PilipenkAV: </p>
<hr />
<div>== Задача ==<br />
Вывести в личном кабинете для заказа ссылку на версию для печати.<br />
<br />
== Решение ==<br />
<br />
Первоначально необходимо создать кастомный макрос для вывода версии для печати, на основе уже существующего макроса ''order_printable'', для этого в файл '''\classes\modules\emarket\__custom.php''' скопируем текст макроса и назовем этот макрос например ''order_printable_custom''.<br />
Так же в данном макросе необходимо будет изменить условие получения ID заказа. В конечном итоге код в файле должен выглядеть примерно так как показано ниже:<br />
<br />
<source lang="php"><br />
<?php<br />
abstract class __emarket_custom {<br />
//TODO: Write here your own macroses<br />
public function order_printable_custom( $orderIdCustom = false ) {<br />
<br />
if(!$orderIdCustom) {<br />
$orderIdCustom = getRequest('orderId');<br />
if (!$orderIdCustom) {<br />
$this->redirect("/emarket/");<br />
}<br />
}<br />
<br />
$uri = "uobject://{$orderId}/?transform=sys-tpls/emarket-order-printable_custom.xsl";<br />
//$uri = "uobject://{$orderId}/";<br />
$result = file_get_contents($uri);<br />
$buffer = outputBuffer::current();<br />
$buffer->charset('utf-8');<br />
$buffer->contentType('text/html');<br />
//$buffer->contentType('text/xml');<br />
$buffer->clear();<br />
$buffer->push($result);<br />
$buffer->end();<br />
return;<br />
}<br />
};<br />
?><br />
</source><br />
<br />
В переменной ''$uri'' у нас указана ссылка на шаблон по которому будет выводиться версия для печати, мы указали файл '''emarket-order-printable_custom.xsl''' и в папке '''/templates/demodizzy/xslt/sys-tpls/''' нам необходимо создать файл с таким же названием (можно скопировать уже имеющийся шаблон '''emarket-order-printable.xsl''').<br />
<br />
== Вывод ссылки на печатную версию в TPL шаблонизаторе ==<br />
<br />
<br />
<br />
== Вывод ссылки на печатную версию в XSLT шаблонизаторе ==</div>PilipenkAVhttps://wiki.umisoft.ru/index.php?title=%D0%97%D0%B0%D0%BF%D1%80%D0%B5%D1%82_%D0%B2%D1%8B%D0%BF%D0%BE%D0%BB%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%B0_%D0%B2_XSLT_%D0%BF%D1%80%D0%B8_%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%D0%B5_%D0%B5%D0%B3%D0%BE_%D1%87%D0%B5%D1%80%D0%B5%D0%B7_%D0%B1%D1%80%D0%B0%D1%83%D0%B7%D0%B5%D1%80&diff=6639Запрет выполнения метода в XSLT при вызове его через браузер2013-12-27T16:01:04Z<p>PilipenkAV: </p>
<hr />
<div>'''Актуально до версии 2.8.5.1'''<br />
<br />
Если вы уже не раз писали кастомные макросы для ваших проектов, смотрели логику работу стандартных макросов системы, то скорее всего встречали в начале методов такую строчку кода:<br />
<pre><br />
if($this->breakMe()) return;<br />
</pre><br />
Сам метод '''breakMe()''' находится в файле '''classes/modules/def_module.php'''. Если текущий режим '''admin'''<br />
или используется XSLT-шаблонизатор, то при подобном вызове через браузер:<br />
<pre><br />
http://ваш_сайт/catalog/category/<br />
</pre><br />
не произойдет выполнение метода category(), если в начале метода стоит:<br />
<pre><br />
if($this->breakMe()) return;<br />
</pre><br />
но в xsl-шаблоне, стандартным образом можно будет запустить выполнение метода через '''xsl:apply-templates'''. <br />
Подобный запрет необходим, когда создается кастомная системная страница и необходимо контролировать выполнение метода внутри xsl-шаблона.<br />
[[Категория:API]][[Категория:Верстка в XSLT]]</div>PilipenkAVhttps://wiki.umisoft.ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:PilipenkAV&diff=6638Участник:PilipenkAV2013-12-24T10:52:24Z<p>PilipenkAV: /* Актуализированно за декабрь */</p>
<hr />
<div>== Актуализированно за декабрь ==<br />
*[[Кастомизация макроса catalog getObjectsList для ускорения формирования страницы]]<br />
*#Добавлена проверка на false для элемента массива $line_arr['status_zakaza_id']<br />
<br />
== Декабрь ==<br />
*[[Добавление ссылки на версию для печати заказа в личном кабинете]]<br />
<br />
== Ноябрь ==<br />
*[[Изменение цены в зависимости от веса товара]]<br />
<br />
== Октябрь: ==<br />
*[[Отключение пагинации для макроса blogs20 postList]]<br />
*[[Отключение активности поста блога при добавлении через postAdd]]<br />
<br />
== Сентябрь: ==<br />
*[[Формирование прайс листа на основе каталога XSLT]]<br />
<br />
== Август: ==<br />
*[[Как редактировать всплывающую форму обратной связи на шаблоне готового сайта]]<br />
<br />
== Актуализированно за август ==<br />
<br />
*[[Изменение количества товаров в корзине tpl]]<br />
*#добавил проверку на нулевое значение<br />
<br />
== Июнь: ==<br />
<br />
*[[Перенос сайта с одного сервера на другой]]<br />
*#создана для перенаправления на существующую статью<br />
*[[Как вывести все товары выбранного раздела каталога вне зависимости от вложенности XSLT]]<br />
*[[Уведомление менеджеру о заказе, со всем необходимыми данными (emarket) XSLT]]<br />
*[[Смена отображения товаров в каталоге таблицей и списком без перезагрузки страницы TPL]]<br />
<br />
== Актуализированно за июнь ==<br />
<br />
*[[Использование модуля GeoIP в XSLT-шаблоне]]<br />
*#добавлена информация в раздел ''' Общая информация ''' о подключении модуля<br />
*#добавлена информация в раздел ''' Примеры использования ''' о подключении шаблона<br />
*#добавлены ссылки на справочную информацию о GeoIP, Google Maps и на Службу Заботы<br />
*[[Эффект jCarousel для фотоальбома TPL]]<br />
*#добавлены категории и плашка 2.9<br />
*[[Эффект jCarousel для фотоальбома XSLT]]<br />
*#добавлены категории и плашка 2.9<br />
*[[Эффекты Lytebox для объектов каталога TPL]]<br />
*#добавлены категории и плашка 2.9<br />
*[[Замена кнопки "Добавить в корзину" сообщением об отсутствии товара TPL]]<br />
*#добавлены категории и плашка 2.9<br />
*[[Как сделать различный вывод разделов, содержащих объекты, и пустых разделов каталога TPL]]<br />
*#Изменено название с указанием шаблонизатора<br />
*[[Уведомление менеджеру о заказе, со всем необходимыми данными (emarket)]]<br />
*#Изменено название с указанием шаблонизатора<br />
*[[ФИО на e-mail менеджеру]]<br />
*#Изменено название с указанием шаблонизатора<br />
*[[Как добавить адрес доставки в письмо ответственному менеджеру о заказе в интернет-магазине?]]<br />
*#Изменено название с указанием шаблонизатора<br />
*[[Работа с корзиной без перезагрузки TPL]]<br />
*#Изменено название с указанием шаблонизатора<br />
*#Отредактировано указание файлов и папок<br />
*#Добавлено предупреждение о проверке на подключение библиотеки jQuery<br />
<br />
== Май: ==<br />
<br />
*[[Эффект jCarousel для фотоальбома TPL]]<br />
*[[Эффект jCarousel для фотоальбома XSLT]]<br />
<br />
== Апрель: ==<br />
<br />
*[[Эффекты Lytebox для объектов каталога TPL]]<br />
*[[Замена кнопки "Добавить в корзину" сообщением об отсутствии товара TPL]]</div>PilipenkAVhttps://wiki.umisoft.ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:PilipenkAV&diff=6637Участник:PilipenkAV2013-12-24T10:52:11Z<p>PilipenkAV: </p>
<hr />
<div>== Актуализированно за декабрь ==<br />
*[[Кастомизация макроса catalog getObjectsList для ускорения формирования страницы]]<br />
*#Добавлена проверка на false для элемента массива $line_arr['status_zakaza_id'<br />
<br />
== Декабрь ==<br />
*[[Добавление ссылки на версию для печати заказа в личном кабинете]]<br />
<br />
== Ноябрь ==<br />
*[[Изменение цены в зависимости от веса товара]]<br />
<br />
== Октябрь: ==<br />
*[[Отключение пагинации для макроса blogs20 postList]]<br />
*[[Отключение активности поста блога при добавлении через postAdd]]<br />
<br />
== Сентябрь: ==<br />
*[[Формирование прайс листа на основе каталога XSLT]]<br />
<br />
== Август: ==<br />
*[[Как редактировать всплывающую форму обратной связи на шаблоне готового сайта]]<br />
<br />
== Актуализированно за август ==<br />
<br />
*[[Изменение количества товаров в корзине tpl]]<br />
*#добавил проверку на нулевое значение<br />
<br />
== Июнь: ==<br />
<br />
*[[Перенос сайта с одного сервера на другой]]<br />
*#создана для перенаправления на существующую статью<br />
*[[Как вывести все товары выбранного раздела каталога вне зависимости от вложенности XSLT]]<br />
*[[Уведомление менеджеру о заказе, со всем необходимыми данными (emarket) XSLT]]<br />
*[[Смена отображения товаров в каталоге таблицей и списком без перезагрузки страницы TPL]]<br />
<br />
== Актуализированно за июнь ==<br />
<br />
*[[Использование модуля GeoIP в XSLT-шаблоне]]<br />
*#добавлена информация в раздел ''' Общая информация ''' о подключении модуля<br />
*#добавлена информация в раздел ''' Примеры использования ''' о подключении шаблона<br />
*#добавлены ссылки на справочную информацию о GeoIP, Google Maps и на Службу Заботы<br />
*[[Эффект jCarousel для фотоальбома TPL]]<br />
*#добавлены категории и плашка 2.9<br />
*[[Эффект jCarousel для фотоальбома XSLT]]<br />
*#добавлены категории и плашка 2.9<br />
*[[Эффекты Lytebox для объектов каталога TPL]]<br />
*#добавлены категории и плашка 2.9<br />
*[[Замена кнопки "Добавить в корзину" сообщением об отсутствии товара TPL]]<br />
*#добавлены категории и плашка 2.9<br />
*[[Как сделать различный вывод разделов, содержащих объекты, и пустых разделов каталога TPL]]<br />
*#Изменено название с указанием шаблонизатора<br />
*[[Уведомление менеджеру о заказе, со всем необходимыми данными (emarket)]]<br />
*#Изменено название с указанием шаблонизатора<br />
*[[ФИО на e-mail менеджеру]]<br />
*#Изменено название с указанием шаблонизатора<br />
*[[Как добавить адрес доставки в письмо ответственному менеджеру о заказе в интернет-магазине?]]<br />
*#Изменено название с указанием шаблонизатора<br />
*[[Работа с корзиной без перезагрузки TPL]]<br />
*#Изменено название с указанием шаблонизатора<br />
*#Отредактировано указание файлов и папок<br />
*#Добавлено предупреждение о проверке на подключение библиотеки jQuery<br />
<br />
== Май: ==<br />
<br />
*[[Эффект jCarousel для фотоальбома TPL]]<br />
*[[Эффект jCarousel для фотоальбома XSLT]]<br />
<br />
== Апрель: ==<br />
<br />
*[[Эффекты Lytebox для объектов каталога TPL]]<br />
*[[Замена кнопки "Добавить в корзину" сообщением об отсутствии товара TPL]]</div>PilipenkAVhttps://wiki.umisoft.ru/index.php?title=%D0%9A%D0%B0%D1%81%D1%82%D0%BE%D0%BC%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B0%D0%BA%D1%80%D0%BE%D1%81%D0%B0_catalog_getObjectsList_%D0%B4%D0%BB%D1%8F_%D1%83%D1%81%D0%BA%D0%BE%D1%80%D0%B5%D0%BD%D0%B8%D1%8F_%D1%84%D0%BE%D1%80%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D1%8B&diff=6636Кастомизация макроса catalog getObjectsList для ускорения формирования страницы2013-12-24T10:50:12Z<p>PilipenkAV: </p>
<hr />
<div>Макрос '''catalog getObjectsList()''' можно вынести в кастом и изменить логику его работы таким образом, что список объектов каталога будет формироваться значительно быстрее. Суть заключается в том, что все необходимые данные об объекте каталога мы получаем внутри метода '''getObjectsListCustom''', а в самом XSL-шаблоне, через протокол '''upage''' – никакие данные о странице уже не получаем, т.к. все есть в XML-данных полученных через метод '''getObjectsListCustom'''.<br />
<br />
Для подключения кастомного макроса необходимо сначала в папке '''classes/modules/catalog/''' создать файл '''permissions.custom.php''' следующего содержания:<br />
<source lang="php"><br />
<?php<br />
$permissions = Array('view' => Array('getObjectsListCustom'));<br />
?><br />
</source><br />
<br />
Потом в файл '''classes/modules/catalog/__custom.php''' необходимо добавить измененный код метода getObjectsList:<br />
<source lang="php"><br />
public function getObjectsListCustom($template = "default", $path = false, $limit = false, $ignore_paging = false, $i_need_deep = 0) {<br />
<br />
if(def_module::breakMe()) return;<br />
if(!$template) $template = "default";<br />
if (!$i_need_deep) $i_need_deep = intval(getRequest('param4'));<br />
if (!$i_need_deep) $i_need_deep = 0;<br />
$i_need_deep = intval($i_need_deep);<br />
if ($i_need_deep === -1) $i_need_deep = 100;<br />
<br />
$hierarchy = umiHierarchy::getInstance();<br />
<br />
$hierarchy_type_id = umiHierarchyTypesCollection::getInstance()->getTypeByName("catalog", "object")->getId();<br />
<br />
<br />
<br />
if($category_id === false && $path != KEYWORD_GRAB_ALL) {<br />
throw new publicException("Element not found: \"{$path}\"");<br />
}<br />
$hierarchy_type_id = umiHierarchyTypesCollection::getInstance()->getTypeByName("catalog", "object")->getId();<br />
$hierarchy_type = umiHierarchyTypesCollection::getInstance()->getType($hierarchy_type_id);<br />
$type_id = umiObjectTypesCollection::getInstance()->getBaseType($hierarchy_type->getName(), $hierarchy_type->getExt());<br />
if(!$type_id) {<br />
$type_id = umiObjectTypesCollection::getInstance()->getBaseType($hierarchy_type->getName(), $hierarchy_type->getExt());<br />
}<br />
<br />
$per_page_r = regedit::getInstance()->getVal("//modules/catalog/per_page");<br />
$per_page = ($limit) ? $limit : $per_page_r;<br />
<br />
$curr_page = getRequest('p');<br />
if($ignore_paging) $curr_page = 0;<br />
<br />
$sel = new umiSelection;<br />
$sel->setElementTypeFilter();<br />
$sel->addElementType($hierarchy_type_id);<br />
<br />
if($path != KEYWORD_GRAB_ALL) {<br />
$sel->setHierarchyFilter();<br />
$sel->addHierarchyFilter($category_id, $i_need_deep);<br />
}<br />
<br />
$sel->setPermissionsFilter();<br />
$sel->addPermissions();<br />
<br />
if($path === KEYWORD_GRAB_ALL) {<br />
$curr_category_id = cmsController::getInstance()->getCurrentElementId();<br />
} else {<br />
$curr_category_id = $category_id;<br />
}<br />
<br />
<br />
if($path != KEYWORD_GRAB_ALL) {<br />
$type_id = $hierarchy->getDominantTypeId($curr_category_id, $i_need_deep);<br />
}<br />
<br />
if($type_id) {<br />
def_module::autoDetectOrders($sel, $type_id);<br />
def_module::autoDetectFilters($sel, $type_id);<br />
<br />
} else {<br />
$sel->setOrderFilter();<br />
$sel->setOrderByName();<br />
}<br />
<br />
if($curr_page !== "all") {<br />
$curr_page = (int) $curr_page;<br />
$sel->setLimitFilter();<br />
$sel->addLimit($per_page, $curr_page);<br />
}<br />
<br />
$result = umiSelectionsParser::runSelection($sel);<br />
$total = umiSelectionsParser::runSelectionCounts($sel);<br />
$objects = umiObjectsCollection::getInstance(); <br />
<br />
if(($sz = sizeof($result)) > 0) {<br />
$block_arr = Array();<br />
$lines = Array();<br />
for($i = 0; $i < $sz; $i++) {<br />
$element_id = $result[$i];<br />
$element = umiHierarchy::getInstance()->getElement($element_id);<br />
if(!$element) continue;<br />
$line_arr = Array();<br />
$line_arr['attribute:id'] = $element_id;<br />
<br />
$line_arr['attribute:alt_name'] = $element->getAltName();<br />
$line_arr['attribute:link'] = umiHierarchy::getInstance()->getPathById($element_id);<br />
$line_arr['xlink:href'] = "upage://" . $element_id;<br />
$line_arr['name'] = $element->getName();<br />
$line_arr['status_zakaza_id'] = $element->getValue('status_zakaza'); <br />
$line_arr['osobennost_id'] = $element->getValue('osobennost'); <br />
$line_arr['h1'] = $element->getValue('h1'); <br />
$price = $element->getValue('price'); <br />
$line_arr['price'] = number_format($price, 0, '.', '\'');<br />
if($line_arr['status_zakaza_id'] != false) {<br />
$line_arr['status_zakaza_name'] = $objects->getObject($line_arr['status_zakaza_id'])->getName();<br />
}<br />
$kratkoe_opisanie = $element->getValue('kratkoe_opisanie'); <br />
$line_arr['kratkoe_opisanie'] = $kratkoe_opisanie;<br />
$line_arr['header_pic'] = $element->getValue('header_pic');<br />
<br />
$lines['nodes:item'][] = $line_arr;<br />
templater::pushEditable("catalog", "object", $element_id);<br />
umiHierarchy::getInstance()->unloadElement($element_id);<br />
}<br />
$block_arr['lines'] = $lines;<br />
$block_arr['numpages'] = umiPagenum::generateNumPage($total, $per_page);<br />
$block_arr['total'] = $total;<br />
$block_arr['per_page'] = $per_page;<br />
$block_arr['category_id'] = $category_id;<br />
<br />
if($type_id) {<br />
$block_arr['type_id'] = $type_id;<br />
}<br />
return $block_arr;<br />
} else {<br />
$block_arr['numpages'] = umiPagenum::generateNumPage(0, 0);<br />
$block_arr['lines'] = "";<br />
$block_arr['total'] = 0;<br />
$block_arr['per_page'] = 0;<br />
$block_arr['category_id'] = $category_id;<br />
<br />
return $block_arr;<br />
}<br />
}<br />
</source><br />
<br />
Результат работы оригинального метода getObjectsList выглядит следующим образом:<br />
<source lang="xml"><br />
<?xml version="1.0" encoding="utf-8"?><br />
<udata module="catalog" method="getObjectsList" generation-time="0.872797"><br />
<lines><br />
<item id="2430" alt_name="garmin_nuvi_3790t" link="/goods/gps/garmin_nuvi_3790t/" xlink:href="upage://2585">Автомобильный GPS Навигатор Garmin Nuvi 3790T</item><br />
<item id="2429" alt_name="garmin_nuvi_3760t" link="/goods/gps/garmin_nuvi_3760t/" xlink:href="upage://2590">Автомобильный GPS Навигатор Garmin Nuvi 3760T</item><br />
<item id="2428" alt_name="garmin_nuvi_1410t" link="/goods/gps/garmin_nuvi_1410t/" xlink:href="upage://2613">Автомобильный GPS Навигатор Garmin Nuvi 1410T</item><br />
<lines><br />
<udata><br />
</source><br />
<br />
<br />
а элемент '''item''' кастомного метода getObjectsListCustom:<br />
<source lang="xml"><br />
<item id="2622" num="1" alt_name="garmin_nuvi_1200" link="/goods/gps/garmin_nuvi_1200/" xlink:href="upage://2622"><br />
<name>Автомобильный GPS Навигатор Garmin Nuvi 1200</name><br />
<status_zakaza_id>27658</status_zakaza_id><br />
<osobennost_id>28407</osobennost_id><br />
<h1>Автомобильный GPS Навигатор Garmin Nuvi 1200</h1><br />
<price>4'990</price><br />
<status_zakaza_name>в наличии</status_zakaza_name><br />
<kratkoe_opisanie>Компактная модель автомобильного GPS навигатора nuvi 1200 легко помещается в кармане.</kratkoe_opisanie><br />
<header_pic path="./images/cms/data/garmin_nuvi_1200.jpg" size="13568" ext="jpg" width="150" height="150">/images/cms/data/garmin_nuvi_1200.jpg</header_pic><br />
</item><br />
</source><br />
<br />
<br />
В XSL-шаблоне необходимо вместо стандартного метода вызывать getObjectsListCustom и средствами XSLT обработать полученные XML данные.<br />
[[Категория:Написание кастомных макросов]]</div>PilipenkAVhttps://wiki.umisoft.ru/index.php?title=%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8_%D0%BD%D0%B0_%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D1%8E_%D0%B4%D0%BB%D1%8F_%D0%BF%D0%B5%D1%87%D0%B0%D1%82%D0%B8_%D0%B7%D0%B0%D0%BA%D0%B0%D0%B7%D0%B0_%D0%B2_%D0%BB%D0%B8%D1%87%D0%BD%D0%BE%D0%BC_%D0%BA%D0%B0%D0%B1%D0%B8%D0%BD%D0%B5%D1%82%D0%B5&diff=6634Добавление ссылки на версию для печати заказа в личном кабинете2013-12-24T08:03:58Z<p>PilipenkAV: Новая страница: «== Задача == Вывести в личном кабинете для заказа ссылку на версию для печати. == Решение == П…»</p>
<hr />
<div>== Задача ==<br />
Вывести в личном кабинете для заказа ссылку на версию для печати.<br />
<br />
== Решение ==<br />
<br />
Первоначально необходимо создать кастомный макрос для вывода версии для печати, на основе уже существующего макроса ''order_printable'', для этого в файл '''\classes\modules\emarket\__custom.php''' скопируем текст макроса и назовем этот макрос например ''custom_order_printable''. Так же в данном макросе необходимо будет изменить условие получения ID заказа. В конечном итоге файл должен выглядеть примерно так как показано в коде ниже:<br />
<br />
<source lang="php"><br />
<?php<br />
abstract class __emarket_custom {<br />
//TODO: Write here your own macroses<br />
public function order_printable_custom() {<br />
<br />
$orderId = getRequest('orderId');<br />
<br />
if(!$orderId) {<br />
$this->redirect("/emarket/personal/");<br />
}<br />
<br />
$uri = "uobject://{$orderId}/?transform=sys-tpls/emarket-order-printable_custom.xsl";<br />
//$uri = "uobject://{$orderId}/";<br />
$result = file_get_contents($uri);<br />
$buffer = outputBuffer::current();<br />
$buffer->charset('utf-8');<br />
$buffer->contentType('text/html');<br />
//$buffer->contentType('text/xml');<br />
$buffer->clear();<br />
$buffer->push($result);<br />
$buffer->end();<br />
return;<br />
}<br />
};<br />
?><br />
</source><br />
<br />
В переменной ''$uri'' у нас указана ссылка на шаблон по которому будет выводиться версия для печати, мы указали файл '''emarket-order-printable_custom.xsl''',</div>PilipenkAVhttps://wiki.umisoft.ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:PilipenkAV&diff=6633Участник:PilipenkAV2013-12-24T07:54:01Z<p>PilipenkAV: </p>
<hr />
<div>== Декабрь ==<br />
*[[Добавление ссылки на версию для печати заказа в личном кабинете]]<br />
<br />
== Ноябрь ==<br />
*[[Изменение цены в зависимости от веса товара]]<br />
<br />
== Октябрь: ==<br />
*[[Отключение пагинации для макроса blogs20 postList]]<br />
*[[Отключение активности поста блога при добавлении через postAdd]]<br />
<br />
== Сентябрь: ==<br />
*[[Формирование прайс листа на основе каталога XSLT]]<br />
<br />
== Август: ==<br />
*[[Как редактировать всплывающую форму обратной связи на шаблоне готового сайта]]<br />
<br />
== Актуализированно за август ==<br />
<br />
*[[Изменение количества товаров в корзине tpl]]<br />
*#добавил проверку на нулевое значение<br />
<br />
== Июнь: ==<br />
<br />
*[[Перенос сайта с одного сервера на другой]]<br />
*#создана для перенаправления на существующую статью<br />
*[[Как вывести все товары выбранного раздела каталога вне зависимости от вложенности XSLT]]<br />
*[[Уведомление менеджеру о заказе, со всем необходимыми данными (emarket) XSLT]]<br />
*[[Смена отображения товаров в каталоге таблицей и списком без перезагрузки страницы TPL]]<br />
<br />
== Актуализированно за июнь ==<br />
<br />
*[[Использование модуля GeoIP в XSLT-шаблоне]]<br />
*#добавлена информация в раздел ''' Общая информация ''' о подключении модуля<br />
*#добавлена информация в раздел ''' Примеры использования ''' о подключении шаблона<br />
*#добавлены ссылки на справочную информацию о GeoIP, Google Maps и на Службу Заботы<br />
*[[Эффект jCarousel для фотоальбома TPL]]<br />
*#добавлены категории и плашка 2.9<br />
*[[Эффект jCarousel для фотоальбома XSLT]]<br />
*#добавлены категории и плашка 2.9<br />
*[[Эффекты Lytebox для объектов каталога TPL]]<br />
*#добавлены категории и плашка 2.9<br />
*[[Замена кнопки "Добавить в корзину" сообщением об отсутствии товара TPL]]<br />
*#добавлены категории и плашка 2.9<br />
*[[Как сделать различный вывод разделов, содержащих объекты, и пустых разделов каталога TPL]]<br />
*#Изменено название с указанием шаблонизатора<br />
*[[Уведомление менеджеру о заказе, со всем необходимыми данными (emarket)]]<br />
*#Изменено название с указанием шаблонизатора<br />
*[[ФИО на e-mail менеджеру]]<br />
*#Изменено название с указанием шаблонизатора<br />
*[[Как добавить адрес доставки в письмо ответственному менеджеру о заказе в интернет-магазине?]]<br />
*#Изменено название с указанием шаблонизатора<br />
*[[Работа с корзиной без перезагрузки TPL]]<br />
*#Изменено название с указанием шаблонизатора<br />
*#Отредактировано указание файлов и папок<br />
*#Добавлено предупреждение о проверке на подключение библиотеки jQuery<br />
<br />
== Май: ==<br />
<br />
*[[Эффект jCarousel для фотоальбома TPL]]<br />
*[[Эффект jCarousel для фотоальбома XSLT]]<br />
<br />
== Апрель: ==<br />
<br />
*[[Эффекты Lytebox для объектов каталога TPL]]<br />
*[[Замена кнопки "Добавить в корзину" сообщением об отсутствии товара TPL]]</div>PilipenkAVhttps://wiki.umisoft.ru/index.php?title=%D0%91%D1%8B%D1%81%D1%82%D1%80%D0%BE%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B5_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B&diff=6616Быстродействие системы2013-12-13T14:23:22Z<p>PilipenkAV: </p>
<hr />
<div>В данной статье будут описаны некоторые рекомендации, которые позволят ускорить работу сайта, снизить нагрузку на сервер.<br />
<br />
* Если на сайте не используются данные, собираемые модулем Статистика, то отключение сбора статистики, в настройках модуля, существенно снизит нагрузку на сервер. Модуль собирает очень большой объем статистических данных, происходит достаточно большое количество запросов к базе данных. Возможен вариант, когда модуль включается лишь на время, для сбора облака тэгов, потом сбор данных можно отключить.<br />
<br />
* Если на сайте используются макросы content menu() для построения меню, которые практически никогда не будут измениться, то имеет смысл прописать данные блоки статически, т.е. прописать html код блока, который формируется макросом menu()<br />
<br />
* У макроса news lastlist(), есть недокументированный шестой параметр SkipOrderByTime, который позволяет отключить сортировку новостей по полю Дата публикации. В данной сортировке, в большинстве случаев, нет необходимости, т.к. без нее новости будут выводиться в том порядке, в котором они расположены в административной части, в ленте новостей. Необходимая сортировка создается при добавлении новости, самая последняя добавленная новость отображается в начале списка. Параметр SkipOrderByTime необходимо устанавливать =1.<br />
<br />
* Будьте внимательны при использовании макроса system getOuterContent(), в некоторых случаях он может выполняться слишком долго, в таком случае код необходимо подключать напрямую в шаблон, либо с помощью кастомного макроса. Без опаски, можно использовать этот макрос при подключении TPL-шаблонов: header и footer.<br />
<br />
* При использовании макроса emarket price(), есть смысл установить третий параметр =0, тогда макрос будет выдавать цену только в текущей валюте сайта, а не сразу во всех зарегистрированных в модуле Emarket, вкладка Валюты. Т.к. часто бывает, что на одной странице отображается 20-30 товаров, исключение из обработки ненужных данных, цен в других валютах, является значимым действием при оптимизации сайта.<br />
<br />
* С осторожностью используйте такие встроенные в систему кеширующие механизмы, как "Файловая система" и "Статический кэш". На некоторых сайтах, быстродействие системы может даже снизиться при использовании данных кэшей. Многие хостинги предоставляют кэширующие механизмы, которые мы смело рекомендуем, одни из них это: apc, eaccelerator и memcached. При использовании данных кэшей снижается нагрузка на сервер, уменьшается количество запросов к базе данных, сайт начинает работать быстрее и стабильней.<br />
<br />
* При использовании XSL-шаблонов, результат работы макросов и протоколов, т.е. XML-данные, можно закэшировать, для этого необходимо к запросу добавить GET параметр с name = expire, а значением будет являться время хранения кэша в секундах. Для некоторых макросов можно поставить время равное одному часу (в секундах), для другого можно и целые сутки, по прошествии указанного время происходит обновление кэша.<br />
[[Категория:Кеширование]]</div>PilipenkAVhttps://wiki.umisoft.ru/index.php?title=%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D1%86%D0%B5%D0%BD%D1%8B_%D0%B2_%D0%B7%D0%B0%D0%B2%D0%B8%D1%81%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8_%D0%BE%D1%82_%D0%B2%D0%B5%D1%81%D0%B0_%D1%82%D0%BE%D0%B2%D0%B0%D1%80%D0%B0&diff=6612Изменение цены в зависимости от веса товара2013-12-02T08:18:40Z<p>PilipenkAV: /* Решение */</p>
<hr />
<div>'''Актуально для версии 2.9.1'''<br />
<br />
==Задача==<br />
<br />
Необходимо что бы цена товара менялась в зависимости от выбранного значения веса товара.<br />
<br />
==Решение==<br />
<br />
Для реализации данного функционала нам необходимо что бы при вводе определенного значения веса товара цена динамически менялась без перезагрузки страницы.<br />
<br />
Сначала создадим для товара поле для ввода с типом данных '''"Составное"'''. В модуле '''"Шаблоны данных"''', в '''"Типы данных"''' находим '''"Объект каталога"''' или необходимый нам дочерний тип данных который используется для нашего товара. На примере шаблона ''"Современный интернет-магазин"'' мы добавим такое поле к типу данных '''"Телевизоры"''', в группе полей '''"Характеристики"''' мы изменим тип поля '''"Вес"''' на '''"Составное"'''.<br />
<br />
Заходим в карточку товара и проставляем например 10 значений для поля '''"Вес"'''.<br />
<br />
Далее в папку ''/templates/demodizzy/js/'' добавляем файл price.js где прописываем код:<br />
<source lang="javascript"><br />
$(document).ready(function(){<br />
<br />
// find and include price in form table<br />
//price = $('#price_id span#once').text();<br />
price_int = parseInt($('#price_id span#once').text(), 10);<br />
<br />
$('form input.table_otions').attr('checked', 'checked');<br />
<br />
if (price_int){<br />
price_first = $('form input.table_otions').parent().parent().children('td:last-child').text();<br />
$('form input.table_otions').parent().parent().children('td:last-child').text(price_first + price_int + ' руб');<br />
<br />
price_second = parseInt($('form input.table_otions').parent().parent().next().children('td:last-child').text(), 10);<br />
$('form input.table_otions').parent().parent().next().children('td:last-child').text(price_second + price_int + ' руб');<br />
<br />
price_third = parseInt($('form input.table_otions').parent().parent().next().next().children('td:last-child').text(), 10);<br />
$('form input.table_otions').parent().parent().next().next().children('td:last-child').text(price_third + price_int + ' руб');<br />
<br />
price_four = parseInt($('form input.table_otions').parent().parent().next().next().next().children('td:last-child').text(), 10);<br />
$('form input.table_otions').parent().parent().next().next().next().children('td:last-child').text(price_four + price_int + ' руб');<br />
<br />
$('form input[name="options[form_filling]"]').on('click', function(){<br />
//var price = $(this).parent().parent().children('td:last-child').html();<br />
var price_int = parseInt($(this).parent().parent().children('td:last-child').html(), 10);<br />
<br />
$('#price_id').html( '<span>' + price_int + ' руб</span>');<br />
});<br />
<br />
}else{<br />
//price_actual = $('#price_id span#first').text();<br />
price_actual_int = parseInt($('#price_id span#first').text(), 10);<br />
//price_original = $('#price_id span#second').text();<br />
price_original_int = parseInt($('#price_id span#second').text(), 10);<br />
<br />
discount = price_original_int - price_actual_int;<br />
<br />
price_first = $('form input.table_otions').parent().parent().children('td:last-child').text();<br />
$('form input.table_otions').parent().parent().children('td:last-child').text(price_first + price_actual_int + ' руб');<br />
<br />
price_second = parseInt($('form input.table_otions').parent().parent().next().children('td:last-child').text(), 10);<br />
$('form input.table_otions').parent().parent().next().children('td:last-child').text(price_second + price_actual_int + ' руб');<br />
<br />
price_third = parseInt($('form input.table_otions').parent().parent().next().next().children('td:last-child').text(), 10);<br />
$('form input.table_otions').parent().parent().next().next().children('td:last-child').text(price_third + price_actual_int + ' руб');<br />
<br />
price_four = parseInt($('form input.table_otions').parent().parent().next().next().next().children('td:last-child').text(), 10);<br />
$('form input.table_otions').parent().parent().next().next().next().children('td:last-child').text(price_four + price_actual_int + ' руб');<br />
<br />
$('form input[name="options[form_filling]"]').on('click', function(){<br />
//var price_actual = $(this).parent().parent().children('td:last-child').html();<br />
var price_actual_int = parseInt($(this).parent().parent().children('td:last-child').html(), 10);<br />
var price_original_int = price_actual_int + discount;<br />
<br />
$('#price_id').html( '<span>' + price_actual_int + ' руб</span><span style="text-decoration: line-through">' + price_original_int + ' руб</span>');<br />
});<br />
}<br />
});<br />
</source><br />
<br />
Теперь необходимо подключить этот файл к главному шаблону вывода страниц ''/templates/demodizzy/xslt/layouts/default.xsl''<br />
<source lang="xml"><br />
<head><br />
...<br />
<script type="text/javascript" charset="utf-8" src="/templates/demodizzy/js/price.js"></script><br />
...<br />
</head><br />
</source></div>PilipenkAVhttps://wiki.umisoft.ru/index.php?title=%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D1%86%D0%B5%D0%BD%D1%8B_%D0%B2_%D0%B7%D0%B0%D0%B2%D0%B8%D1%81%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8_%D0%BE%D1%82_%D0%B2%D0%B5%D1%81%D0%B0_%D1%82%D0%BE%D0%B2%D0%B0%D1%80%D0%B0&diff=6611Изменение цены в зависимости от веса товара2013-12-02T08:14:59Z<p>PilipenkAV: </p>
<hr />
<div>'''Актуально для версии 2.9.1'''<br />
<br />
==Задача==<br />
<br />
Необходимо что бы цена товара менялась в зависимости от выбранного значения веса товара.<br />
<br />
==Решение==<br />
<br />
Для реализации данного функционала нам необходимо что бы при вводе определенного значения веса товара цена динамически менялась без перезагрузки страницы.<br />
<br />
Сначала создадим для товара поле для ввода с типом данных '''"Составное"'''. В модуле '''"Шаблоны данных"''', в '''"Типы данных"''' находим '''"Объект каталога"''' или необходимый нам дочерний тип данных который используется для нашего товара. На примере шаблона ''"Современный интернет-магазин"'' мы добавим такое поле к типу данных '''"Телевизоры"''', в группе полей '''"Характеристики"''' мы изменим тип поля '''"Вес"''' на '''"Составное"'''.<br />
<br />
В папку ''/templates/demodizzy/js/'' добавляем файл price.js где прописываем код:<br />
<source lang="javascript"><br />
$(document).ready(function(){<br />
<br />
// find and include price in form table<br />
//price = $('#price_id span#once').text();<br />
price_int = parseInt($('#price_id span#once').text(), 10);<br />
<br />
$('form input.table_otions').attr('checked', 'checked');<br />
<br />
if (price_int){<br />
price_first = $('form input.table_otions').parent().parent().children('td:last-child').text();<br />
$('form input.table_otions').parent().parent().children('td:last-child').text(price_first + price_int + ' руб');<br />
<br />
price_second = parseInt($('form input.table_otions').parent().parent().next().children('td:last-child').text(), 10);<br />
$('form input.table_otions').parent().parent().next().children('td:last-child').text(price_second + price_int + ' руб');<br />
<br />
price_third = parseInt($('form input.table_otions').parent().parent().next().next().children('td:last-child').text(), 10);<br />
$('form input.table_otions').parent().parent().next().next().children('td:last-child').text(price_third + price_int + ' руб');<br />
<br />
price_four = parseInt($('form input.table_otions').parent().parent().next().next().next().children('td:last-child').text(), 10);<br />
$('form input.table_otions').parent().parent().next().next().next().children('td:last-child').text(price_four + price_int + ' руб');<br />
<br />
$('form input[name="options[form_filling]"]').on('click', function(){<br />
//var price = $(this).parent().parent().children('td:last-child').html();<br />
var price_int = parseInt($(this).parent().parent().children('td:last-child').html(), 10);<br />
<br />
$('#price_id').html( '<span>' + price_int + ' руб</span>');<br />
});<br />
<br />
}else{<br />
//price_actual = $('#price_id span#first').text();<br />
price_actual_int = parseInt($('#price_id span#first').text(), 10);<br />
//price_original = $('#price_id span#second').text();<br />
price_original_int = parseInt($('#price_id span#second').text(), 10);<br />
<br />
discount = price_original_int - price_actual_int;<br />
<br />
price_first = $('form input.table_otions').parent().parent().children('td:last-child').text();<br />
$('form input.table_otions').parent().parent().children('td:last-child').text(price_first + price_actual_int + ' руб');<br />
<br />
price_second = parseInt($('form input.table_otions').parent().parent().next().children('td:last-child').text(), 10);<br />
$('form input.table_otions').parent().parent().next().children('td:last-child').text(price_second + price_actual_int + ' руб');<br />
<br />
price_third = parseInt($('form input.table_otions').parent().parent().next().next().children('td:last-child').text(), 10);<br />
$('form input.table_otions').parent().parent().next().next().children('td:last-child').text(price_third + price_actual_int + ' руб');<br />
<br />
price_four = parseInt($('form input.table_otions').parent().parent().next().next().next().children('td:last-child').text(), 10);<br />
$('form input.table_otions').parent().parent().next().next().next().children('td:last-child').text(price_four + price_actual_int + ' руб');<br />
<br />
$('form input[name="options[form_filling]"]').on('click', function(){<br />
//var price_actual = $(this).parent().parent().children('td:last-child').html();<br />
var price_actual_int = parseInt($(this).parent().parent().children('td:last-child').html(), 10);<br />
var price_original_int = price_actual_int + discount;<br />
<br />
$('#price_id').html( '<span>' + price_actual_int + ' руб</span><span style="text-decoration: line-through">' + price_original_int + ' руб</span>');<br />
});<br />
}<br />
});<br />
</source></div>PilipenkAVhttps://wiki.umisoft.ru/index.php?title=%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D1%86%D0%B5%D0%BD%D1%8B_%D0%B2_%D0%B7%D0%B0%D0%B2%D0%B8%D1%81%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8_%D0%BE%D1%82_%D0%B2%D0%B5%D1%81%D0%B0_%D1%82%D0%BE%D0%B2%D0%B0%D1%80%D0%B0&diff=6610Изменение цены в зависимости от веса товара2013-12-02T08:12:57Z<p>PilipenkAV: Новая страница: «'''Актуально для версии 2.9.1''' ==Задача== Необходимо что бы цена товара менялась в зависимост…»</p>
<hr />
<div>'''Актуально для версии 2.9.1'''<br />
<br />
==Задача==<br />
<br />
Необходимо что бы цена товара менялась в зависимости от выбранного значения веса товара.<br />
<br />
==Решение==<br />
<br />
Для реализации данного функционала нам необходимо что бы при вводе определенного значения веса товара цена динамически менялась без перезагрузки страницы.<br />
<br />
Сначала создадим для товара поле для ввода с типом данных '''"Составное"'''. В модуле '''"Шаблоны данных"''', в '''"Типы данных"''' находим '''"Объект каталога"''' или необходимый нам дочерний тип данных который используется для нашего товара. На примере шаблона ''"Современный интернет-магазин"'' мы добавим такое поле к типу данных '''"Телевизоры"''', в группе полей '''"Характеристики"''' мы изменим тип поля '''"Вес"''' на '''"Составное"'''.</div>PilipenkAVhttps://wiki.umisoft.ru/index.php?title=%D0%A4%D0%BE%D1%80%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BF%D1%80%D0%B0%D0%B9%D1%81_%D0%BB%D0%B8%D1%81%D1%82%D0%B0_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_%D0%BA%D0%B0%D1%82%D0%B0%D0%BB%D0%BE%D0%B3%D0%B0_XSLT&diff=6583Формирование прайс листа на основе каталога XSLT2013-11-11T01:28:43Z<p>PilipenkAV: </p>
<hr />
<div>== Задача ==<br />
<br />
Необходимо сформировать прайс лист на основе имеющегося каталога и выводить его на странице, что бы изменения в каталоге отображались сразу и в прайс листе<br />
<br />
== Решение ==<br />
<br />
Для решения данной задачи сформируем шаблон основанный на макросе '''catalog getCategoryList''' и '''catalog getObjectList'''. Для этого первым делом необходимо убедиться, что у всех разделов и товаров стоят галочки '''Отображать в меню''' и '''Показывать подменю'''. После этого необходимо добавить в главном шаблоне вывод прайс листа строкой:<br />
<source lang="xml"><br />
<xsl:if test=" $document-page-id = 98"><br />
<xsl:apply-templates select="document('udata://catalog/getCategoryList/(notemplate)/36')" mode="price_list" /><br />
</xsl:if><br />
</source><br />
<br />
мы дополнительно поставили проверку на id страницы для которой необходимо выводить прайс лист, его можно узнать, создав в структуре страницу контента для прайс листа и открыв ее для редактирования, в адресной строке браузера.<br />
<br />
Далее создаем в папке ''\templates\demodizzy\xslt\modules\catalog'' файл '''price-list.xsl''' и помещаем туда следующий код:<br />
<source lang="xml"><br />
<?xml version="1.0" encoding="utf-8"?><br />
<!DOCTYPE xsl:stylesheet SYSTEM "ulang://i18n/constants.dtd:file"><br />
<xsl:stylesheet version="1.0"<br />
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"<br />
xmlns:umi="http://www.umi-cms.ru/TR/umi"><br />
<br />
<br />
<!-- price-list --><br />
<!-- level_0 --><br />
<xsl:template match="udata[@module='catalog' and @method = 'getCategoryList']" mode="price_list"><br />
<table class="price_list"><br />
<tr><br />
<td><br />
<p>Наименование</p><br />
</td><br />
<td><br />
<p>Цена</p><br />
</td><br />
</tr><br />
<xsl:apply-templates select="//items/item" mode="price_list"/><br />
</table><br />
<br />
</xsl:template><br />
<br />
<xsl:template match="udata[@method = 'getCategoryList']//item" mode="price_list"><br />
<tr class="price_list_category"><br />
<td colspan="2"><br />
<a href="{@link}" class="price_list"><br />
<span><br />
Раздел <xsl:value-of select="." /><br />
</span><br />
</a><br />
</td><br />
</tr><br />
<br />
<xsl:apply-templates select="document(concat('udata://catalog/getCategoryList/notemplate/', @id))//items/item" mode="include_price_list" /><br />
</xsl:template><br />
<br />
<!-- level_1 --><br />
<xsl:template match="udata[@method = 'getCategoryList']//item" mode="include_price_list"><br />
<tr class="price_list_subcategory"><br />
<td colspan="2"><br />
<a href="{@link}" class="price_list"><br />
<span><br />
Подраздел <xsl:value-of select="." /><br />
</span><br />
</a><br />
</td><br />
</tr><br />
<xsl:apply-templates select="document(concat('udata://catalog/getObjectsList/notemplate/', @id))//item" mode="price_list" /><br />
<xsl:apply-templates select="document(concat('udata://catalog/getCategoryList/notemplate/', @id))//items/item" mode="include_catalog_price_list" /><br />
</xsl:template><br />
<br />
<!-- level_2 --><br />
<xsl:template match="udata[@method = 'getCategoryList']//item" mode="include_catalog_price_list"><br />
<tr class="price_list_subsubcategory"><br />
<td colspan="2"><br />
<a href="{@link}" class="price_list2"><br />
<span><br />
Подподраздел <xsl:value-of select="." /><br />
</span><br />
</a><br />
</td><br />
</tr><br />
</xsl:template><br />
<br />
<xsl:template match="udata[@method = 'getObjectsList']//item" mode="price_list"><br />
<xsl:param name="id" select="./@id" /><br />
<tr class="price_list_subsubcategory"><br />
<td><br />
<a href="{@link}" class="price_list2"><br />
<span><br />
Товар <xsl:value-of select="." /><br />
</span><br />
</a><br />
</td><br />
<td><br />
<xsl:value-of select="document(concat('upage://',$id))//properties/group/property[@name='price']/value" /><xsl:text> руб.</xsl:text><br />
</td><br />
</tr><br />
</xsl:template><br />
<br />
<!-- custom catalog menu end--><br />
<br />
</xsl:stylesheet><br />
</source><br />
<br />
для того, что бы данный шаблон заработал необходимо подключить его в файле '''catalog/common.xsl''' добавив строчку:<br />
<source lang="xml"><br />
<xsl:include href="price-list.xsl" /><br />
</source></div>PilipenkAVhttps://wiki.umisoft.ru/index.php?title=%D0%A4%D0%BE%D1%80%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BF%D1%80%D0%B0%D0%B9%D1%81_%D0%BB%D0%B8%D1%81%D1%82%D0%B0_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_%D0%BA%D0%B0%D1%82%D0%B0%D0%BB%D0%BE%D0%B3%D0%B0_XSLT&diff=6582Формирование прайс листа на основе каталога XSLT2013-11-10T05:38:54Z<p>PilipenkAV: </p>
<hr />
<div>== Задача ==<br />
<br />
Необходимо сформировать прайс лист на основе имеющегося каталога и выводить его на странице, что бы изменения в каталоге отображались сразу и в прайс листе<br />
<br />
== Решение ==<br />
<br />
Для решения данной задачи сформируем шаблон основанный на макросе '''catalog getCategoryList''' и '''catalog getObjectList'''. Для этого первым делом необходимо убедиться, что у всех разделов и товаров стоят галочки '''Отображать в меню''' и '''Показывать подменю'''. После этого необходимо добавить в главном шаблоне вывод прайс листа строкой:<br />
<source lang="xml"><br />
<xsl:if test=" $document-page-id = 98"><br />
<xsl:apply-templates select="document('udata://catalog/getCategoryList/(notemplate)/36')" mode="price_list" /><br />
</xsl:if><br />
</source><br />
<br />
мы дополнительно поставили проверку на id страницы для которой необходимо выводить прайс лист, его можно узнать, создав в структуре страницу контента для прайс листа и открыв ее для редактирования, в адресной строке браузера.<br />
<br />
Далее создаем в папке ''\templates\demodizzy\xslt\modules\catalog'' файл '''price-list.xsl''' и помещаем туда следующий код:<br />
<source lang="xml"><br />
<?xml version="1.0" encoding="utf-8"?><br />
<!DOCTYPE xsl:stylesheet SYSTEM "ulang://i18n/constants.dtd:file"><br />
<xsl:stylesheet version="1.0"<br />
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"<br />
xmlns:umi="http://www.umi-cms.ru/TR/umi"><br />
<br />
<br />
<!-- price-list --><br />
<!-- level_0 --><br />
<xsl:template match="udata[@method = 'getCategoryList']" mode="price_list"><br />
<table class="price_list"><br />
<tr><br />
<td><br />
<p>Наименование</p><br />
</td><br />
<td><br />
<p>Цена</p><br />
</td><br />
</tr><br />
<xsl:apply-templates select="//items/item" mode="price_list"/><br />
</table><br />
<br />
</xsl:template><br />
<br />
<xsl:template match="udata[@method = 'getCategoryList']//item" mode="price_list"><br />
<tr class="price_list_category"><br />
<td colspan="2"><br />
<a href="{@link}" class="price_list"><br />
<span><br />
Раздел <xsl:value-of select="." /><br />
</span><br />
</a><br />
</td><br />
</tr><br />
<br />
<xsl:apply-templates select="document(concat('udata://catalog/getCategoryList/notemplate/', @id))//items/item" mode="include_price_list" /><br />
</xsl:template><br />
<br />
<!-- level_1 --><br />
<xsl:template match="udata[@method = 'getCategoryList']//item" mode="include_price_list"><br />
<tr class="price_list_subcategory"><br />
<td colspan="2"><br />
<a href="{@link}" class="price_list"><br />
<span><br />
&nbsp;&nbsp;&nbsp;&nbsp;Подраздел <xsl:value-of select="." /><br />
</span><br />
</a><br />
</td><br />
</tr><br />
<xsl:apply-templates select="document(concat('udata://catalog/getObjectsList/notemplate/', @id))//item" mode="price_list" /><br />
<xsl:apply-templates select="document(concat('udata://catalog/getCategoryList/notemplate/', @id))//items/item" mode="include_catalog_price_list" /><br />
</xsl:template><br />
<br />
<!-- level_2 --><br />
<xsl:template match="udata[@method = 'getCategoryList']//item" mode="include_catalog_price_list"><br />
<tr class="price_list_subsubcategory"><br />
<td colspan="2"><br />
<a href="{@link}" class="price_list2"><br />
<span><br />
&nbsp;&nbsp;&nbsp;&nbsp;Подподраздел <xsl:value-of select="." /><br />
</span><br />
</a><br />
</td><br />
</tr><br />
</xsl:template><br />
<br />
<xsl:template match="udata[@method = 'getObjectsList']//item" mode="price_list"><br />
<tr class="price_list_subsubcategory"><br />
<td><br />
<a href="{@link}" class="price_list2"><br />
<span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Товар <xsl:value-of select="." /><br />
</span><br />
</a><br />
</td><br />
<td><br />
Стоимость товара<br />
</td><br />
</tr><br />
</xsl:template><br />
<br />
<br />
<!-- custom catalog menu end--><br />
<br />
</xsl:stylesheet><br />
</source></div>PilipenkAVhttps://wiki.umisoft.ru/index.php?title=%D0%A4%D0%BE%D1%80%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BF%D1%80%D0%B0%D0%B9%D1%81_%D0%BB%D0%B8%D1%81%D1%82%D0%B0_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_%D0%BA%D0%B0%D1%82%D0%B0%D0%BB%D0%BE%D0%B3%D0%B0_XSLT&diff=6581Формирование прайс листа на основе каталога XSLT2013-11-10T05:37:39Z<p>PilipenkAV: </p>
<hr />
<div>== Задача ==<br />
<br />
Необходимо сформировать прайс лист на основе имеющегося каталога и выводить его на странице, что бы изменения в каталоге отображались сразу и в прайс листе<br />
<br />
== Решение ==<br />
<br />
Для решения данной задачи сформируем шаблон основанный на макросе '''content menu'''. Для этого первым делом необходимо убедиться, что у всех разделов и товаров стоят галочки '''Отображать в меню''' и '''Показывать подменю'''. После этого необходимо добавить в главном шаблоне вывод прайс листа строкой:<br />
<source lang="xml"><br />
<xsl:if test=" $document-page-id = 98"><br />
<xsl:apply-templates select="document('udata://catalog/getCategoryList/(notemplate)/36')" mode="price_list" /><br />
</xsl:if><br />
</source><br />
<br />
мы дополнительно поставили проверку на id страницы для которой необходимо выводить прайс лист, его можно узнать, создав в структуре страницу контента для прайс листа и открыв ее для редактирования, в адресной строке браузера.<br />
<br />
Далее создаем в папке ''\templates\demodizzy\xslt\modules\catalog'' файл '''price-list.xsl''' и помещаем туда следующий код:<br />
<source lang="xml"><br />
<?xml version="1.0" encoding="utf-8"?><br />
<!DOCTYPE xsl:stylesheet SYSTEM "ulang://i18n/constants.dtd:file"><br />
<xsl:stylesheet version="1.0"<br />
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"<br />
xmlns:umi="http://www.umi-cms.ru/TR/umi"><br />
<br />
<br />
<!-- price-list --><br />
<!-- level_0 --><br />
<xsl:template match="udata[@method = 'getCategoryList']" mode="price_list"><br />
<table class="price_list"><br />
<tr><br />
<td><br />
<p>Наименование</p><br />
</td><br />
<td><br />
<p>Цена</p><br />
</td><br />
</tr><br />
<xsl:apply-templates select="//items/item" mode="price_list"/><br />
</table><br />
<br />
</xsl:template><br />
<br />
<xsl:template match="udata[@method = 'getCategoryList']//item" mode="price_list"><br />
<tr class="price_list_category"><br />
<td colspan="2"><br />
<a href="{@link}" class="price_list"><br />
<span><br />
Раздел <xsl:value-of select="." /><br />
</span><br />
</a><br />
</td><br />
</tr><br />
<br />
<xsl:apply-templates select="document(concat('udata://catalog/getCategoryList/notemplate/', @id))//items/item" mode="include_price_list" /><br />
</xsl:template><br />
<br />
<!-- level_1 --><br />
<xsl:template match="udata[@method = 'getCategoryList']//item" mode="include_price_list"><br />
<tr class="price_list_subcategory"><br />
<td colspan="2"><br />
<a href="{@link}" class="price_list"><br />
<span><br />
&nbsp;&nbsp;&nbsp;&nbsp;Подраздел <xsl:value-of select="." /><br />
</span><br />
</a><br />
</td><br />
</tr><br />
<xsl:apply-templates select="document(concat('udata://catalog/getObjectsList/notemplate/', @id))//item" mode="price_list" /><br />
<xsl:apply-templates select="document(concat('udata://catalog/getCategoryList/notemplate/', @id))//items/item" mode="include_catalog_price_list" /><br />
</xsl:template><br />
<br />
<!-- level_2 --><br />
<xsl:template match="udata[@method = 'getCategoryList']//item" mode="include_catalog_price_list"><br />
<tr class="price_list_subsubcategory"><br />
<td colspan="2"><br />
<a href="{@link}" class="price_list2"><br />
<span><br />
&nbsp;&nbsp;&nbsp;&nbsp;Подподраздел <xsl:value-of select="." /><br />
</span><br />
</a><br />
</td><br />
</tr><br />
</xsl:template><br />
<br />
<xsl:template match="udata[@method = 'getObjectsList']//item" mode="price_list"><br />
<tr class="price_list_subsubcategory"><br />
<td><br />
<a href="{@link}" class="price_list2"><br />
<span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Товар <xsl:value-of select="." /><br />
</span><br />
</a><br />
</td><br />
<td><br />
Стоимость товара<br />
</td><br />
</tr><br />
</xsl:template><br />
<br />
<br />
<!-- custom catalog menu end--><br />
<br />
</xsl:stylesheet><br />
</source></div>PilipenkAVhttps://wiki.umisoft.ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:PilipenkAV&diff=6577Участник:PilipenkAV2013-11-08T11:40:42Z<p>PilipenkAV: </p>
<hr />
<div>== Ноябрь ==<br />
*[[Изменение цены в зависимости от веса товара]]<br />
<br />
== Октябрь: ==<br />
*[[Отключение пагинации для макроса blogs20 postList]]<br />
*[[Отключение активности поста блога при добавлении через postAdd]]<br />
<br />
== Сентябрь: ==<br />
*[[Формирование прайс листа на основе каталога XSLT]]<br />
<br />
== Август: ==<br />
*[[Как редактировать всплывающую форму обратной связи на шаблоне готового сайта]]<br />
<br />
== Актуализированно за август ==<br />
<br />
*[[Изменение количества товаров в корзине tpl]]<br />
*#добавил проверку на нулевое значение<br />
<br />
== Июнь: ==<br />
<br />
*[[Перенос сайта с одного сервера на другой]]<br />
*#создана для перенаправления на существующую статью<br />
*[[Как вывести все товары выбранного раздела каталога вне зависимости от вложенности XSLT]]<br />
*[[Уведомление менеджеру о заказе, со всем необходимыми данными (emarket) XSLT]]<br />
*[[Смена отображения товаров в каталоге таблицей и списком без перезагрузки страницы TPL]]<br />
<br />
== Актуализированно за июнь ==<br />
<br />
*[[Использование модуля GeoIP в XSLT-шаблоне]]<br />
*#добавлена информация в раздел ''' Общая информация ''' о подключении модуля<br />
*#добавлена информация в раздел ''' Примеры использования ''' о подключении шаблона<br />
*#добавлены ссылки на справочную информацию о GeoIP, Google Maps и на Службу Заботы<br />
*[[Эффект jCarousel для фотоальбома TPL]]<br />
*#добавлены категории и плашка 2.9<br />
*[[Эффект jCarousel для фотоальбома XSLT]]<br />
*#добавлены категории и плашка 2.9<br />
*[[Эффекты Lytebox для объектов каталога TPL]]<br />
*#добавлены категории и плашка 2.9<br />
*[[Замена кнопки "Добавить в корзину" сообщением об отсутствии товара TPL]]<br />
*#добавлены категории и плашка 2.9<br />
*[[Как сделать различный вывод разделов, содержащих объекты, и пустых разделов каталога TPL]]<br />
*#Изменено название с указанием шаблонизатора<br />
*[[Уведомление менеджеру о заказе, со всем необходимыми данными (emarket)]]<br />
*#Изменено название с указанием шаблонизатора<br />
*[[ФИО на e-mail менеджеру]]<br />
*#Изменено название с указанием шаблонизатора<br />
*[[Как добавить адрес доставки в письмо ответственному менеджеру о заказе в интернет-магазине?]]<br />
*#Изменено название с указанием шаблонизатора<br />
*[[Работа с корзиной без перезагрузки TPL]]<br />
*#Изменено название с указанием шаблонизатора<br />
*#Отредактировано указание файлов и папок<br />
*#Добавлено предупреждение о проверке на подключение библиотеки jQuery<br />
<br />
== Май: ==<br />
<br />
*[[Эффект jCarousel для фотоальбома TPL]]<br />
*[[Эффект jCarousel для фотоальбома XSLT]]<br />
<br />
== Апрель: ==<br />
<br />
*[[Эффекты Lytebox для объектов каталога TPL]]<br />
*[[Замена кнопки "Добавить в корзину" сообщением об отсутствии товара TPL]]</div>PilipenkAVhttps://wiki.umisoft.ru/index.php?title=%D0%A4%D0%BE%D1%80%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BF%D1%80%D0%B0%D0%B9%D1%81_%D0%BB%D0%B8%D1%81%D1%82%D0%B0_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_%D0%BA%D0%B0%D1%82%D0%B0%D0%BB%D0%BE%D0%B3%D0%B0_XSLT&diff=6574Формирование прайс листа на основе каталога XSLT2013-11-05T07:41:45Z<p>PilipenkAV: </p>
<hr />
<div>== Задача ==<br />
<br />
Необходимо сформировать прайс лист на основе имеющегося каталога и выводить его на странице, что бы изменения в каталоге отображались сразу и в прайс листе<br />
<br />
== Решение ==<br />
<br />
Для решения данной задачи сформируем шаблон основанный на макросе '''content menu'''. Для этого первым делом необходимо убедиться, что у всех разделов и товаров стоят галочки '''Отображать в меню''' и '''Показывать подменю'''. После этого необходимо добавить в главном шаблоне вывод прайс листа строкой:<br />
<source lang="xml"><br />
<xsl:if test=" $document-page-id = 202"><br />
<xsl:apply-templates select="document('udata://content/menu/(null)/5/36')" mode="price_list" /><br />
</xsl:if><br />
</source><br />
<br />
мы дополнительно поставили проверку на id страницы для которой необходимо выводить прайс лист, его можно узнать, создав в структуре страницу контента для прайс листа и открыв ее для редактирования, в адресной строке браузера.<br />
<br />
Далее создаем в папке ''\templates\demodizzy\xslt\modules\catalog'' файл '''price-list.xsl''' и помещаем туда следующий код:<br />
<source lang="xml"><br />
<?xml version="1.0" encoding="utf-8"?><br />
<!DOCTYPE xsl:stylesheet SYSTEM "ulang://i18n/constants.dtd:file"><br />
<xsl:stylesheet version="1.0"<br />
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"<br />
xmlns:umi="http://www.umi-cms.ru/TR/umi"><br />
<br />
<br />
<!-- price-list --><br />
<!-- level_0 --><br />
<xsl:template match="udata[@method = 'getCategoryList']" mode="price_list"><br />
<table class="price_list"><br />
<tr><br />
<td><br />
<p>Наименование</p><br />
</td><br />
<td><br />
<p>Цена</p><br />
</td><br />
</tr><br />
<xsl:apply-templates select="//items/item" mode="price_list"/><br />
</table><br />
<br />
</xsl:template><br />
<br />
<xsl:template match="udata[@method = 'getCategoryList']//item" mode="price_list"><br />
<tr class="price_list_category"><br />
<td colspan="2"><br />
<a href="{@link}" class="price_list"><br />
<span><br />
Раздел <xsl:value-of select="." /><br />
</span><br />
</a><br />
</td><br />
</tr><br />
<br />
<xsl:apply-templates select="document(concat('udata://catalog/getCategoryList/notemplate/', @id))//items/item" mode="include_price_list" /><br />
</xsl:template><br />
<br />
<!-- level_1 --><br />
<xsl:template match="udata[@method = 'getCategoryList']//item" mode="include_price_list"><br />
<tr class="price_list_subcategory"><br />
<td colspan="2"><br />
<a href="{@link}" class="price_list"><br />
<span><br />
&nbsp;&nbsp;&nbsp;&nbsp;Подраздел <xsl:value-of select="." /><br />
</span><br />
</a><br />
</td><br />
</tr><br />
<xsl:apply-templates select="document(concat('udata://catalog/getObjectsList/notemplate/', @id))//item" mode="price_list" /><br />
<xsl:apply-templates select="document(concat('udata://catalog/getCategoryList/notemplate/', @id))//items/item" mode="include_catalog_price_list" /><br />
</xsl:template><br />
<br />
<!-- level_2 --><br />
<xsl:template match="udata[@method = 'getCategoryList']//item" mode="include_catalog_price_list"><br />
<tr class="price_list_subsubcategory"><br />
<td colspan="2"><br />
<a href="{@link}" class="price_list2"><br />
<span><br />
&nbsp;&nbsp;&nbsp;&nbsp;Подподраздел <xsl:value-of select="." /><br />
</span><br />
</a><br />
</td><br />
</tr><br />
</xsl:template><br />
<br />
<xsl:template match="udata[@method = 'getObjectsList']//item" mode="price_list"><br />
<tr class="price_list_subsubcategory"><br />
<td><br />
<a href="{@link}" class="price_list2"><br />
<span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Товар <xsl:value-of select="." /><br />
</span><br />
</a><br />
</td><br />
<td><br />
Стоимость товара<br />
</td><br />
</tr><br />
</xsl:template><br />
<br />
<br />
<!-- custom catalog menu end--><br />
<br />
</xsl:stylesheet><br />
</source></div>PilipenkAVhttps://wiki.umisoft.ru/index.php?title=%D0%A4%D0%BE%D1%80%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BF%D1%80%D0%B0%D0%B9%D1%81_%D0%BB%D0%B8%D1%81%D1%82%D0%B0_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_%D0%BA%D0%B0%D1%82%D0%B0%D0%BB%D0%BE%D0%B3%D0%B0_XSLT&diff=6532Формирование прайс листа на основе каталога XSLT2013-10-31T14:37:35Z<p>PilipenkAV: Новая страница: «== Задача == Необходимо сформировать прайс лист на основе имеющегося каталога и выводить е…»</p>
<hr />
<div>== Задача ==<br />
<br />
Необходимо сформировать прайс лист на основе имеющегося каталога и выводить его на странице, что бы изменения в каталоге отображались сразу и в прайс листе<br />
<br />
== Решение ==<br />
<br />
Для решения данной задачи сформируем шаблон основанный на макросе '''content menu'''. Для этого первым делом необходимо убедиться, что у всех разделов и товаров стоят галочки '''Отображать в меню''' и '''Показывать подменю'''. После этого необходимо добавить в главном шаблоне вывод прайс листа строкой:<br />
<source lang="xml"><br />
<xsl:if test=" $document-page-id = 202"><br />
<xsl:apply-templates select="document('udata://content/menu/(null)/5/36')" mode="price_list" /><br />
</xsl:if><br />
</source><br />
<br />
мы дополнительно поставили проверку на id страницы для которой необходимо выводить прайс лист, его можно узнать, создав в структуре страницу контента для прайс листа и открыв ее для редактирования, в адресной строке браузера.<br />
<br />
Далее создаем в папке ''\templates\demodizzy\xslt\modules\catalog'' файл '''price-list.xsl''' и помещаем туда следующий код:<br />
<source lang="xml"><br />
<?xml version="1.0" encoding="utf-8"?><br />
<!DOCTYPE xsl:stylesheet SYSTEM "ulang://i18n/constants.dtd:file"><br />
<xsl:stylesheet version="1.0"<br />
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"<br />
xmlns:umi="http://www.umi-cms.ru/TR/umi"><br />
<br />
<!-- price-list --><br />
<!-- level_0 --><br />
<xsl:template match="udata[@module = 'content'][@method = 'menu']" mode="price_list"><br />
<br />
<table class="price_list"><br />
<!--textarea><xsl:apply-templates select="items" mode="price_list1"/></textarea--><br />
<xsl:apply-templates select="items" mode="price_list1"/><br />
</table><br />
<br />
</xsl:template><br />
<br />
<xsl:template match="udata[@module = 'content' and @method = 'menu']//items" mode="price_list1"> <br />
<xsl:apply-templates select="item" mode="price_list2"/><br />
</xsl:template><br />
<br />
<xsl:template match="udata[@module = 'content' and @method = 'menu']//item" mode="price_list2"><br />
<textarea><xsl:value-of select="$method" /></textarea><br />
<xsl:choose><br />
<xsl:when test=" $method = 'object' "><br />
<tr class="price_list_catalog_lvl2_name"><br />
<!--td colspan="2"><br />
<a href="{@link}" class="include_price_list2"><br />
<span><br />
<xsl:value-of select="@name" /><br />
<textarea><xsl:copy-of select="@xlink"/></textarea><br />
</span><br />
</a><br />
</td--><br />
<td class="include_catalog_price_list2"><br />
<a href="{@link}" class="include_catalog_price_list2"><br />
<span><br />
<xsl:value-of select="@name" /><br />
</span><br />
</a><br />
</td><br />
<td class="include_catalog_price_list2"><br />
<p><br />
<xsl:value-of select="$item_price"/><br />
</p><br />
</td><br />
</tr><br />
</xsl:when><br />
<xsl:otherwise><br />
<tr class="price_list_catalog_name"><br />
<td colspan="2"><br />
<a href="{@link}" class="price_list2"><br />
<span><br />
<xsl:value-of select="@name" /><br />
</span><br />
</a><br />
</td><br />
</tr><br />
<tr><br />
<td><br />
<p>Наименование</p><br />
</td><br />
<td><br />
<p>Цена</p><br />
</td><br />
</tr><br />
</xsl:otherwise><br />
</xsl:choose><br />
<xsl:apply-templates select="items" mode="include_price_list"/><br />
<br />
</xsl:template><br />
<br />
<!-- level_1 --><br />
<xsl:template match="udata[@module = 'content' and @method = 'menu']//items" mode="include_price_list"><br />
<xsl:apply-templates select="item" mode="include_price_list2"/><br />
</xsl:template><br />
<br />
<xsl:template match="udata[@module = 'content' and @method = 'menu']//item" mode="include_price_list2"><br />
<tr class="price_list_catalog_lvl2_name"><br />
<!--td colspan="2"><br />
<a href="{@link}" class="include_price_list2"><br />
<span><br />
<xsl:value-of select="@name" /><br />
<textarea><xsl:copy-of select="@xlink"/></textarea><br />
</span><br />
</a><br />
</td--><br />
<td class="include_catalog_price_list2"><br />
<a href="{@link}" class="include_catalog_price_list2"><br />
<span><br />
<xsl:value-of select="@name" /><br />
</span><br />
</a><br />
</td><br />
<td class="include_catalog_price_list2"><br />
<p><br />
<xsl:value-of select="$item_price"/><br />
</p><br />
</td><br />
</tr><br />
<xsl:apply-templates select="items" mode="include_catalog_price_list"/><br />
</xsl:template><br />
<br />
<!-- level_2 --><br />
<xsl:template match="udata[@module = 'content' and @method = 'menu']//items" mode="include_catalog_price_list"><br />
<tr class="include_catalog_price_list"><br />
<xsl:apply-templates select="item" mode="include_catalog_price_list2"/><br />
</tr><br />
</xsl:template><br />
<br />
<xsl:template match="udata[@module = 'content' and @method = 'menu']//item" mode="include_catalog_price_list2"><br />
<br />
<tr><br />
<td class="include_catalog_price_list2"><br />
<a href="{@link}" class="include_catalog_price_list2"><br />
<span><br />
<xsl:value-of select="@name" /><br />
</span><br />
</a><br />
</td><br />
<td class="include_catalog_price_list2"><br />
<p><br />
<xsl:value-of select="$item_price"/><br />
</p><br />
</td><br />
</tr><br />
<xsl:apply-templates select="items" mode="item_price"/><br />
</xsl:template><br />
<br />
<!-- level_3 --><br />
<xsl:template match="upage" mode="item_price"><br />
<xsl:apply-templates select="item" mode="inc_cat_price_list2"/><br />
</xsl:template><br />
<br />
<xsl:template match="udata[@module = 'content' and @method = 'menu']//item" mode="inc_cat_price_list2"><br />
<tr><br />
<td colspan="2"><br />
<li><br />
<a href="{@link}" umi:element-id="{@id}" umi:region="row" umi:field-name="name" umi:empty="&empty-section-name;" umi:delete="delete"><br />
<span><br />
<xsl:value-of select="@name" /><br />
</span><br />
</a><br />
<xsl:text> (</xsl:text><br />
<xsl:value-of select="document(concat('udata://catalog/getObjectsList//', @id))/udata/total" /><br />
<xsl:text>)</xsl:text><br />
</li><br />
</td><br />
</tr><br />
</xsl:template><br />
<!-- custom catalog menu end--><br />
<br />
</xsl:stylesheet><br />
</source></div>PilipenkAVhttps://wiki.umisoft.ru/index.php?title=%D0%9E%D1%82%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D0%BF%D0%BE%D1%81%D1%82%D0%B0_%D0%B1%D0%BB%D0%BE%D0%B3%D0%B0_%D0%BF%D1%80%D0%B8_%D0%B4%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B8_%D1%87%D0%B5%D1%80%D0%B5%D0%B7_postAdd&diff=6522Отключение активности поста блога при добавлении через postAdd2013-10-30T19:32:09Z<p>PilipenkAV: </p>
<hr />
<div>'''Актуально для версии 2.9.1'''<br />
<br />
==Задача==<br />
<br />
Необходимо добавлять посты блога неактивными для возможности предварительной модерации.<br />
<br />
==Решение==<br />
<br />
Для добавления постов блога используется макрос '''postAdd''', но там активность страницы не задается. Создадим кастомный метод '''postAddCustom''' где добавим передаваемый параметр в зависимости от которого будет переключатся активность создаваемой страницы. В конечном итоге файл ''\classes\modules\blogs20\__custom.php'' должен иметь следующее содержание:<br />
<source lang="php"><br />
<?php<br />
abstract class __custom_blogs20 extends blogs20 {<br />
//TODO: Write here your own macroses<br />
public function postAddCustom($blogId = false, $template = 'default', $active = false) {<br />
if($blogId === false) {<br />
$iTmp = getRequest('param0');<br />
if($iTmp) $blogId = $iTmp;<br />
else $blogId = getRequest('bid');<br />
}<br />
<br />
$blogId = intval($blogId);<br />
<br />
if($oUsers = cmsController::getInstance()->getModule('users')) {<br />
list($canRead, $canWrite) = permissionsCollection::getInstance()->isAllowedObject($oUsers->user_id, $blogId);<br />
if(!$oUsers->is_auth() || (!$canWrite && $blogId)) {<br />
return false;<br />
}<br />
} else {<br />
return false;<br />
}<br />
<br />
$sTitle = htmlspecialchars(trim(getRequest('title')));<br />
$sContent = htmlspecialchars(trim(getRequest('content')));<br />
if(strlen($sTitle) && strlen($sContent) && $blogId) {<br />
if (!umiCaptcha::checkCaptcha()) {<br />
$this->errorNewMessage("%errors_wrong_captcha%");<br />
$this->errorPanic();<br />
}<br />
if(!($blog = umiHierarchy::getInstance()->getElement($blogId)) ||<br />
($blog->getTypeId() != umiHierarchyTypesCollection::getInstance()->getTypeByName("blogs20", "blog")->getId()) ) {<br />
$this->errorNewMessage('%error_wrong_parent%');<br />
$this->errorPanic();<br />
}<br />
$iFriendsOnly = getRequest('visible_for_friends') ? 1 : 0;<br />
$bActivity = getRequest('draught') ? false : true;<br />
$sTags = getRequest('tags');<br />
$oHierarchy = umiHierarchy::getInstance();<br />
$hierarchy_type_id = umiHierarchyTypesCollection::getInstance()->getTypeByName("blogs20", "post")->getId();<br />
$iPostId = $oHierarchy->addElement($blogId, $hierarchy_type_id, $sTitle, $sTitle);<br />
permissionsCollection::getInstance()->setDefaultPermissions($iPostId);<br />
$oPost = $oHierarchy->getElement($iPostId, true);<br />
<br />
if($active){<br />
if($bActivity) {<br />
$bActivity = antiSpamHelper::checkContent($sContent.$sTitle.$sTags);<br />
}<br />
}else{<br />
$bActivity = false;<br />
}<br />
<br />
$oPost->setIsActive($bActivity);<br />
$oPost->setValue('title', $sTitle);<br />
$oPost->setValue('content', $sContent);<br />
$oPost->setValue('tags', $sTags);<br />
$oPost->setValue('publish_time', new umiDate());<br />
$oPost->setValue('only_for_friends', $iFriendsOnly);<br />
// Raise Event<br />
$oEventPoint = new umiEventPoint("blogs20PostAdded");<br />
$oEventPoint->setMode("after");<br />
$oEventPoint->setParam("id", $iPostId);<br />
$oEventPoint->setParam('template', $template);<br />
$this->setEventPoint($oEventPoint);<br />
// Redirecting<br />
$sRefererUri = getServer('HTTP_REFERER');<br />
if(strlen($sRefererUri)) $this->redirect(str_replace("_err=","",$sRefererUri));<br />
return null;<br />
} else {<br />
if($blogId && !strlen($sTitle) && strlen($sContent)) {<br />
$this->errorNewMessage('Не заполнен заголовок');<br />
} else if($blogId && strlen($sTitle) && !strlen($sContent)) {<br />
$this->errorNewMessage('Не заполнен текст публикации');<br />
}<br />
}<br />
<br />
list($sFormTemplate) = self::loadTemplates('blogs20/'.$template, 'post_add_form');<br />
$aParams = array('action' => '/blogs20/postAdd/'.$blogId.'/',<br />
'id' => 'new',<br />
'title' => '',<br />
'content' => '',<br />
'tags' => '',<br />
'visible_for_friends' => '',<br />
'blog_select' => $this->prepareBlogSelect($blogId, false, $template)<br />
);<br />
return self::parseTemplate($sFormTemplate, $aParams);<br />
}<br />
};<br />
?><br />
</source><br />
<br />
теперь мы можем для добавления постов использовать макрос '''postAddCustom''' в котором будем передавать параметр активности страницы, выглядеть это должно примерно так:<br />
<source lang="xml"><br />
<form name="frm_addblogmsg" method="post" action="/blogs20/postAddCustom/{$document-page-id}/notemplate/0"<br />
onsubmit="site.forms.data.save(this); return site.forms.data.check(this);"><br />
<div class="form_element"><br />
<label class="required"><br />
<span><xsl:text>Ваше Имя:</xsl:text></span><br />
<input type="text" name="title" class="textinputs" /><br />
</label><br />
</div><br />
<div class="form_element"><br />
<label class="required"><br />
<span><xsl:text>Сообщение:</xsl:text></span><br />
<textarea name="content"></textarea><br />
</label><br />
</div><br />
<div class="form_element"><br />
<label><br />
<span><xsl:text>Тэги:</xsl:text></span><br />
<input type="text" name="tags" class="textinputs" /><br />
</label><br />
</div><br />
<xsl:apply-templates select="document('udata://system/captcha')/udata[url]" /><br />
<div class="form_element"><br />
<input type="submit" class="button" value="Добавить сообщение" /><br />
</div><br />
</form><br />
</source><br />
<br />
в атрибуте '''action''' мы передаем ссылку на макрос где указываем последним параметром активность добавляемого поста, в данном случае мы передаем '''"0"''' поэтому добавленный пост будет неактивным и его перед выводом на сайте можно промодерировать в административной части сайта.</div>PilipenkAVhttps://wiki.umisoft.ru/index.php?title=%D0%9E%D1%82%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D0%BF%D0%BE%D1%81%D1%82%D0%B0_%D0%B1%D0%BB%D0%BE%D0%B3%D0%B0_%D0%BF%D1%80%D0%B8_%D0%B4%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B8_%D1%87%D0%B5%D1%80%D0%B5%D0%B7_postAdd&diff=6521Отключение активности поста блога при добавлении через postAdd2013-10-30T19:31:21Z<p>PilipenkAV: </p>
<hr />
<div>'''Актуально для версии 2.9.1'''<br />
<br />
==Задача==<br />
<br />
Необходимо добавлять посты блога неактивными для возможности предварительной модерации.<br />
<br />
==Решение==<br />
<br />
Для добавления постов блога используется макрос '''postAdd''', но там активность страницы не задается. Создадим кастомный метод '''postAddCustom''' где добавим передаваемый параметр в зависимости от которого будет переключатся активность создаваемой страницы. В конечном итоге файл ''\classes\modules\blogs20\__custom.php'' должен иметь следующее содержание:<br />
<source lang="php"><br />
<?php<br />
abstract class __custom_blogs20 extends blogs20 {<br />
//TODO: Write here your own macroses<br />
public function postAddCustom($blogId = false, $template = 'default', $active = false) {<br />
if($blogId === false) {<br />
$iTmp = getRequest('param0');<br />
if($iTmp) $blogId = $iTmp;<br />
else $blogId = getRequest('bid');<br />
}<br />
<br />
$blogId = intval($blogId);<br />
<br />
if($oUsers = cmsController::getInstance()->getModule('users')) {<br />
list($canRead, $canWrite) = permissionsCollection::getInstance()->isAllowedObject($oUsers->user_id, $blogId);<br />
if(!$oUsers->is_auth() || (!$canWrite && $blogId)) {<br />
return false;<br />
}<br />
} else {<br />
return false;<br />
}<br />
<br />
$sTitle = htmlspecialchars(trim(getRequest('title')));<br />
$sContent = htmlspecialchars(trim(getRequest('content')));<br />
if(strlen($sTitle) && strlen($sContent) && $blogId) {<br />
if (!umiCaptcha::checkCaptcha()) {<br />
$this->errorNewMessage("%errors_wrong_captcha%");<br />
$this->errorPanic();<br />
}<br />
if(!($blog = umiHierarchy::getInstance()->getElement($blogId)) ||<br />
($blog->getTypeId() != umiHierarchyTypesCollection::getInstance()->getTypeByName("blogs20", "blog")->getId()) ) {<br />
$this->errorNewMessage('%error_wrong_parent%');<br />
$this->errorPanic();<br />
}<br />
$iFriendsOnly = getRequest('visible_for_friends') ? 1 : 0;<br />
$bActivity = getRequest('draught') ? false : true;<br />
$sTags = getRequest('tags');<br />
$oHierarchy = umiHierarchy::getInstance();<br />
$hierarchy_type_id = umiHierarchyTypesCollection::getInstance()->getTypeByName("blogs20", "post")->getId();<br />
$iPostId = $oHierarchy->addElement($blogId, $hierarchy_type_id, $sTitle, $sTitle);<br />
permissionsCollection::getInstance()->setDefaultPermissions($iPostId);<br />
$oPost = $oHierarchy->getElement($iPostId, true);<br />
<br />
if($active){<br />
if($bActivity) {<br />
$bActivity = antiSpamHelper::checkContent($sContent.$sTitle.$sTags);<br />
}<br />
}else{<br />
$bActivity = false;<br />
}<br />
<br />
$oPost->setIsActive($bActivity);<br />
$oPost->setValue('title', $sTitle);<br />
$oPost->setValue('content', $sContent);<br />
$oPost->setValue('tags', $sTags);<br />
$oPost->setValue('publish_time', new umiDate());<br />
$oPost->setValue('only_for_friends', $iFriendsOnly);<br />
// Raise Event<br />
$oEventPoint = new umiEventPoint("blogs20PostAdded");<br />
$oEventPoint->setMode("after");<br />
$oEventPoint->setParam("id", $iPostId);<br />
$oEventPoint->setParam('template', $template);<br />
$this->setEventPoint($oEventPoint);<br />
// Redirecting<br />
$sRefererUri = getServer('HTTP_REFERER');<br />
if(strlen($sRefererUri)) $this->redirect(str_replace("_err=","",$sRefererUri));<br />
return null;<br />
} else {<br />
if($blogId && !strlen($sTitle) && strlen($sContent)) {<br />
$this->errorNewMessage('Не заполнен заголовок');<br />
} else if($blogId && strlen($sTitle) && !strlen($sContent)) {<br />
$this->errorNewMessage('Не заполнен текст публикации');<br />
}<br />
}<br />
<br />
list($sFormTemplate) = self::loadTemplates('blogs20/'.$template, 'post_add_form');<br />
$aParams = array('action' => '/blogs20/postAdd/'.$blogId.'/',<br />
'id' => 'new',<br />
'title' => '',<br />
'content' => '',<br />
'tags' => '',<br />
'visible_for_friends' => '',<br />
'blog_select' => $this->prepareBlogSelect($blogId, false, $template)<br />
);<br />
return self::parseTemplate($sFormTemplate, $aParams);<br />
}<br />
};<br />
?><br />
</source><br />
<br />
теперь мы можем для добавления постов использовать макрос '''postAddCustom''' в котором будем передавать параметр активности страницы, выглядеть это должно примерно так:<br />
<source lang="xml"><br />
<form name="frm_addblogmsg" method="post" action="/blogs20/postAddCustom/{$document-page-id}/notemplate/0"<br />
onsubmit="site.forms.data.save(this); return site.forms.data.check(this);"><br />
<div class="form_element"><br />
<label class="required"><br />
<span><xsl:text>Ваше Имя:</xsl:text></span><br />
<input type="text" name="title" class="textinputs" /><br />
</label><br />
</div><br />
<div class="form_element"><br />
<label class="required"><br />
<span><xsl:text>Сообщение:</xsl:text></span><br />
<textarea name="content"></textarea><br />
</label><br />
</div><br />
<div class="form_element"><br />
<label><br />
<span><xsl:text>Тэги:</xsl:text></span><br />
<input type="text" name="tags" class="textinputs" /><br />
</label><br />
</div><br />
<xsl:apply-templates select="document('udata://system/captcha')/udata[url]" /><br />
<div class="form_element"><br />
<input type="submit" class="button" value="Добавить сообщение" /><br />
</div><br />
</form><br />
</source><br />
<br />
в атрибуте '''action''' мы передаем ссылку на макрос где указываем последним параметром активность добавляемого поста, в данном случае мы передаем '''0''' поэтому добавленный пост будет неактивным и его перед выводом на сайте можно промодерировать в административной части сайта.</div>PilipenkAVhttps://wiki.umisoft.ru/index.php?title=%D0%9E%D1%82%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D0%BF%D0%BE%D1%81%D1%82%D0%B0_%D0%B1%D0%BB%D0%BE%D0%B3%D0%B0_%D0%BF%D1%80%D0%B8_%D0%B4%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B8_%D1%87%D0%B5%D1%80%D0%B5%D0%B7_postAdd&diff=6495Отключение активности поста блога при добавлении через postAdd2013-10-30T12:05:03Z<p>PilipenkAV: Новая страница: «'''Актуально для версии 2.9.1''' ==Задача== Необходимо добавлять посты блога неактивными для в…»</p>
<hr />
<div>'''Актуально для версии 2.9.1'''<br />
<br />
==Задача==<br />
<br />
Необходимо добавлять посты блога неактивными для возможности предварительной модерации.<br />
<br />
==Решение==<br />
<br />
Для добавления постов блога используется макрос '''postAdd''', но там активность страницы не задается. Создадим кастомный метод '''postAddCustom''' где опишем возможность отключения активности страницы. В файл ''\classes\modules\blogs20\__custom.php'' копируем содержимое метода '''postAdd''' из файла ''\classes\modules\blogs20\class.php''.</div>PilipenkAVhttps://wiki.umisoft.ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:PilipenkAV&diff=6455Участник:PilipenkAV2013-10-21T09:06:15Z<p>PilipenkAV: /* Октябрь: */</p>
<hr />
<div>== Октябрь: ==<br />
*[[Отключение пагинации для макроса blogs20 postList]]<br />
*[[Отключение активности поста блога при добавлении через postAdd]]<br />
<br />
== Сентябрь: ==<br />
*[[Формирование прайс листа на основе каталога XSLT]]<br />
<br />
== Август: ==<br />
*[[Как редактировать всплывающую форму обратной связи на шаблоне готового сайта]]<br />
<br />
== Актуализированно за август ==<br />
<br />
*[[Изменение количества товаров в корзине tpl]]<br />
*#добавил проверку на нулевое значение<br />
<br />
== Июнь: ==<br />
<br />
*[[Перенос сайта с одного сервера на другой]]<br />
*#создана для перенаправления на существующую статью<br />
*[[Как вывести все товары выбранного раздела каталога вне зависимости от вложенности XSLT]]<br />
*[[Уведомление менеджеру о заказе, со всем необходимыми данными (emarket) XSLT]]<br />
*[[Смена отображения товаров в каталоге таблицей и списком без перезагрузки страницы TPL]]<br />
<br />
== Актуализированно за июнь ==<br />
<br />
*[[Использование модуля GeoIP в XSLT-шаблоне]]<br />
*#добавлена информация в раздел ''' Общая информация ''' о подключении модуля<br />
*#добавлена информация в раздел ''' Примеры использования ''' о подключении шаблона<br />
*#добавлены ссылки на справочную информацию о GeoIP, Google Maps и на Службу Заботы<br />
*[[Эффект jCarousel для фотоальбома TPL]]<br />
*#добавлены категории и плашка 2.9<br />
*[[Эффект jCarousel для фотоальбома XSLT]]<br />
*#добавлены категории и плашка 2.9<br />
*[[Эффекты Lytebox для объектов каталога TPL]]<br />
*#добавлены категории и плашка 2.9<br />
*[[Замена кнопки "Добавить в корзину" сообщением об отсутствии товара TPL]]<br />
*#добавлены категории и плашка 2.9<br />
*[[Как сделать различный вывод разделов, содержащих объекты, и пустых разделов каталога TPL]]<br />
*#Изменено название с указанием шаблонизатора<br />
*[[Уведомление менеджеру о заказе, со всем необходимыми данными (emarket)]]<br />
*#Изменено название с указанием шаблонизатора<br />
*[[ФИО на e-mail менеджеру]]<br />
*#Изменено название с указанием шаблонизатора<br />
*[[Как добавить адрес доставки в письмо ответственному менеджеру о заказе в интернет-магазине?]]<br />
*#Изменено название с указанием шаблонизатора<br />
*[[Работа с корзиной без перезагрузки TPL]]<br />
*#Изменено название с указанием шаблонизатора<br />
*#Отредактировано указание файлов и папок<br />
*#Добавлено предупреждение о проверке на подключение библиотеки jQuery<br />
<br />
== Май: ==<br />
<br />
*[[Эффект jCarousel для фотоальбома TPL]]<br />
*[[Эффект jCarousel для фотоальбома XSLT]]<br />
<br />
== Апрель: ==<br />
<br />
*[[Эффекты Lytebox для объектов каталога TPL]]<br />
*[[Замена кнопки "Добавить в корзину" сообщением об отсутствии товара TPL]]</div>PilipenkAVhttps://wiki.umisoft.ru/index.php?title=%D0%9E%D1%82%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%B0%D0%B3%D0%B8%D0%BD%D0%B0%D1%86%D0%B8%D0%B8_%D0%B4%D0%BB%D1%8F_%D0%BC%D0%B0%D0%BA%D1%80%D0%BE%D1%81%D0%B0_blogs20_postList&diff=6403Отключение пагинации для макроса blogs20 postList2013-10-08T13:38:48Z<p>PilipenkAV: </p>
<hr />
<div>'''Актуально для версии 2.9.1'''<br />
<br />
==Задача==<br />
<br />
Требуется выводить список блогов на всех страницах сайта и отключить зависимость от пагинации, что бы все время выводились например только последние добавленные статьи или блоги.<br />
<br />
==Решение==<br />
<br />
Для решения данного вопроса необходимо будет создать кастомный макрос, назовем его '''postsListCustom'''. В файл ''\classes\modules\blogs20\__custom.php'' копируем макрос '''postsList''' из файла ''\classes\modules\blogs20\class.php'' и переименовывае в '''postListCustom'''. Теперь главный момент, надо сделать два изменения, сначала добавить в первой строке, что это расширение класса '''blogs20''' и затем заменить все обращения в макросе к классу '''self::''' на '''def_module::'''. В конечном итоге у нас должен получиться следующий код:<br />
<source lang="php"><br />
<?php<br />
abstract class __custom_blogs20 extends blogs20 {<br />
//TODO: Write here your own macroses<br />
public function postsListCustom($blogId = false, $template = 'default', $limit = false, $page = 0) {<br />
list($sTemplateBlock, $sTemplateLine, $sTemplateEmpty) =<br />
def_module::loadTemplates('blogs20/'.$template, 'posts_list_block', 'posts_list_line', 'posts_list_block_empty');<br />
<br />
if ($page > 0) { $page = 1; }<br />
if ($page == 0) {<br />
$page = (int)getRequest('p');<br />
}<br />
<br />
$oBlog = null;<br />
<br />
$oHierarchy = umiHierarchy::getInstance();<br />
if($blogId == false) {<br />
$iTmp = (int)getRequest('param0');<br />
if($iTmp) $blogId = $iTmp;<br />
}<br />
<br />
$hierarchy_type_id = umiHierarchyTypesCollection::getInstance()->getTypeByName("blogs20", "post")->getId();<br />
<br />
$sel = new selector('pages');<br />
$sel->types('hierarchy-type')->id($hierarchy_type_id);<br />
$sel->where('is_spam')->notequals(1);<br />
<br />
$typesCollection = umiObjectTypesCollection::getInstance();<br />
$typeId = $typesCollection->getTypeByHierarchyTypeId($hierarchy_type_id);<br />
$postType = $typesCollection->getType($typeId);<br />
<br />
if($blogId) {<br />
$oBlog = $oHierarchy->getElement($blogId);<br />
if(!$oBlog) {<br />
throw new publicException(getLabel('error-page-does-not-exist', null, $blogId));<br />
}<br />
}<br />
<br />
if($blogId != false) {<br />
$userId = cmsController::getInstance()->getModule('users')->user_id;<br />
$aFriendList = $oBlog->getValue('friendlist');<br />
$aFriendList[] = umiObjectsCollection::getInstance()->getObjectIdByGUID('system-supervisor');<br />
if($aFriendList === NULL) {<br />
$aFriendList = Array();<br />
}<br />
<br />
$aAuthorList = permissionsCollection::getInstance()->getUsersByElementPermissions($blogId, 2);<br />
$aAuthorList[] = $oBlog->getObject()->getOwnerId();<br />
$sel->where('hierarchy')->page($blogId)->childs(1);<br />
if(!in_array($userId, $aFriendList) && !in_array($userId, $aAuthorList)) {<br />
$sel->where('only_for_friends')->notequals(1);<br />
}<br />
} else {<br />
$sel->where('only_for_friends')->notequals(1);<br />
}<br />
<br />
def_module::applyTimeRange($sel, $postType);<br />
<br />
$sel->order('publish_time')->desc();<br />
<br />
if($limit) {<br />
$sel->limit($page * $limit, $limit);<br />
} else {<br />
$sel->limit($page * $this->posts_per_page, $this->posts_per_page);<br />
}<br />
<br />
$result = $sel->result();<br />
$total = $sel->length();<br />
if(!empty($result)) {<br />
$aLines = array();<br />
foreach($result as $oPost) {<br />
$iPostId = $oPost->getId();<br />
if(!$oPost) continue;<br />
if(!$blogId) {<br />
$oBlog = $oHierarchy->getElement( $oPost->getRel() );<br />
}<br />
$sPostLink = $oHierarchy->getPathById($iPostId, true);<br />
$sBlogLink = $oHierarchy->getPathById($oBlog->getId(), true);<br />
$aLineParam = array();<br />
$aLineParam['attribute:id'] = $iPostId;<br />
$aLineParam['attribute:author_id'] = $oPost->getObject()->getOwnerId();<br />
$aLineParam['name'] = $oPost->getName();<br />
$aLineParam['post_link'] = $sPostLink;<br />
$aLineParam['blog_link'] = $sBlogLink;<br />
$aLineParam['bid'] = $oBlog->getId();<br />
$aLineParam['blog_name'] = $oBlog->getName();<br />
$aLineParam['blog_title'] = $oBlog->getValue('title');<br />
$aLineParam['title'] = $oPost->getValue('title');<br />
$aLineParam['cut'] = system_parse_short_calls($this->prepareCut($oPost->getValue('content'),<br />
$sPostLink, $template), $iPostId);<br />
$aLineParam['subnodes:tags'] = $this->prepareTags($oPost->getValue('tags'), $template);<br />
$aLineParam['comments_count'] = $this->getCommentsCount($iPostId);<br />
$aLineParam['publish_time'] = ($t = $oPost->getValue('publish_time')) ? $t->getFormattedDate('U') : '';<br />
$aLines[] = def_module::parseTemplate($sTemplateLine, $aLineParam, $iPostId);<br />
$this->pushEditable("blogs20", "post", $iPostId);<br />
}<br />
<br />
$aBlockParam = array();<br />
$aBlockParam['void:lines'] = $aBlockParam['subnodes:items'] = $aLines;<br />
$aBlockParam['bid'] = $blogId;<br />
$aBlockParam['per_page'] = $limit ? $limit : $this->posts_per_page;<br />
$aBlockParam['total'] = $total;<br />
<br />
return def_module::parseTemplate($sTemplateBlock, $aBlockParam);<br />
} else {<br />
return def_module::parseTemplate($sTemplateEmpty, array('bid'=>$blogId));<br />
}<br />
}<br />
};<br />
?><br />
<br />
</source><br />
<br />
Помимо всего выше перечисленного мы добавили четвертую передаваемую переменную '''$page''' от значения которой будет включаться или выключаться пагинация. Мы видим, что при передаваемом значении больше нуля пагинация будет отключена. Теперь мы можем добавить макрос вывода блогов или статей блога макросом blogs20 postListCustom и для отключения пагинации добавить четвертым передаваемым значением число 1.</div>PilipenkAVhttps://wiki.umisoft.ru/index.php?title=%D0%9E%D1%82%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%B0%D0%B3%D0%B8%D0%BD%D0%B0%D1%86%D0%B8%D0%B8_%D0%B4%D0%BB%D1%8F_%D0%BC%D0%B0%D0%BA%D1%80%D0%BE%D1%81%D0%B0_blogs20_postList&diff=6402Отключение пагинации для макроса blogs20 postList2013-10-08T13:37:59Z<p>PilipenkAV: </p>
<hr />
<div>'''Актуально для версии 2.9.1'''<br />
<br />
==Задача==<br />
<br />
Требуется выводить список блогов на всех страницах сайта и отключить зависимость от пагинации, что бы все время выводились например только последние добавленные статьи или блоги.<br />
<br />
==Решение==<br />
<br />
Для решения данного вопроса необходимо будет создать кастомный макрос, назовем его '''postsListCustom'''. В файл ''\classes\modules\blogs20\__custom.php'' копируем макрос '''postsList''' из файла ''\classes\modules\blogs20\class.php'' и переименовывае в '''postListCustom'''. Теперь главный момент, надо сделать два изменения, сначала добавить в первой строке, что это расширение класса '''blogs20''' и заменить все обращения в макросе к классу '''self::''' на '''def_module::'''. В конечном итоге у нас должен получиться следующий код:<br />
<source lang="php"><br />
<?php<br />
abstract class __custom_blogs20 extends blogs20 {<br />
//TODO: Write here your own macroses<br />
public function postsListCustom($blogId = false, $template = 'default', $limit = false, $page = 0) {<br />
list($sTemplateBlock, $sTemplateLine, $sTemplateEmpty) =<br />
def_module::loadTemplates('blogs20/'.$template, 'posts_list_block', 'posts_list_line', 'posts_list_block_empty');<br />
<br />
if ($page > 0) { $page = 1; }<br />
if ($page == 0) {<br />
$page = (int)getRequest('p');<br />
}<br />
<br />
$oBlog = null;<br />
<br />
$oHierarchy = umiHierarchy::getInstance();<br />
if($blogId == false) {<br />
$iTmp = (int)getRequest('param0');<br />
if($iTmp) $blogId = $iTmp;<br />
}<br />
<br />
$hierarchy_type_id = umiHierarchyTypesCollection::getInstance()->getTypeByName("blogs20", "post")->getId();<br />
<br />
$sel = new selector('pages');<br />
$sel->types('hierarchy-type')->id($hierarchy_type_id);<br />
$sel->where('is_spam')->notequals(1);<br />
<br />
$typesCollection = umiObjectTypesCollection::getInstance();<br />
$typeId = $typesCollection->getTypeByHierarchyTypeId($hierarchy_type_id);<br />
$postType = $typesCollection->getType($typeId);<br />
<br />
if($blogId) {<br />
$oBlog = $oHierarchy->getElement($blogId);<br />
if(!$oBlog) {<br />
throw new publicException(getLabel('error-page-does-not-exist', null, $blogId));<br />
}<br />
}<br />
<br />
if($blogId != false) {<br />
$userId = cmsController::getInstance()->getModule('users')->user_id;<br />
$aFriendList = $oBlog->getValue('friendlist');<br />
$aFriendList[] = umiObjectsCollection::getInstance()->getObjectIdByGUID('system-supervisor');<br />
if($aFriendList === NULL) {<br />
$aFriendList = Array();<br />
}<br />
<br />
$aAuthorList = permissionsCollection::getInstance()->getUsersByElementPermissions($blogId, 2);<br />
$aAuthorList[] = $oBlog->getObject()->getOwnerId();<br />
$sel->where('hierarchy')->page($blogId)->childs(1);<br />
if(!in_array($userId, $aFriendList) && !in_array($userId, $aAuthorList)) {<br />
$sel->where('only_for_friends')->notequals(1);<br />
}<br />
} else {<br />
$sel->where('only_for_friends')->notequals(1);<br />
}<br />
<br />
def_module::applyTimeRange($sel, $postType);<br />
<br />
$sel->order('publish_time')->desc();<br />
<br />
if($limit) {<br />
$sel->limit($page * $limit, $limit);<br />
} else {<br />
$sel->limit($page * $this->posts_per_page, $this->posts_per_page);<br />
}<br />
<br />
$result = $sel->result();<br />
$total = $sel->length();<br />
if(!empty($result)) {<br />
$aLines = array();<br />
foreach($result as $oPost) {<br />
$iPostId = $oPost->getId();<br />
if(!$oPost) continue;<br />
if(!$blogId) {<br />
$oBlog = $oHierarchy->getElement( $oPost->getRel() );<br />
}<br />
$sPostLink = $oHierarchy->getPathById($iPostId, true);<br />
$sBlogLink = $oHierarchy->getPathById($oBlog->getId(), true);<br />
$aLineParam = array();<br />
$aLineParam['attribute:id'] = $iPostId;<br />
$aLineParam['attribute:author_id'] = $oPost->getObject()->getOwnerId();<br />
$aLineParam['name'] = $oPost->getName();<br />
$aLineParam['post_link'] = $sPostLink;<br />
$aLineParam['blog_link'] = $sBlogLink;<br />
$aLineParam['bid'] = $oBlog->getId();<br />
$aLineParam['blog_name'] = $oBlog->getName();<br />
$aLineParam['blog_title'] = $oBlog->getValue('title');<br />
$aLineParam['title'] = $oPost->getValue('title');<br />
$aLineParam['cut'] = system_parse_short_calls($this->prepareCut($oPost->getValue('content'),<br />
$sPostLink, $template), $iPostId);<br />
$aLineParam['subnodes:tags'] = $this->prepareTags($oPost->getValue('tags'), $template);<br />
$aLineParam['comments_count'] = $this->getCommentsCount($iPostId);<br />
$aLineParam['publish_time'] = ($t = $oPost->getValue('publish_time')) ? $t->getFormattedDate('U') : '';<br />
$aLines[] = def_module::parseTemplate($sTemplateLine, $aLineParam, $iPostId);<br />
$this->pushEditable("blogs20", "post", $iPostId);<br />
}<br />
<br />
$aBlockParam = array();<br />
$aBlockParam['void:lines'] = $aBlockParam['subnodes:items'] = $aLines;<br />
$aBlockParam['bid'] = $blogId;<br />
$aBlockParam['per_page'] = $limit ? $limit : $this->posts_per_page;<br />
$aBlockParam['total'] = $total;<br />
<br />
return def_module::parseTemplate($sTemplateBlock, $aBlockParam);<br />
} else {<br />
return def_module::parseTemplate($sTemplateEmpty, array('bid'=>$blogId));<br />
}<br />
}<br />
};<br />
?><br />
<br />
</source><br />
<br />
Помимо всего выше перечисленного мы добавили четвертую передаваемую переменную '''$page''' от значения которой будет включаться или выключаться пагинация. Мы видим, что при передаваемом значении больше нуля пагинация будет отключена. Теперь мы можем добавить макрос вывода блогов или статей блога макросом blogs20 postListCustom и для отключения пагинации добавить четвертым передаваемым значением число 1.</div>PilipenkAVhttps://wiki.umisoft.ru/index.php?title=%D0%9E%D1%82%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%B0%D0%B3%D0%B8%D0%BD%D0%B0%D1%86%D0%B8%D0%B8_%D0%B4%D0%BB%D1%8F_%D0%BC%D0%B0%D0%BA%D1%80%D0%BE%D1%81%D0%B0_blogs20_postList&diff=6401Отключение пагинации для макроса blogs20 postList2013-10-08T13:37:14Z<p>PilipenkAV: </p>
<hr />
<div>'''Актуально для версии 2.9.1'''<br />
<br />
==Задача==<br />
<br />
Требуется выводить список блогов на всех страницах сайта и отключить зависимость от пагинации, что бы все время выводились например только последние добавленные статьи или блоги.<br />
<br />
==Решение==<br />
<br />
Для решения данного вопроса необходимо будет создать кастомный макрос, назовем его '''postsListCustom'''. В файл ''\classes\modules\blogs20\__custom.php'' копируем макрос '''postsList''' из файла ''\classes\modules\blogs20\class.php'' и переименовывае в '''postListCustom'''. Теперь главный момент, надо сделать два изменения, сначала добавить в первой строке, что это расширение класса '''blogs20''' и заменить все обращения в макросе к классу '''self::''' на '''def_module::'''. В конечном итоге у нас должен получиться следующий код:<br />
<source lang="php"><br />
<?php<br />
abstract class __custom_blogs20 extends blogs20 {<br />
//TODO: Write here your own macroses<br />
public function postsListCustom($blogId = false, $template = 'default', $limit = false, $page) {<br />
list($sTemplateBlock, $sTemplateLine, $sTemplateEmpty) =<br />
def_module::loadTemplates('blogs20/'.$template, 'posts_list_block', 'posts_list_line', 'posts_list_block_empty');<br />
<br />
if ($page > 0) { $page = 1; }<br />
if ($page == 0) {<br />
$page = (int)getRequest('p');<br />
}<br />
<br />
$oBlog = null;<br />
<br />
$oHierarchy = umiHierarchy::getInstance();<br />
if($blogId == false) {<br />
$iTmp = (int)getRequest('param0');<br />
if($iTmp) $blogId = $iTmp;<br />
}<br />
<br />
$hierarchy_type_id = umiHierarchyTypesCollection::getInstance()->getTypeByName("blogs20", "post")->getId();<br />
<br />
$sel = new selector('pages');<br />
$sel->types('hierarchy-type')->id($hierarchy_type_id);<br />
$sel->where('is_spam')->notequals(1);<br />
<br />
$typesCollection = umiObjectTypesCollection::getInstance();<br />
$typeId = $typesCollection->getTypeByHierarchyTypeId($hierarchy_type_id);<br />
$postType = $typesCollection->getType($typeId);<br />
<br />
if($blogId) {<br />
$oBlog = $oHierarchy->getElement($blogId);<br />
if(!$oBlog) {<br />
throw new publicException(getLabel('error-page-does-not-exist', null, $blogId));<br />
}<br />
}<br />
<br />
if($blogId != false) {<br />
$userId = cmsController::getInstance()->getModule('users')->user_id;<br />
$aFriendList = $oBlog->getValue('friendlist');<br />
$aFriendList[] = umiObjectsCollection::getInstance()->getObjectIdByGUID('system-supervisor');<br />
if($aFriendList === NULL) {<br />
$aFriendList = Array();<br />
}<br />
<br />
$aAuthorList = permissionsCollection::getInstance()->getUsersByElementPermissions($blogId, 2);<br />
$aAuthorList[] = $oBlog->getObject()->getOwnerId();<br />
$sel->where('hierarchy')->page($blogId)->childs(1);<br />
if(!in_array($userId, $aFriendList) && !in_array($userId, $aAuthorList)) {<br />
$sel->where('only_for_friends')->notequals(1);<br />
}<br />
} else {<br />
$sel->where('only_for_friends')->notequals(1);<br />
}<br />
<br />
def_module::applyTimeRange($sel, $postType);<br />
<br />
$sel->order('publish_time')->desc();<br />
<br />
if($limit) {<br />
$sel->limit($page * $limit, $limit);<br />
} else {<br />
$sel->limit($page * $this->posts_per_page, $this->posts_per_page);<br />
}<br />
<br />
$result = $sel->result();<br />
$total = $sel->length();<br />
if(!empty($result)) {<br />
$aLines = array();<br />
foreach($result as $oPost) {<br />
$iPostId = $oPost->getId();<br />
if(!$oPost) continue;<br />
if(!$blogId) {<br />
$oBlog = $oHierarchy->getElement( $oPost->getRel() );<br />
}<br />
$sPostLink = $oHierarchy->getPathById($iPostId, true);<br />
$sBlogLink = $oHierarchy->getPathById($oBlog->getId(), true);<br />
$aLineParam = array();<br />
$aLineParam['attribute:id'] = $iPostId;<br />
$aLineParam['attribute:author_id'] = $oPost->getObject()->getOwnerId();<br />
$aLineParam['name'] = $oPost->getName();<br />
$aLineParam['post_link'] = $sPostLink;<br />
$aLineParam['blog_link'] = $sBlogLink;<br />
$aLineParam['bid'] = $oBlog->getId();<br />
$aLineParam['blog_name'] = $oBlog->getName();<br />
$aLineParam['blog_title'] = $oBlog->getValue('title');<br />
$aLineParam['title'] = $oPost->getValue('title');<br />
$aLineParam['cut'] = system_parse_short_calls($this->prepareCut($oPost->getValue('content'),<br />
$sPostLink, $template), $iPostId);<br />
$aLineParam['subnodes:tags'] = $this->prepareTags($oPost->getValue('tags'), $template);<br />
$aLineParam['comments_count'] = $this->getCommentsCount($iPostId);<br />
$aLineParam['publish_time'] = ($t = $oPost->getValue('publish_time')) ? $t->getFormattedDate('U') : '';<br />
$aLines[] = def_module::parseTemplate($sTemplateLine, $aLineParam, $iPostId);<br />
$this->pushEditable("blogs20", "post", $iPostId);<br />
}<br />
<br />
$aBlockParam = array();<br />
$aBlockParam['void:lines'] = $aBlockParam['subnodes:items'] = $aLines;<br />
$aBlockParam['bid'] = $blogId;<br />
$aBlockParam['per_page'] = $limit ? $limit : $this->posts_per_page;<br />
$aBlockParam['total'] = $total;<br />
<br />
return def_module::parseTemplate($sTemplateBlock, $aBlockParam);<br />
} else {<br />
return def_module::parseTemplate($sTemplateEmpty, array('bid'=>$blogId));<br />
}<br />
}<br />
};<br />
?><br />
<br />
</source><br />
<br />
Помимо всего выше перечисленного мы добавили четвертую передаваемую переменную '''$page''' от значения которой будет включаться или выключаться пагинация. Мы видим, что при передаваемом значении больше нуля пагинация будет отключена. Теперь мы можем добавить макрос вывода блогов или статей блога макросом blogs20 postListCustom и для отключения пагинации добавить четвертым передаваемым значением число 1.</div>PilipenkAVhttps://wiki.umisoft.ru/index.php?title=%D0%9E%D1%82%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%B0%D0%B3%D0%B8%D0%BD%D0%B0%D1%86%D0%B8%D0%B8_%D0%B4%D0%BB%D1%8F_%D0%BC%D0%B0%D0%BA%D1%80%D0%BE%D1%81%D0%B0_blogs20_postList&diff=6400Отключение пагинации для макроса blogs20 postList2013-10-08T13:36:21Z<p>PilipenkAV: </p>
<hr />
<div>'''Актуально для версии 2.9.1'''<br />
<br />
==Задача==<br />
<br />
Требуется выводить список блогов на всех страницах сайта и отключить зависимость от пагинации, что бы все время выводились например только последние добавленные статьи или блоги.<br />
<br />
==Решение==<br />
<br />
Для решения данного вопроса необходимо будет создать кастомный макрос, назовем его '''postsListCustom'''. В файл ''\classes\modules\blogs20\__custom.php'' копируем макрос '''postsList''' из файла ''\classes\modules\blogs20\class.php'' и переименовывае в '''postListCustom'''. Теперь главный момент, надо сделать два изменения, сначала добавить в первой строке, что это расширение класса '''blogs20''' и заменить все обращения в макросе к классу '''self::''' на '''def_module::'''. В конечном итоге у нас должен получиться следующий код:<br />
<source lang="php"><br />
<?php<br />
abstract class __custom_blogs20 extends blogs20 {<br />
//TODO: Write here your own macroses<br />
public function postsListCustom($blogId = false, $template = 'default', $limit = false, $page) {<br />
list($sTemplateBlock, $sTemplateLine, $sTemplateEmpty) =<br />
def_module::loadTemplates('blogs20/'.$template, 'posts_list_block', 'posts_list_line', 'posts_list_block_empty');<br />
<br />
if ($page > 0) { $page = 1; }<br />
if ($page === 0) {<br />
$page = (int)getRequest('p');<br />
}else{<br />
$page = 0;<br />
}<br />
<br />
$oBlog = null;<br />
<br />
$oHierarchy = umiHierarchy::getInstance();<br />
if($blogId == false) {<br />
$iTmp = (int)getRequest('param0');<br />
if($iTmp) $blogId = $iTmp;<br />
}<br />
<br />
$hierarchy_type_id = umiHierarchyTypesCollection::getInstance()->getTypeByName("blogs20", "post")->getId();<br />
<br />
$sel = new selector('pages');<br />
$sel->types('hierarchy-type')->id($hierarchy_type_id);<br />
$sel->where('is_spam')->notequals(1);<br />
<br />
$typesCollection = umiObjectTypesCollection::getInstance();<br />
$typeId = $typesCollection->getTypeByHierarchyTypeId($hierarchy_type_id);<br />
$postType = $typesCollection->getType($typeId);<br />
<br />
if($blogId) {<br />
$oBlog = $oHierarchy->getElement($blogId);<br />
if(!$oBlog) {<br />
throw new publicException(getLabel('error-page-does-not-exist', null, $blogId));<br />
}<br />
}<br />
<br />
if($blogId != false) {<br />
$userId = cmsController::getInstance()->getModule('users')->user_id;<br />
$aFriendList = $oBlog->getValue('friendlist');<br />
$aFriendList[] = umiObjectsCollection::getInstance()->getObjectIdByGUID('system-supervisor');<br />
if($aFriendList === NULL) {<br />
$aFriendList = Array();<br />
}<br />
<br />
$aAuthorList = permissionsCollection::getInstance()->getUsersByElementPermissions($blogId, 2);<br />
$aAuthorList[] = $oBlog->getObject()->getOwnerId();<br />
$sel->where('hierarchy')->page($blogId)->childs(1);<br />
if(!in_array($userId, $aFriendList) && !in_array($userId, $aAuthorList)) {<br />
$sel->where('only_for_friends')->notequals(1);<br />
}<br />
} else {<br />
$sel->where('only_for_friends')->notequals(1);<br />
}<br />
<br />
def_module::applyTimeRange($sel, $postType);<br />
<br />
$sel->order('publish_time')->desc();<br />
<br />
if($limit) {<br />
$sel->limit($page * $limit, $limit);<br />
} else {<br />
$sel->limit($page * $this->posts_per_page, $this->posts_per_page);<br />
}<br />
<br />
$result = $sel->result();<br />
$total = $sel->length();<br />
if(!empty($result)) {<br />
$aLines = array();<br />
foreach($result as $oPost) {<br />
$iPostId = $oPost->getId();<br />
if(!$oPost) continue;<br />
if(!$blogId) {<br />
$oBlog = $oHierarchy->getElement( $oPost->getRel() );<br />
}<br />
$sPostLink = $oHierarchy->getPathById($iPostId, true);<br />
$sBlogLink = $oHierarchy->getPathById($oBlog->getId(), true);<br />
$aLineParam = array();<br />
$aLineParam['attribute:id'] = $iPostId;<br />
$aLineParam['attribute:author_id'] = $oPost->getObject()->getOwnerId();<br />
$aLineParam['name'] = $oPost->getName();<br />
$aLineParam['post_link'] = $sPostLink;<br />
$aLineParam['blog_link'] = $sBlogLink;<br />
$aLineParam['bid'] = $oBlog->getId();<br />
$aLineParam['blog_name'] = $oBlog->getName();<br />
$aLineParam['blog_title'] = $oBlog->getValue('title');<br />
$aLineParam['title'] = $oPost->getValue('title');<br />
$aLineParam['cut'] = system_parse_short_calls($this->prepareCut($oPost->getValue('content'),<br />
$sPostLink, $template), $iPostId);<br />
$aLineParam['subnodes:tags'] = $this->prepareTags($oPost->getValue('tags'), $template);<br />
$aLineParam['comments_count'] = $this->getCommentsCount($iPostId);<br />
$aLineParam['publish_time'] = ($t = $oPost->getValue('publish_time')) ? $t->getFormattedDate('U') : '';<br />
$aLines[] = def_module::parseTemplate($sTemplateLine, $aLineParam, $iPostId);<br />
$this->pushEditable("blogs20", "post", $iPostId);<br />
}<br />
<br />
$aBlockParam = array();<br />
$aBlockParam['void:lines'] = $aBlockParam['subnodes:items'] = $aLines;<br />
$aBlockParam['bid'] = $blogId;<br />
$aBlockParam['per_page'] = $limit ? $limit : $this->posts_per_page;<br />
$aBlockParam['total'] = $total;<br />
<br />
return def_module::parseTemplate($sTemplateBlock, $aBlockParam);<br />
} else {<br />
return def_module::parseTemplate($sTemplateEmpty, array('bid'=>$blogId));<br />
}<br />
}<br />
};<br />
?><br />
<br />
</source><br />
<br />
Помимо всего выше перечисленного мы добавили четвертую передаваемую переменную '''$page''' от значения которой будет включаться или выключаться пагинация. Мы видим, что при передаваемом значении больше нуля пагинация будет отключена. Теперь мы можем добавить макрос вывода блогов или статей блога макросом blogs20 postListCustom и для отключения пагинации добавить четвертым передаваемым значением число 1.</div>PilipenkAVhttps://wiki.umisoft.ru/index.php?title=%D0%9E%D1%82%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%B0%D0%B3%D0%B8%D0%BD%D0%B0%D1%86%D0%B8%D0%B8_%D0%B4%D0%BB%D1%8F_%D0%BC%D0%B0%D0%BA%D1%80%D0%BE%D1%81%D0%B0_blogs20_postList&diff=6399Отключение пагинации для макроса blogs20 postList2013-10-08T05:48:45Z<p>PilipenkAV: Новая страница: «'''Актуально для версии 2.9.1''' ==Задача== Требуется выводить список блогов на всех страницах …»</p>
<hr />
<div>'''Актуально для версии 2.9.1'''<br />
<br />
==Задача==<br />
<br />
Требуется выводить список блогов на всех страницах сайта и отключить зависимость от пагинации, что бы все время выводились например только последние добавленные статьи или блоги.<br />
<br />
==Решение==<br />
<br />
Для решения данного вопроса необходимо будет создать кастомный макрос, назовем его '''postsListCustom'''. В файл ''\classes\modules\blogs20\__custom.php'' копируем макрос '''postsList''' из файла ''\classes\modules\blogs20\class.php'' и переименовывае в '''postListCustom'''. Теперь главный момент, надо сделать два изменения, сначала добавить в первой строке, что это расширение класса '''blogs20''' и заменить все обращения в макросе к классу '''self::''' на '''def_module::'''. В конечном итоге у нас должен получиться следующий код:<br />
<source lang="php"><br />
<br />
</source></div>PilipenkAVhttps://wiki.umisoft.ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:PilipenkAV&diff=6398Участник:PilipenkAV2013-10-08T05:23:15Z<p>PilipenkAV: /* Сентябрь: */</p>
<hr />
<div>== Октябрь: ==<br />
*[[Отключение пагинации для макроса blogs20 postList]]<br />
<br />
== Сентябрь: ==<br />
*[[Формирование прайс листа на основе каталога XSLT]]<br />
<br />
== Август: ==<br />
*[[Как редактировать всплывающую форму обратной связи на шаблоне готового сайта]]<br />
<br />
== Актуализированно за август ==<br />
<br />
*[[Изменение количества товаров в корзине tpl]]<br />
*#добавил проверку на нулевое значение<br />
<br />
== Июнь: ==<br />
<br />
*[[Перенос сайта с одного сервера на другой]]<br />
*#создана для перенаправления на существующую статью<br />
*[[Как вывести все товары выбранного раздела каталога вне зависимости от вложенности XSLT]]<br />
*[[Уведомление менеджеру о заказе, со всем необходимыми данными (emarket) XSLT]]<br />
*[[Смена отображения товаров в каталоге таблицей и списком без перезагрузки страницы TPL]]<br />
<br />
== Актуализированно за июнь ==<br />
<br />
*[[Использование модуля GeoIP в XSLT-шаблоне]]<br />
*#добавлена информация в раздел ''' Общая информация ''' о подключении модуля<br />
*#добавлена информация в раздел ''' Примеры использования ''' о подключении шаблона<br />
*#добавлены ссылки на справочную информацию о GeoIP, Google Maps и на Службу Заботы<br />
*[[Эффект jCarousel для фотоальбома TPL]]<br />
*#добавлены категории и плашка 2.9<br />
*[[Эффект jCarousel для фотоальбома XSLT]]<br />
*#добавлены категории и плашка 2.9<br />
*[[Эффекты Lytebox для объектов каталога TPL]]<br />
*#добавлены категории и плашка 2.9<br />
*[[Замена кнопки "Добавить в корзину" сообщением об отсутствии товара TPL]]<br />
*#добавлены категории и плашка 2.9<br />
*[[Как сделать различный вывод разделов, содержащих объекты, и пустых разделов каталога TPL]]<br />
*#Изменено название с указанием шаблонизатора<br />
*[[Уведомление менеджеру о заказе, со всем необходимыми данными (emarket)]]<br />
*#Изменено название с указанием шаблонизатора<br />
*[[ФИО на e-mail менеджеру]]<br />
*#Изменено название с указанием шаблонизатора<br />
*[[Как добавить адрес доставки в письмо ответственному менеджеру о заказе в интернет-магазине?]]<br />
*#Изменено название с указанием шаблонизатора<br />
*[[Работа с корзиной без перезагрузки TPL]]<br />
*#Изменено название с указанием шаблонизатора<br />
*#Отредактировано указание файлов и папок<br />
*#Добавлено предупреждение о проверке на подключение библиотеки jQuery<br />
<br />
== Май: ==<br />
<br />
*[[Эффект jCarousel для фотоальбома TPL]]<br />
*[[Эффект jCarousel для фотоальбома XSLT]]<br />
<br />
== Апрель: ==<br />
<br />
*[[Эффекты Lytebox для объектов каталога TPL]]<br />
*[[Замена кнопки "Добавить в корзину" сообщением об отсутствии товара TPL]]</div>PilipenkAVhttps://wiki.umisoft.ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:PilipenkAV&diff=6380Участник:PilipenkAV2013-10-01T07:30:51Z<p>PilipenkAV: /* Сентябрь: */</p>
<hr />
<div>== Сентябрь: ==<br />
*[[Формирование прайс листа на основе каталога XSLT]]<br />
<br />
== Август: ==<br />
*[[Как редактировать всплывающую форму обратной связи на шаблоне готового сайта]]<br />
<br />
== Актуализированно за август ==<br />
<br />
*[[Изменение количества товаров в корзине tpl]]<br />
*#добавил проверку на нулевое значение<br />
<br />
== Июнь: ==<br />
<br />
*[[Перенос сайта с одного сервера на другой]]<br />
*#создана для перенаправления на существующую статью<br />
*[[Как вывести все товары выбранного раздела каталога вне зависимости от вложенности XSLT]]<br />
*[[Уведомление менеджеру о заказе, со всем необходимыми данными (emarket) XSLT]]<br />
*[[Смена отображения товаров в каталоге таблицей и списком без перезагрузки страницы TPL]]<br />
<br />
== Актуализированно за июнь ==<br />
<br />
*[[Использование модуля GeoIP в XSLT-шаблоне]]<br />
*#добавлена информация в раздел ''' Общая информация ''' о подключении модуля<br />
*#добавлена информация в раздел ''' Примеры использования ''' о подключении шаблона<br />
*#добавлены ссылки на справочную информацию о GeoIP, Google Maps и на Службу Заботы<br />
*[[Эффект jCarousel для фотоальбома TPL]]<br />
*#добавлены категории и плашка 2.9<br />
*[[Эффект jCarousel для фотоальбома XSLT]]<br />
*#добавлены категории и плашка 2.9<br />
*[[Эффекты Lytebox для объектов каталога TPL]]<br />
*#добавлены категории и плашка 2.9<br />
*[[Замена кнопки "Добавить в корзину" сообщением об отсутствии товара TPL]]<br />
*#добавлены категории и плашка 2.9<br />
*[[Как сделать различный вывод разделов, содержащих объекты, и пустых разделов каталога TPL]]<br />
*#Изменено название с указанием шаблонизатора<br />
*[[Уведомление менеджеру о заказе, со всем необходимыми данными (emarket)]]<br />
*#Изменено название с указанием шаблонизатора<br />
*[[ФИО на e-mail менеджеру]]<br />
*#Изменено название с указанием шаблонизатора<br />
*[[Как добавить адрес доставки в письмо ответственному менеджеру о заказе в интернет-магазине?]]<br />
*#Изменено название с указанием шаблонизатора<br />
*[[Работа с корзиной без перезагрузки TPL]]<br />
*#Изменено название с указанием шаблонизатора<br />
*#Отредактировано указание файлов и папок<br />
*#Добавлено предупреждение о проверке на подключение библиотеки jQuery<br />
<br />
== Май: ==<br />
<br />
*[[Эффект jCarousel для фотоальбома TPL]]<br />
*[[Эффект jCarousel для фотоальбома XSLT]]<br />
<br />
== Апрель: ==<br />
<br />
*[[Эффекты Lytebox для объектов каталога TPL]]<br />
*[[Замена кнопки "Добавить в корзину" сообщением об отсутствии товара TPL]]</div>PilipenkAVhttps://wiki.umisoft.ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:PilipenkAV&diff=6379Участник:PilipenkAV2013-09-30T14:09:52Z<p>PilipenkAV: /* Сентябрь: */</p>
<hr />
<div>== Сентябрь: ==<br />
<br />
== Август: ==<br />
*[[Как редактировать всплывающую форму обратной связи на шаблоне готового сайта]]<br />
<br />
== Актуализированно за август ==<br />
<br />
*[[Изменение количества товаров в корзине tpl]]<br />
*#добавил проверку на нулевое значение<br />
<br />
== Июнь: ==<br />
<br />
*[[Перенос сайта с одного сервера на другой]]<br />
*#создана для перенаправления на существующую статью<br />
*[[Как вывести все товары выбранного раздела каталога вне зависимости от вложенности XSLT]]<br />
*[[Уведомление менеджеру о заказе, со всем необходимыми данными (emarket) XSLT]]<br />
*[[Смена отображения товаров в каталоге таблицей и списком без перезагрузки страницы TPL]]<br />
<br />
== Актуализированно за июнь ==<br />
<br />
*[[Использование модуля GeoIP в XSLT-шаблоне]]<br />
*#добавлена информация в раздел ''' Общая информация ''' о подключении модуля<br />
*#добавлена информация в раздел ''' Примеры использования ''' о подключении шаблона<br />
*#добавлены ссылки на справочную информацию о GeoIP, Google Maps и на Службу Заботы<br />
*[[Эффект jCarousel для фотоальбома TPL]]<br />
*#добавлены категории и плашка 2.9<br />
*[[Эффект jCarousel для фотоальбома XSLT]]<br />
*#добавлены категории и плашка 2.9<br />
*[[Эффекты Lytebox для объектов каталога TPL]]<br />
*#добавлены категории и плашка 2.9<br />
*[[Замена кнопки "Добавить в корзину" сообщением об отсутствии товара TPL]]<br />
*#добавлены категории и плашка 2.9<br />
*[[Как сделать различный вывод разделов, содержащих объекты, и пустых разделов каталога TPL]]<br />
*#Изменено название с указанием шаблонизатора<br />
*[[Уведомление менеджеру о заказе, со всем необходимыми данными (emarket)]]<br />
*#Изменено название с указанием шаблонизатора<br />
*[[ФИО на e-mail менеджеру]]<br />
*#Изменено название с указанием шаблонизатора<br />
*[[Как добавить адрес доставки в письмо ответственному менеджеру о заказе в интернет-магазине?]]<br />
*#Изменено название с указанием шаблонизатора<br />
*[[Работа с корзиной без перезагрузки TPL]]<br />
*#Изменено название с указанием шаблонизатора<br />
*#Отредактировано указание файлов и папок<br />
*#Добавлено предупреждение о проверке на подключение библиотеки jQuery<br />
<br />
== Май: ==<br />
<br />
*[[Эффект jCarousel для фотоальбома TPL]]<br />
*[[Эффект jCarousel для фотоальбома XSLT]]<br />
<br />
== Апрель: ==<br />
<br />
*[[Эффекты Lytebox для объектов каталога TPL]]<br />
*[[Замена кнопки "Добавить в корзину" сообщением об отсутствии товара TPL]]</div>PilipenkAVhttps://wiki.umisoft.ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:PilipenkAV&diff=6378Участник:PilipenkAV2013-09-30T10:03:24Z<p>PilipenkAV: </p>
<hr />
<div>== Сентябрь: ==<br />
*[[Удаление всех товаров из корзины TPL]]<br />
*[[Удаление всех товаров из корзины XSLT]]<br />
<br />
== Август: ==<br />
*[[Как редактировать всплывающую форму обратной связи на шаблоне готового сайта]]<br />
<br />
== Актуализированно за август ==<br />
<br />
*[[Изменение количества товаров в корзине tpl]]<br />
*#добавил проверку на нулевое значение<br />
<br />
== Июнь: ==<br />
<br />
*[[Перенос сайта с одного сервера на другой]]<br />
*#создана для перенаправления на существующую статью<br />
*[[Как вывести все товары выбранного раздела каталога вне зависимости от вложенности XSLT]]<br />
*[[Уведомление менеджеру о заказе, со всем необходимыми данными (emarket) XSLT]]<br />
*[[Смена отображения товаров в каталоге таблицей и списком без перезагрузки страницы TPL]]<br />
<br />
== Актуализированно за июнь ==<br />
<br />
*[[Использование модуля GeoIP в XSLT-шаблоне]]<br />
*#добавлена информация в раздел ''' Общая информация ''' о подключении модуля<br />
*#добавлена информация в раздел ''' Примеры использования ''' о подключении шаблона<br />
*#добавлены ссылки на справочную информацию о GeoIP, Google Maps и на Службу Заботы<br />
*[[Эффект jCarousel для фотоальбома TPL]]<br />
*#добавлены категории и плашка 2.9<br />
*[[Эффект jCarousel для фотоальбома XSLT]]<br />
*#добавлены категории и плашка 2.9<br />
*[[Эффекты Lytebox для объектов каталога TPL]]<br />
*#добавлены категории и плашка 2.9<br />
*[[Замена кнопки "Добавить в корзину" сообщением об отсутствии товара TPL]]<br />
*#добавлены категории и плашка 2.9<br />
*[[Как сделать различный вывод разделов, содержащих объекты, и пустых разделов каталога TPL]]<br />
*#Изменено название с указанием шаблонизатора<br />
*[[Уведомление менеджеру о заказе, со всем необходимыми данными (emarket)]]<br />
*#Изменено название с указанием шаблонизатора<br />
*[[ФИО на e-mail менеджеру]]<br />
*#Изменено название с указанием шаблонизатора<br />
*[[Как добавить адрес доставки в письмо ответственному менеджеру о заказе в интернет-магазине?]]<br />
*#Изменено название с указанием шаблонизатора<br />
*[[Работа с корзиной без перезагрузки TPL]]<br />
*#Изменено название с указанием шаблонизатора<br />
*#Отредактировано указание файлов и папок<br />
*#Добавлено предупреждение о проверке на подключение библиотеки jQuery<br />
<br />
== Май: ==<br />
<br />
*[[Эффект jCarousel для фотоальбома TPL]]<br />
*[[Эффект jCarousel для фотоальбома XSLT]]<br />
<br />
== Апрель: ==<br />
<br />
*[[Эффекты Lytebox для объектов каталога TPL]]<br />
*[[Замена кнопки "Добавить в корзину" сообщением об отсутствии товара TPL]]</div>PilipenkAVhttps://wiki.umisoft.ru/index.php?title=%D0%9A%D0%B0%D0%BA_%D1%80%D0%B5%D0%B4%D0%B0%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C_%D0%B2%D1%81%D0%BF%D0%BB%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D1%83%D1%8E_%D1%84%D0%BE%D1%80%D0%BC%D1%83_%D0%BE%D0%B1%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D1%81%D0%B2%D1%8F%D0%B7%D0%B8_%D0%BD%D0%B0_%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D0%B5_%D0%B3%D0%BE%D1%82%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D1%81%D0%B0%D0%B9%D1%82%D0%B0&diff=6154Как редактировать всплывающую форму обратной связи на шаблоне готового сайта2013-09-02T06:26:39Z<p>PilipenkAV: </p>
<hr />
<div>'''Актуально для версии 2.9.1'''<br />
<br />
[[Категория:Верстка в XSLT]]<br />
<br />
==Задача==<br />
<br />
Часто возникает задача изменить названия полей или добавить какие то поля в всплывающую форму обратной связи после установки шаблона готового сайта.<br />
<br />
==Решение==<br />
<br />
За форму обратной связи отвечает тип данных "Авторская информация" и страница "Для вставки".<br />
<br />
Сначала идем в модуль "Шаблоны данных" и находим там тип данных "Авторская информация", открываем его для редактирования.<br />
<br /><br />
<br /><br />
[[Изображение: order_form.jpg|1000px|thumb|center|Редактирование типа данных "Авторская информация"]]<br />
<br /><br />
Теперь нам необходимо найти группу полей "Форма заказа", в ней и располагаются все поля всплывающей формы обратной связи.<br />
Добавляем нужное нам поле и запоминаем обязательно его идентификатор, потому как потом нам нужно будет его указывать в шаблонах вывода формы на странице.<br />
<br /><br />
<br /><br />
[[Изображение: orde_form_place.jpg|1000px|thumb|center|Добавляем поле в группе "Форма заказа"]]<br />
<br /><br />
Далее мы переходим в модуль "Структура" и заходим в редактирование страницы "Для вставки", находим там раздел "Форма заказа" и пишем для нового поля название (так же можно отредактировать названия существующих полей если необходимо).<br />
<br /><br />
<br /><br />
[[Изображение: order_name.jpg|1000px|thumb|center|Редактируем название поля в группе "Форма заказа"]]<br />
<br /><br />
Основную подготовку мы сделали. Теперь необходимо вывести данное поле на экран и подключить его в отправляемое письмо.<br />
Открываем шаблон формы обратной связи, обычно он располагается в файле \xsltTpls\sys-tpls\ajax-templates.xsl<br />
<source lang="xml"><br />
<form id="order_form" method="post"><br />
<fieldset><br />
<input type="hidden" value="http://{$domain}{page/@link}" name="page_link"/><br />
<input type="hidden" value="{$domain}" name="domain"/><br />
<input type="hidden" value="{$infoPageForm/property[@name = 'order_name_title']/value}" name="order_name_title"/><br />
<input type="hidden" value="{$infoPageForm/property[@name = 'order_phone_title']/value}" name="order_phone_title"/><br />
<input type="hidden" value="{$infoPageForm/property[@name = 'order_message_title']/value}"<br />
name="order_message_title"/><br />
<input type="hidden" value="{$infoPageForm/property[@name = 'test']/value}" name="order_test_title"/><br />
</source><br />
<br /><br />
В примере видно, что мы скопировали строчку ''<input type="hidden" value="{$infoPageForm/property[@name = 'test']/value}" name="order_test_title"/>'' с уже имеющихся полей и указали '''@name = 'test' ''', идентификатор который скопировали из шаблонов данных когда создавали еще одно поле. ''' name="order_test_title" ''' можно придумать самому, главное потом не запутаться в названиях.<br />
Теперь между тегами ''<form></form>'' к существующему коду нам надо добавить следующий код:<br />
<source lang="xml"><br />
<table><br />
<tbody><br />
<!--table и tbody оставленны для наглядности, их не нужно добавлять--><br />
<tr class="fieldset_div order_test"><br />
<td><br />
<div class="label" umi:field-name="order_test_title" umi:field-type="string"<br />
umi:empty="&empty;" umi:element-id="{$infoPageId}"><br />
<xsl:value-of select="$infoPageForm/property[@name = 'test']/value" /><br />
</div><br />
</td><br />
<td class="order_test_value"><br />
<input type="text" name="order_test"/><br />
<div class="order_form_error_text"><br />
&order-form-error-text;<br />
</div><br />
</td><br />
</tr><br />
</source><br />
Мы добавили вывод строки для ввода информации созданного нами поля, теперь надо добавить в скрипт формирования письма созданную нами переменную иначе письмо так и будет создаваться без информации из созданного нами поля.<br />
Скрипт находиться в файле ''\classes\modules\webform\__custom.php'', там необходимо объявить две переменные и вставить их в тело письма. После добавления переменных наш код выглядит так:<br />
<source lang="php"><br />
public function custom_order_send() {<br />
<br />
$domain = htmlspecialchars(trim(getRequest('domain')));<br />
$page_link = htmlspecialchars(trim(getRequest('page_link')));<br />
$name = htmlspecialchars(trim(getRequest('order_name')));<br />
$name_title = htmlspecialchars(trim(getRequest('order_name_title')));<br />
$phone = htmlspecialchars(trim(getRequest('order_phone')));<br />
$phone_title = htmlspecialchars(trim(getRequest('order_phone_title')));<br />
$message = htmlspecialchars(trim(getRequest('order_message')));<br />
$message_title = htmlspecialchars(trim(getRequest('order_message_title')));<br />
$test = htmlspecialchars(trim(getRequest('order_test')));<br />
$test_title = htmlspecialchars(trim(getRequest('order_test_title')));<br />
</source><br />
тут главное не запутаться в названиях, переменная '''$test''' берет данные из шаблона в строке ''<input type="text" name="order_test"/>'', а переменная '''$test_title''' получает данные из строки ''<input type="hidden" value="{$infoPageForm/property[@name = 'test']/value}" name="order_test_title"/>'' в котором выводится название поля.<br />
<br /><br />
Далее мы добавляем в форму отправки письма эти переменные что бы в письме появились данные из нового поля:<br />
<source lang="php"><br />
$mailContent = "<html>";<br />
$mailContent .= "<body>";<br />
$mailContent .='<h3>Содержание сообщения:</h3>';<br />
$mailContent .='<p><b>'.$name_title.'</b> '.$name.'</p>';<br />
$mailContent .='<p><b>'.$phone_title.'</b> '.$phone.'</p>';<br />
if($message != ''){<br />
$mailContent .='<p><b>'.$message_title.'</b> '.$message.'</p>';<br />
}<br />
if($test != ''){<br />
$mailContent .='<p><b>'.$test_title.'</b> '.$test.'</p>';<br />
}<br />
$mailContent .='<p><b>Страница, с которой отправлено сообщение:</b> <a href="'.$page_link.'">'.$page_link.'</a></p>';<br />
$mailContent .= "</body>\n";<br />
$mailContent .= "</html>\n";<br />
</source><br />
Мы добавили вывод переменной с проверкой, что бы не отправлялась пустая строчка если туда ничего не вписал пользователь.<br />
Все, теперь можно проверять результат.<br />
Сама форма теперь у нас выглядит так:<br />
<br /><br />
<br /><br />
[[Изображение: ajax_form.jpg|1000px|thumb|center|Всплывающая форма обратной связи]]<br />
<br /><br />
в письме приходить будет следующее:<br />
<br /><br />
<br /><br />
[[Изображение: send_mail.jpg|1000px|thumb|center|Содержание входящего письма]]<br />
<br /></div>PilipenkAVhttps://wiki.umisoft.ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Send_mail.jpg&diff=6153Файл:Send mail.jpg2013-09-02T06:26:00Z<p>PilipenkAV: </p>
<hr />
<div></div>PilipenkAVhttps://wiki.umisoft.ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Ajax_form.jpg&diff=6152Файл:Ajax form.jpg2013-09-02T06:23:40Z<p>PilipenkAV: </p>
<hr />
<div></div>PilipenkAV