{var $get = ($.get | toJSON) | md5} {* Проверяем, есть ли фильтр уже в кеше *} {if !$filter = $_modx->cacheManager->get('msearch2/settings/' ~ $get ~ '/filters')} {set $filter = $_modx->runSnippet('!mFilter2', [ 'class' => 'msProduct', 'parents' => $_modx->resource.id, 'element' => 'msProducts', ])} {* Сохраняем фильтр в кеш *} {set $null = $_modx->cacheManager->set('msearch2/settings/' ~ $get ~ '/filters', $filter)} {/if} {* Подключаем JS-скрипты и прописываем config на странице *} {'!mFilterJS' | snippet} {* Показываем фильтр из кеша *} {$filter}
Сниппет mFilterJS:
<?php $uri = $_SERVER['REQUEST_URI']; /* Раскомментировать, если установлен customExtra $modx->addPackage('customextra', $modx->getOption('core_path').'components/customextra/model/'); if ($item = $modx->getObject('customExtraItem', ['name' => $uri])) { $item->set('id1', ($item->id1 + 1)); $item->save(); } else { $item = $modx->newObject('customExtraItem', ['name' => $uri, 'id1' => 1]); $item->save(); } */ $cache_prefix = 'msearch2/settings/' . md5(json_encode($_GET)); if ($config = $modx->cacheManager->get($cache_prefix . '/config')) { $modx->regClientStartupScript('<script type="text/javascript">mse2Config = ' . json_encode($config) . ';</script>', true); $modx->regClientCSS('/assets/components/msearch2/css/web/default.css'); $modx->regClientScript(' <script type="text/javascript" src="/assets/components/msearch2/js/web/default.js"></script> <script type="text/javascript"> if ($("#mse2_mfilter").length) { if (window.location.hash != "" && mSearch2.Hash.oldbrowser()) { var uri = window.location.hash.replace("#", "?"); window.location.href = document.location.pathname + uri; } else { mSearch2.initialize("body"); } } </script>', true); $cached = true; $key = 'msearch2/cached/' . md5($uri); $modx->cacheManager->set($key, $cached); $_SESSION['mSearch2'][$config['key']] = $modx->cacheManager->get($cache_prefix . '/properties'); } return;
Чтобы автоматически создать кеш для популярных страниц, добавить в CRON
* * * * * php ~/www/core/components/customextra/cron/filters_cache.php
<?php // Подключаем define('MODX_API_MODE', true); require dirname(dirname(dirname(dirname(__DIR__)))) . '/index.php'; $modx->addPackage('customextra', $modx->getOption('core_path').'components/customextra/model/'); $q = $modx->newQuery('customExtraItem', ['id1:>' => 0]); $q->sortby('id1', 'DESC'); $q->limit(100); $items = $modx->getCollection('customExtraItem', $q); $i = 0; foreach ($items as $item) { $key = 'msearch2/cached/' . md5($item->name); if (!$cached = $modx->cacheManager->get($key)) { $cached = true; $modx->cacheManager->set($key, $cached); $id1 = $item->get('id1') - 1; $item->set('id1', $id1); $item->save(); $curl_handle=curl_init(); curl_setopt($curl_handle, CURLOPT_URL, 'https://site.ru' . $item->name); curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, 2); curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl_handle, CURLOPT_USERAGENT, 'site.ru'); $query = curl_exec($curl_handle); curl_close($curl_handle); $i++; if ($i < 10) { continue; } else { break; } } }
А как сделать так, чтобы в кэш попадали все страницы поиска, если используется настройка 'ajaxMode' => 'scroll'?
А почему может не создавать файл config и properties?