
Snippet for more advanced caching snippets (with the possibility move through the pages, etc.).

----------------------------------------

Сниппет для более продвинутого кэширования сниппетов (с возможностью перехода по страницам и т.п.).

----------------------------------------

Автор: Thebat053.
Адаптация под MODX Revo: Andchir.

----------------------------------------

Название сниппета: CacheAccelerator

Код сниппета:

<?php
return require MODX_CORE_PATH.'components/cacheaccelerator/cacheaccelerator_snippet.php';

---

Плагин:

CacheAcceleratorClear

<?php
return require MODX_CORE_PATH.'components/cacheaccelerator/cacheaccelerator_clear_plugin.php';

Системные события:
OnCacheUpdate, OnSiteRefresh

---

После установки установить права 777 на папку components/cacheaccelerator/cache/.

----------------------------------------

!!!Описание из версии для Evo!!!

Параметры:
snippetToCache - имя сниппета для кеширования.

cacheId - идентификатор закешированного сниппета на странице, например `News`

dropCacheField - список полей и условий для них, при выполнении которых произойдет сброс кеша,
		например `JotForm||post;true;2`

noCacheGroups - список групп веб-пользователей, для которых обработка кеширования не будет производиться,
		например `admins||moderators`

noCacheRoles - список ролей менеджеров, для которых обработка кеширования не будет производиться
    например `Administrator||Editor`

checkURL - создавать отдельный кэш для разных URL (1|0). По умолчанию включено. Включать полезно для сниппетов с постраничной навигацией.

clearCache - при значении 1, происходит принудительная очистка кеша.

----------------------------------------

[[!CacheAccelerator?
&snippetToCache=`getPage`
&cacheId=`catalog`
&checkURL=`1`
&elementClass=`modSnippet`
&element=`getResources`
&context=`catalog`
&tplPath=`[[++core_path]]components/shopkeeper/elements/chunks/ru/`
&tpl=`@FILE product2.tpl`
&includeTVs=`1`
&processTVs=`1`
&limit=`2`
&sortby=`id`
&sortbyTVType=`integer`
&pageVarKey=`page`
&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>

##############################################################################################
##############################################################################################

Создаем директорию /assets/plugins/cacheaccelerator
в директории cacheaccelerator создаем директорию cache
(/assets/plugins/cacheaccelerator/cache)
на обе созданные директории устанавливаем chmod 777

Далее, из скачанного архива копируем файл fileCache.php в директорию
/assets/plugins/cacheaccelerator


После этого, в менеджере MODx нажимаем Элементы -> Управление элементами ->
Сниппеты -> Новый сниппет. Создаем новый сниппет с именем CacheAccelerator.
Туда копируем содержимое CacheAccelerator.snippet.txt


Созраняем созданный сниппет. Затем переходим во вкладку Плагины. Нажимаем Создать плагин.
Задаем ему имя CacheAcceleratorClear. Копируем в него содержимое файла CacheAcceleratorClear.plugin.txt

Внимание! После того как скопировали содержимое плагина, переходим во вкладку
Системные события, в которой отмечаем галочкой событие OnCacheUpdate в разделе Cache Service Events!
Затем нажимаем кнопку Сохранить. Установка CacheAccelerator завершена.




Использование CacheAccelerator:
CacheAccelerator может использоваться абсолютно для любых плагинов. Кешировать любую выдачу.
Я же пока рассмотрю его применение на примерах вызовов Ditto и Jot.

Вызов Ditto будет выглядеть следующим образом:
[[CacheAccelerator?
    &snippetToCache=`Ditto`
    &cacheId=`News`
    &parents=`1`
    &display=`10`
    &paginate=`1` 
    &paginateAlwaysShowLinks=`1`
]]
Вместо самого вызова Ditto, вызывается сниппет CacheAccelerator, а название кешируемого
сниппета (в данном случае Ditto) указывается в параметре snippetToCache.
Далее следует параметр cacheId. Он создан для разделения кешируемого контента в случае
присутствия нескольких кешируемых сниппетов на странице. Например, левое меню, последние
новости и сама лента новостей. Может содержать любое значение, к которому привяжется
закешированный контент.
Заметим, что если Ditto вызывался в двойных скобках [[]], то и данный вызов должен также
содержаться в них.

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

[!CacheAccelerator?
    &snippetToCache=`Jot`
    &cacheId=`Comments`
    &dropCacheField=`JotForm||post;true;2||;publish;2||;unpublish;2||;delete;2||;edit;2`
    &noCacheGroups=`Site Admins`
    &customfields=`name,email`
    &pagination=`10`
    &badwords=`*****`
    &canmoderate=`Site Admins`
    &captcha=`1`!]
!]
Сам кешируемый сниппет также указывается в параметре snippetToCache, а в cacheId идентификатор
кешируемого контента на странице.
Здесь присутствуют еще два параметра dropCacheField и noCacheGroups. На них мы остановимся
подробнее.
Дело в том, что, в отличие от новостных блоков, добавление которых происходит из
менеджера MODx и где, после добавления каждой из новостей, очищается кеш, в ленте комментариев
Jot любой пользователь зашедший на сайт может добавить свой комментарий. При это, чтобы
этот комментарий был виден как ему, так и другим пользователям, необходимо очистить кеш
CacheAccelerator. Данное действие может потребоваться не только для Jot, но и для многих
других сниппетов, выдачу которых хотелось бы закешировать, но также предусмотреть
возможность обновления кеша после каких-либо действий пользователя.
Для этих целей и служит параметр dropCacheField.
Он содержит список условий, разделенных ||. При срабатывании любого из этих условий 
происходит очистка кеша CacheAccelerator.

Условием может быть имя поля. При обнаружении которого в запросах GET или POST, кеш будет
обновлен.

Может быть сравнением. Через точку с запятой перечисляются: поле;значение;метод_сравнения
Если само имя поля указано пустым, то сравнению подвергаются все существующие поля.

Вот пример:
&dropCacheField=`JotForm||post;true;2||;delete;2`
Здесь указано:
Если в запросе присутствует поле JotForm
Если есть поле post и оно равно true
Если любое из полей имеет значение delete
При любом совпадении, будет произведена очистка кеша.

При постинге нового сообщения в Jot, передается форма, где содержится поле JotForm.
Таким образом, после постинга комментария, кеш будет очищен и информация останется
актуальной. После первого же запроса на эту страницу, кеш будет снова создан и
последующие обращения станут отдаваться из кеша.


Параметр noCacheGroups содержит список, разделенный ||, в котором содержатся группы
веб пользователей, отдача данных из кеша для которых производиться не будет, а сниппет
будет выполняться при каждом вызове. Потому как у модераторов, например, форма вывода
отличается управляющими кнопками и, при условии попадания такого запроса в кеш, другие
зашедшие пользователи также увидят форму, имеющую элементы, не относящиеся к их запросу.
По умолчанию, также, обработка кеша не происходит и для тех пользователей, которые
авторизованы в менеджере MODx. И, если Ваш редактор материалов состоит в пользователях
администраторской панели, то данная проблема отпадает сама собой.


Очистить кеш CacheAccelerator также можно из любого места вызвав:
Из чанка:
[!CacheAccelerator? &clearCache=`1`!]

Из сниппета:
$modx->runSnippet("CacheAccelerator", array("clearCache" => 1))


Любые плейсхолдеры, заданные кешируемым сниппетом, также кешируются и прописываются
при вызове из кеша.

Пример:
[[CacheAccelerator?&snippetToCache=`Ditto`&cacheId=`News`]]
Показаны [+start+] - [+stop+] из [+total+] Новостей<br>
[+previous+] [+pages+] [+next+]<br>


Список параметров:
snippetToCache - имя сниппета для кеширования, например `Ditto`.
cacheId - идентификатор закешированного сниппета на странице, например `News`
dropCacheField - список полей и условий для них, при выполнении которых произойдет сброс кеша,
		например `JotForm||post;true;2`
noCacheGroups - список групп, для которых обработка кеширования не будет производиться,
		например `admins||moderators`
clearCache - при значении 1, происходит принудительная очистка кеша.

Список условий:
1 != Не равно
2 =  Равно
3 <  Меньше чем 
4 >  Больше чем
5 <= Меньше чем или равно
6 >= Больше чем или равно
7    Содержит
8    Не содержит

