воскресенье, 10 декабря 2017 г.

При заходе в админку белый экран.


Столкнулся до жути с неприятным багом. Резко, ничего такого не делал, невозможно зайти в админку. белый экран. В браузере в консоли выдает 500 ошибку. Никак страница не грузится. Перепробовал все... В логах ничего...
чистил папку /core/cache/ - без результата. Вывод ошибок

 error_reporting(E_ALL);
ini_set("display_errors", 1);

в файле /manager/index.php ничего не дает. экран белый.

Вот что помогло:

зайти в админку по ссылке сразу в настройки /manager/?a=system/settings
(зашло не сразу. пришлось очистить папку  /core/cache/ , увидеть неприятную ошибку с невозможности записи в папку (уже не помню в какую.) дал папке права 755 Еще до этого делал в файле /core/cache/system_settings/config.cache.php
установку значений 
  'compress_css' => '1',

  'compress_js' => '1'
Не знаю что из этих манипуляций помогло, но в итоге зашел в админку по ссылке /manager/?a=system/settings

в настройках Отображение RSS-канала «Уведомления безопасности MODX» поставить значение "Нет". Можно найти по ключу feed_modx_security_enabled

После этого пока что админка работает. Очень был удивлен / разозлен этим багом. Пост пишу больше для себя. Вдруг еще когда столкнусь с этой хренью!

PS произошло это на хостинге timeweb



среда, 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>