среда, 6 июля 2016 г.

Создание sitemap.xml для поисковиков в Modx Revo


Спонсор блога Магазин детской одежды Dress

1. Создайте ресурс с именем sitemap.xml Тип содержимого (Content Type)   (вкладка настройки)- XML, шаблон - Пустой . Тут же в настройках снимаем чек бокс с Использовать HTML-редактор

2. В псевдоним пишем sitemap ( Важно! без ".xml" т.к. модекс его добавит самостоятельно и у вас получится sitemap.xml.xml)

3. Установите дополнение GoogleSiteMap. ( Например, на странице управления пакетами. у меня это http://dresska.com/manager/?a=workspaces )

4. В содержимое поле контента вставьте вызов сниппета [[!GoogleSiteMap]], отключив при этом редактор кода и сохраните. Важно! Убедитесь, что html редактор кода отключен. Если это не так, проверьте все ли сделано из пункта 1 и повторно сохраните страницу.

5. Любуемся результатом 

пятница, 19 февраля 2016 г.

MIGX - создание отдельной таблицы для товаров shopkeeper

Спонсор блога Магазин детской одежды Dress

1. Устанавливаем MIGX
2.Переходим в плагин на вкладку Package Manager
3. В package name пишем shop
4.  Открываем файл core/components/shopkeeper3/docs/shop.mysql.schema.xml
5. Копируем его содержимое и вставляем в migx вкладка xml schema - schema. И нажимаем save schema. Появится алерт, соглашаемся...
6. Переходим на вкладку create packpage и нажимаем кнопку create packpage
7. Переходим на вкладку create tables и нажимаем кнопку create tables
8. Переходим вверху на вкладку migx и нажимаем "Добавить элемент"
9. на первой вкладке settings в name вводим shop и нажимаем "Выполнено"
10. Создаем TV параметр migxdb. На вкладке параметры указываем тип ввода migxdb, в конфигурации shop - сохранить.
11. Создаем шаблон Категория товара и в тв migxdb делаем доступным для этого шаблона
12. Создаем интерфейс создания/редактирования товара:


  • Переходим в MIGX во вторую вкладку MIGX
  • ставим галочку на наш shop и нажимаем правой кнопкой - редактировать
  • Переходим на вкладку Formtabs - добавить элемент
  • в caption пишем "Основные параметры"
  • Нажимаем кнопку "Добавить элемент"
  • В fieldname пишем pagetitle, в caption - Название - Выполнено.
  • Аналогично добавляем price, image (в inputTV пишем существующим тв image)
  • Нажимаем выполнено-выполнено
13. Переходим в MIGX - вкладка migx - редактирование элемента shop - вкладка Columns - добавить элемент. в field пишем pagetitle, в header - название - выполнено
Аналогично price - цена и обязательно ID - id

14. Заходим в категорию, ставим ей шаблон "Категория товаров", переходим на вкладку дополнительные поля - товары - загрузка сетки

15. Опять переходим в migx-migx- редактирование нашего компонента shop - вкладка action buttons и устанавливаем чек боксы:

addItem
bulk
toggleTrash
emptyTrash

Нажимаем "выполнено"

16. На вкладке MIGXdbSettings нашего компонента shop вводим в packpage - shop, в classname - ShopContent - выполнено

17. Переходим в редактировании нашего компонента shop на вкладку contextmenues и ставим чекбоксы на 
update
publish
unpublish
remove

Нажимаем "Выполнено"






getProducts - более быстрая альтернатива getResources от shopkeeper для работы с каталогом


Параметры сниппета

parents - ID родительских ресурсов через запятую. По умолчанию текущий.
resources - Список ID ресурсов (товаров) через запятую.
depth - Глубина поиска родителей. По умолчанию 1.
tpl - Имя чанка шаблона для вывода ресурса.
outerTpl - Имя чанка шаблона обертки вывода. Доступен только плейсхолдер [[+inner]].
className - Имя класса (объекта) элементов таблицы БД. По умолчанию "modResource".
packageName - Имя пакета элементов таблицы БД. Например: shop - будет запрошен класс по адресу "/core/components/shop/model/shop/shopcontent.class.php". Рекоммендуется использовать пакет MIGXDB (http://modx.com/extras/package/migx).
where - JSON строка для условия WHERE в SQL запросе. Пример: &where=`{"template":15}` (только поля ресурсов, без TV).
sortby - Поле для сортировки (только поля ресурсов, без TV). По умолчанию "menuindex". Для сортировки вразнобой использовать &sortby=`RAND()`.
sortdir - Направление сортировки. По умолчанию "ASC".
sortbyTV - Сортировка по TV. Указать имя TV.
sortdirTV - Направление сортировки по TV (ASC|DESC). По умолчанию "ASC";
sortbyTVType - Тип значения TV (string|integer). По умолчанию "string";
orderby - JSON строка сортировки. Пример: &orderby=`{"parent":"ASC","pagetitle":"ASC"}`
tvFilters - JSON строка фильтрации по ТВ. Пример: &tvFilters=`{"country":"Китай","producer":"Sony"}`. Другие примеры ниже.
includeTVs - Добавить плейсхолдеры значений TV для ресурсов (1|0). Префикс для TV: "tv.". Пример: [[+tv.image]]. По умолчанию = 0 (отключен).
includeTVList - Список имён TV, которые нужно добавить через запятую.
processTVs - Применять параметр "Параметры вывода" для TV.
processTVList - Список TV через запятую, для которых применять processTVs.
fromParentList - список полей через запятую, которые нужно добавить товарам от родителей. Например "pagetitle,image" - в чанке сниппета будут доступны плейсхолдеры [[+parent.pagetitle]] и [[+parent.image]] (TV). По умолчанию выключено.
addSubItemCount - В чанке сниппета будет доступен плейсхолдер [[+subitemcount]] - число дочерних ресурсов.
subItemCountWhere - JSON строка для условия WHERE в SQL запросе для подсчета дочерних элементов.
noResults - Текст, который будет выводиться, если по запросу ничего не найдено.
toPlaceholder - Имя плейсхолдера, в который нужно отправить результат работы сниппета. По умолчанию не используется.
totalVar - Имя плейсхолдера с общим количеством ресурсов. По умолчанию "total".
context - Контекст, из которого нужно вывести ресурсы. По умолчанию текущий.
activeParentSnippet - Сниппет для активного контейнера-ресурса - [[+activeParent_snippet]]. См. пример с меню ниже.
activeClass - Имя CSS-класса для активного ресурса. По умолчанию "active".
includeContent - Включать в выборку из БД значение поля "content" (1|0). По умолчанию выключено.
returnIDs - Возвращать только ID рессурсов (1|0). По умолчанию 0 (выключено).
useSmarty - Использовать в чанке шаблонизатор Smarty (1|0). По умолчанию 0 (выключено). Подробнее ниже.
debug - Режим отладки (1|0). В журнал ошибок будут писаться SQL запросы, полученные в сниппете. По умолчанию = 0 (отключен).

Параметры кэширования

gp_cache - Включить кэширование (1|0). По умолчанию выключено - 0.
cacheId - Идентификатор кэша. По умолчанию "gpCache".

Необязательные параметры кэширования

cache_key - Ключ кэша (название папки для файлов кэша). По умолчанию берется из настроек системы - cache_resource_key.
cache_handler - Обработчик кэширования. По умолчанию берется из настроек системы - cache_resource_handler (xPDOFileCache).
cache_expires - число секунд для кэширования. По умолчанию 0 (бесконечное).

Примеры фильтрации

Пример фильтрации по цене - больше и меньше: 
&tvFilters=`{"price:>=,<=:AND":[200,500]}`
Пример с поиском подстроки: 
&tvFilters=`{"param:LIKE":"%черный%"}`
Пример для поиска по стандартным полям: 
&where=`{"temlate:=:AND":"2","pagetitle:LIKE:AND":"%черный%"}`
Поиск по множественным значениям: 
&tvFilters=`{"param:LIKE:OR":["%черный%","%синий%","%зеленый%"]}`

Плейсхолдеры в чанке "tpl"

idx - Индекс строки от нуля.
first - (1|0) - Первая строка. Если первая строка, то выведется "1", если нет - "0".
last - (1|0) - Последняя строка.
odd - (1|0) - Четная строка.
activeClass - Класс активного ресурса.
classnames - Все CSS-классы одной строкой.
active - (1|0) - активный ресурс.
activeParent - ID активного родителя.
activeParent_snippet - Вывод сниппета из параметра &activeParentSnippet.
tv.любойTV - TV параметры.
parent.полеОтРодителя - поля от роделя (в т.ч. TV).

Пример вызова

[[!getProducts?
&parents=`5`
&includeTVs=`1`
&includeTVList=`price,image,producer,country`
&limit=`10`
&tpl=`product`
&where=`{"template":15}`
&tvFilters=`{"country":"Китай","producer":"Sony"}`
]]
Пример использования с getPage:
[[!getPage?
&cache=`1`
&elementClass=`modSnippet`
&element=`getProducts`
&parents=`5`
&includeTVs=`1`
&includeTVList=`price,image,producer,country`
&limit=`10`
&tpl=`product`
&where=`{"template":15}`
&tvFilters=`{"country":"Китай","producer":"Sony"}`
&pageFirstTpl=` <li class="control"><a [[+classes]] href="[[+href]]">Первая</a></li> `
&pageLastTpl=` <li class="control"><a [[+classes]] href="[[+href]]">Последняя</a></li> `
]]
<br class="clear" />
<ul class="pages">
[[!+page.nav]]
</ul>
Пример вывода элементов из таблицы "modx_shop_content"
(см. http://modx-shopkeeper.ru/documentation/modx-revolution/tovaryi-iz-otdelnoj-tabliczyi.html):
[[!getPage?
&cache=`1`
&elementClass=`modSnippet`
&element=`getProducts`
&className=`shopContent`
&packageName=`shop`
&limit=`10`
&tpl=`product`
&where=`{"template":15}`
&pageFirstTpl=` <li class="control"><a [[+classes]] href="[[+href]]">Первая</a></li> `
&pageLastTpl=` <li class="control"><a [[+classes]] href="[[+href]]">Последняя</a></li> `
]]
<br class="clear" />
<ul class="pages">
[[!+page.nav]]
</ul>
Пример вывода с кэшированием, кэшируется для всех страниц:
[[getProducts@top_products?
&gp_cache=`1`
&cacheId=`top_products`
]]
Пример вывода с кэшированием, кэшируется для всех страниц + учитывается валюта:
[[!getProducts@top_products?
&gp_cache=`1`
&cacheId=`top_products_[[!+shk_currency]]`
]]
Пример вывода многоуровневого меню (замена Wayfinder). Подуровни выводятся только для текущей категории:
[[getProducts?
&parents=`4`
&where=`{"hidemenu":0,"template:<>":5}`
&tpl=`menuRowTpl`
&addSubItemCount=`1`
&activeParentSnippet=`getProducts?parents=[[+id]]&tpl=menuRowTpl2`
]]
menuRowTpl:
<li>
    <a href="[[~[[+id]]]]" class="[[+activeClass]]">[[+pagetitle]] ([[+subitemcount]])</a>
    [[+active:is=`1`:then=`
    <ul>
        [[+activeParent_snippet]]
    </ul>
    `:else=``]]
</li>
menuRowTpl2:
<li>
    <a href="[[~[[+id]]]]" class="[[+activeClass]]">[[+pagetitle]]</a>
</li>
ав

четверг, 5 ноября 2015 г.

Seample Search - простой поиск на modx revo

Спонсор блога Магазин детской одежды Dress

Официальная документация

1. Создаем новый ресурс в корне дерева. Заголовок: Результаты поиска, ставим галочку "Не показывать в меню". Нажимаем на вкладку "Настройки" и убираем галочки с "Доступен для поиска", "Использовать HTML-редактор". Не забываем сохранить ресурс.

2. Далее заходим в новосозданный ресурс и в поле "Содержимое ресурса" вписываем
[[!SimpleSearch]]

3. Запоминаем id этого ресурса, это страница вывода результатов поиска. В шаблон где находится сама форма поиска вставляем следующий код:

[[!SimpleSearchForm? &landing=`1` &tpl=`search`]]
где вместо 1 вставляем ID страницы вывода результатов поиска

4. Затем копируем следующий код (это содержимое файла core/components/simplesearch/elements/chunks/searchform.chunk.tpl):
в новый чанк с названием search и создаем тот шаблон отображения окна поиска, который нам необходим.

<form action="[[~[[+landing]]]]" method="[[+method]]">
              <input type="text" name="[[+searchIndex]]" id="[[+searchIndex]]" value="[[+searchValue]]" placeholder="Поиск по сайту">
 <input type="hidden" name="id" value="[[+landing]]" />
              <button type="submit"></button>
            </form>

FormIt - отправка форм в modx revo

Спонсор блога Магазин детской одежды Dress

очень мощный плагин для работы с формами
Официальная документация 

Пример вызова:

[[!FormIt@custom?
&hooks=`email,redirect`
&submitVar=`FeedbackMes`
&emailTpl=`FeedbackMes`
&emailSubject=`Обратная связь`
&redirectTo=`48`
]]


<form id="callBackMes" action="[[~[[*id]]]]" method="post">
  <input type="hidden" name="FeedbackMes" value="1">
            <div class="bInputWrap">
              <input type="text" name="feedbackFio" placeholder="ФИО" required value="[[!+fi.feedbackFio]]" class="bTextInputFeedback height50">
 <input type="text" name="feedbackPhone" placeholder="Телефон" required value="[[!+fi.feedbackPhone]]" class="bTextInputFeedback height50">
 <input type="text" name="feedbackEmail" placeholder="E-mail" required value="[[!+fi.feedbackEmail]]" class="bTextInputFeedback height50">
 <textarea class="bTextInputFeedback height150" name="feedbackMessage" placeholder="Сообщение"></textarea>
            </div>
            <button type="submit" class="bBtn">Отправить</button>
          </form>

Код чанка FeedbackMes (отвечает за формат письма) E-mail внес в настройки
 
 <h3>Сообщение с сайта ***. Форма обратной связи</h3>
<p>ФИО: [[+feedbackFio]]</p>
<p>Телефон: [[+feedbackPhone]]</p>
<p>E-mail: [[+feedbackEmail]]</p>
<p>Сообщение: [[+feedbackMessage]]</p>


Quip - простая система комментирования в modx revo

Спонсор блога Магазин детской одежды Dress

Официальная документация 
Пример вызова:

<div id="comment">
          <h3>Отзывы</h3>
  [[!QuipReply?
&thread=`item_comment[[*id]]`
&requireAuth=`1`
&tplAddComment=`new-comment`
&moderate=`1`]]
<ul class="commentlist">
[[!Quip? &thread=`item_comment[[*id]]` &threading=`0` &tplComment=`comment`]]
        </ul>

,где QuipReply - выводит форму добавления комментария
Quip - вывод комментарий

Пример чанка new-comment:

<div id="commentform">
     <span class="quip-success" id="quip-success-[[+idprefix]]">[[+successMsg]]</span>
    <form id="quip-add-comment-[[+idprefix]]" action="[[+url]]#quip-comment-preview-box-      [[+idprefix]]" method="post">
<div class="input fl">
        <input type="text" name="name" id="quip-comment-name-[[+idprefix]]" value="[[+name]]" placeholder="Ваше имя"/>
</div>
<div class="input fl">
<input type="email" placeholder="Эл. почта" name="email" id="quip-comment-email-[[+idprefix]]" value="[[+email]]">
</div>

<textarea name="comment" id="commenttext" placeholder="Комментарий"></textarea>
        <button type="submit" name="[[+post_action]]" value="1">Написать</button>
<input type="hidden" name="nospam" value="" />
    <input type="hidden" name="thread" value="[[+thread]]" />
    <input type="hidden" name="parent" value="[[+parent]]" />
    <input type="hidden" name="auth_nonce" value="[[+auth_nonce]]" />
    <input type="hidden" name="preview_mode" value="[[+preview_mode]]" />
</form>

</div>

Важно! submit формы должен иметь имя  и значение name="[[+post_action]]" value="1"

Пример чанка comment:

<li class="comment">
        <div class="author">
           <div class="authorname">[[+name]]</div>

</div>
<div class="commenttext">
[[+body]]
</div>

</li>

AjaxForm - Отправка форм через ajax


Спонсор блога Магазин детской одежды Dress


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

1. Создаем чанк "callBack" (ну или любой другой, по смыслу)
2. Добавляем форму в чанк
3. вызываем сниппет [[!AjaxForm?form=`myForm`&snippet=`FormIt`]]

Параметры сниппета:

&form - чанк с формой ( по умолчанию - tpl.AjaxForm.example)
&snippet - сниппет для обработки формы (FormIt)
&frontend_css - Стили оформления формы и полей с ошибками ([[+assetsUrl]]css/default.css)
&frontend_js - Javascript для отправки формы через ajax ([[+assetsUrl]]js/default.js)
&actionUrl - Адрес коннектора, на который отправляется форма ([[+assetsUrl]]action.php)

Пример вызова сниппета:

[[!AjaxForm?form=`callBack`
&snippet=`FormIt` 
&hooks=`email` 
&emailTo=`myemail@gmail.com`
&submitVar=`callBackMes`
&emailTpl=`callBackMes`
&emailSubject=`Обратный звонок с сайта xiaomi-mi.ru`
&validate=`name:required,phone:required`
&validationErrorMessage=`Пожалуйста, заполните поля корректно`
&successMessage=`Ваше сообщение отправлено, в ближайшее время мы свяжемся с Вами`
]]

Пример чанка callBack:

<div class="popup" id="call">
<div class="close_order popup_close"></div>
<form id="callback_form" action="" method="post" class="ajax_form">
<input type="hidden" name="callBackMes" value="1">
<div class="input">
<input type="text" id="af_name" name="name" value="[[+fi.name]]" placeholder="Ваше Имя" required>
<span class="error_name">[[+fi.error.name]]</span>
</div>
<div class="input">
<input type="tel" id="af_phone" name="phone" value="[[+fi.phone]]" placeholder="Ваш Телефон">
<span class="error_phone">[[+fi.error.phone]]</span>
</div>
<input type="submit" value="Отправить">
[[+fi.success:is=`1`:then=`
<div class="alert alert-success">[[+fi.successMessage]]</div>
`]]
[[+fi.validation_error:is=`1`:then=`
<div class="alert alert-danger">[[+fi.validation_error_message]]</div>
`]]
</form>
</div>

Пример чанка callBackMes (отвечает за формат письма) E-mail

<h3>Сообщение с сайта xiaomi-mi.ru Форма обратного звонка</h3>
<p>Имя: [[+name]]</p>

<p>Телефон: [[+phone]]</p>

Если необходимо после отправки формы скрыть всплывающее окно:

$(document).on('af_complete', function(event, response) {
var form = response.form;
// Если у формы определённый id
if (form.attr('id') == 'callback_form') {
$('#call .close_order').click(); // кнопка закрытия всплывающего окна
}

});

PS при работе с этим сниппетом ajaxForm столкнулся с проблемой,что письмо не приходит на email, хотя выскакивает оповещение, что сообщение отправлено. А причина была вот в чем: в файле документации 
\core\components\ajaxform\docs\readme.txt
Ошибка в вызове сниппета:

You can specify any parameters for end snippet:
[[!AjaxForm?
&form=`myForm`
&snippet=`FormIt`
&hooks=`email`
&emailto=`info@mysite.com`
&etc=`...`

]]

строка &emailto=`info@mysite.com` регистрозависима. Нужно 
&emailTo=`info@mysite.com` тогда все работает как нужно.







Документация на сайте разработчика