Наверх

Костыль для кеширования mFilter

Вызов mFilter2 только если кеша нет:
{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;
		}
	}
}


3 комментария

  1. Ольга 23 июля 2021, 12:56 # 0
    Добрый день! Спасибо за этот пост!
    А как сделать так, чтобы в кэш попадали все страницы поиска, если используется настройка 'ajaxMode' => 'scroll'?
    1. Илья Уткин 23 июля 2021, 13:12 # 0
      Здравствуйте. С таким не сталкивался, не подскажу, к сожалению)
    2. Кирилл 13 октября 2021, 17:17 # 0
      Добрый день
      А почему может не создавать файл config и properties?

      Авторизация

      через сервис Loginza:


      Шаблоны MODX

      1 2 Дальше »

      Объектная
      модель
      MODX