Наверх

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

Вызов mFilter2 только если кеша нет:

{var $get = ($.get | toJSON) | md5}
{* Проверяем, есть ли фильтр уже в кеше *}
{if !$filter = $_modx->cacheManager->get('filters/' ~ $_modx->resource.id ~ '/' ~ $get ~ '/filters')}
    {set $filter = $_modx->runSnippet('!mFilter2_cache_config', [
        'class' => 'msProduct',
        'parents' => $_modx->resource.id,
        'element' => 'msProducts',
    ])}

    {* Сохраняем фильтр в кеш *}
    {set $null = $_modx->cacheManager->set('filters/' ~ $_modx->resource.id ~ '/' ~ $get ~ '/filters', $filter)}
{/if}

{* Подключаем JS-скрипты и прописываем config на странице *}
{'!cache_mFilter' | snippet}

{* Показываем фильтр из кеша *}
{$filter}


Сниппет cache_mFilter:

<?php
/*
$modx->addPackage('customextra', $modx->getOption('core_path').'components/customextra/model/');
$uri = $_SERVER['REQUEST_URI'];
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();
}
*/

$id = $modx->resource->id;
$get = md5($modx->toJSON($_GET));
$key = 'filters/' . $id . '/' . $get . '/config';
if ($config = $modx->cacheManager->get($key)) {
    $modx->regClientStartupScript('<script type="text/javascript">mse2Config = ' . json_encode($config) . ';</script>', true);
    $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 = 'filters/cached/' . md5($uri);
    $modx->cacheManager->set($key, $cached);
    $_SESSION['mSearch2'][$config['key']] = $modx->cacheManager->get('filters/' . $id . '/' . $get . '/properties');
}
return;


В копию сниппета mFilter2 (я её назвал mFilter2_cache_config) нужно добавить кеширование:

if (empty($noJsConfig)) {
$modx->regClientStartupScript('
<script type="text/javascript">mse2Config = ' . json_encode($config) . ';</script>', true);
}
$id = $modx->resource->id;
$get = md5($modx->toJSON($_GET));
$key = 'filters/' . $id . '/' . $get . '/config';
$modx->cacheManager->set($key, $config);
$key = 'filters/' . $id . '/' . $get . '/properties';
$modx->cacheManager->set($key, $savedProperties);


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 = 'filters/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;
		}
	}
}


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

  1. Роман 14 января 2020, 16:45 # 0
    А что за снипет: mFilter2_cache_config
    Вроде бы нет в mFilter2 такого.
    1. Илья Уткин 14 января 2020, 17:02 # 0
      Это копия сниппета mFilter2, но с внесёнными изменениями
    2. Роман 26 апреля 2020, 13:58 # 0
      Илья, привет! Поясни, пожалуйста, вот этот шаг

      core/components/customextra/cron/filters_cache.php

      В моей папке customextra нет папки cron
      1. Илья Уткин 27 апреля 2020, 10:31 # 0
        Привет! Это необязательно, это просто я сам себе оставил заметку. Этот файл нужен, чтобы пройти по популярным страницам автоматически.

      Авторизация

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

      Подписка или RSS

      Буду присылать новые статьи — никакого спама



      Шаблоны MODX

      1 2 Дальше »

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