vectorserver
С нами с 12 декабря 2018; Место в рейтинге пользователей: #26MODX HTML Cache Plugin
            Плагин для MODX, который сохраняет сгенерированные страницы в HTML-файлы и отдает их напрямую без парсинга MODX.
Это позволяет значительно ускорить работу сайта на фронтенде.
ЗЫ: Делался плагин в основном для статики и лендингов!!! (Если в шаблоне есть динамические данные (например, корзина, личный кабинет), лучше исключить его из кэширования.)
Файлы сохраняются в директории:
        
        
        
    Это позволяет значительно ускорить работу сайта на фронтенде.
ЗЫ: Делался плагин в основном для статики и лендингов!!! (Если в шаблоне есть динамические данные (например, корзина, личный кабинет), лучше исключить его из кэширования.)
Файлы сохраняются в директории:
core/cache/html_pages/{template_id}/Имя файла формируется так: {resource_id}_{md5(uri)}.html        Авто обновление индекса mSeach2 через cron
            Может кому пригодится крон для массового обновления индексов #msearch2 #cron 
Инструкция:
— создаем фай в корне msearch2_cron.php содержимое кода ниже.
— запуск к примеру curl www.ru/msearch2_cron.php
        
        
        
    Инструкция:
— создаем фай в корне msearch2_cron.php содержимое кода ниже.
— запуск к примеру curl www.ru/msearch2_cron.php
<?php
// Отключение буферизации
ignore_user_abort(true);
set_time_limit(0);
ob_implicit_flush(true);
ob_end_flush();
header('Content-Type: text/html; charset=utf-8');
echo '<pre>';
ob_flush();
flush();
define('MODX_API_MODE', true);
require 'index.php';
/** @var modX $modx */
$modx->getService('error', 'error.modError');
$modx->setLogLevel(modX::LOG_LEVEL_FATAL);
$modx->setLogTarget(XPDO_CLI_MODE ? 'ECHO' : 'HTML');
/** @var modUser $adminObj */
$adminObj = $modx->getObject('modUser', ['sudo' => 1]);
$modx->user = $adminObj;
$offset = 0;
while (true) {
    /** @var modProcessorResponse $response */
    $response = $modx->runProcessor('mgr/index/create', [
        'limit' => 1000,
        'offset' => $offset,
    ], [
        'processors_path' => MODX_CORE_PATH . 'components/msearch2/processors/'
    ]);
    if ($response->isError()) {
        echo "Ошибка: " . $response->getMessage() . "\n";
        ob_flush();
        flush();
        break;
    }
    $data = $response->getObject();
    if ($data['offset'] >= 1) {
        echo "Индексировано: {$data['offset']}\n";
        ob_flush();
        flush();
    }
    // Если offset == 0 → завершаем
    if ($data['offset'] === 0) {
        echo "Получен нулевой сдвиг. Индексация остановлена.\n";
        ob_flush();
        flush();
        break;
    }
    // Обновляем offset для следующего шага
    $offset = $data['offset'];
    // Если достигли конца
    if ($offset == 0) {
        echo "Индексация успешно завершена.\n";
        ob_flush();
        flush();
        break;
    }
    //sleep(1); // пауза между порциями (можно убрать)
}        SEOSuite - после установки!
            Иногда бывает после установки seo Suite, мета теги типа canonical & robots не появляются у документа сразу, а только после его сохранения, и чтобы не заходить в каждый документ и пере сохранять, написал небольшой сниппет.
        
        
        
        
    Tikets загрузка избражений в TV
            Столкнулся с проблемкой, а именно загрузкой изображения в свои TV типов image или file, из коробки Tikets загружает файлы и привязывает их к ресурсам, мне показалось это не удобным (на вкус и цвет...)
        
        
        
        
    Прикручивам migxdb к пользователю в админке
            В админке данным пользователя понадобилось прикрутить допполе-таблицу в отдельный таб. Можно было написать таб на extJs, прикрутить Migx или прикрутить getTables. Каждый раз писать на extJs меня напрягает, а getTables не популярный. Так что решил прикрутить Migx. На удивление все получилось. Описание по катом.

        
        
        
        
    
pdoResources группировка по TV и группировка по Годам
            Недавно столкнулся с задачкой.
Есть ресурсы списком, но категория указывается в TV (tvName), на страницы нужно вывести (список категорий), хотел уже написать сниппет с группировкой кастомный, полез pdoResources и посмотрел как там прописываются алиасы в итоге увидел что к TV прописывается алиас TV.
        
        
        
        
    Есть ресурсы списком, но категория указывается в TV (tvName), на страницы нужно вывести (список категорий), хотел уже написать сниппет с группировкой кастомный, полез pdoResources и посмотрел как там прописываются алиасы в итоге увидел что к TV прописывается алиас TV.
Remove Duplicates MODX
            Может кому пригодится.)
Компонент ищет дубликаты ресурсов, в разных контекстах!
PS^ версия сыровата, JS накидал на коленке (эффекты и тп пока отсутствуют).
Есть два варианта обработки ресурсов:
Скриншоты:

        
        
        
        
    Компонент ищет дубликаты ресурсов, в разных контекстах!
PS^ версия сыровата, JS накидал на коленке (эффекты и тп пока отсутствуют).
Есть два варианта обработки ресурсов:
- Перемещение в корзину
 - Создание нового алиаса с прфиксом ID ресурса.
 
Скриншоты:

Обновление дубликатов страниц (duplicate_updater_modx)
            Может кому пригодится, написал скриптец для поиска дублей страниц и обновления последних путем добавление префикса +=1
Инструкция залить duplicate_updater_modx.php в корень сайта и запустить в браузере yousute.ru/duplicate_updater_modx.php
git: github.com/vectorserver/duplicate_updater_modx
Сам код:
        
        
        
    Инструкция залить duplicate_updater_modx.php в корень сайта и запустить в браузере yousute.ru/duplicate_updater_modx.php
git: github.com/vectorserver/duplicate_updater_modx
Сам код:
<?php
/**
 * Created by PhpStorm.
 * User: admin
 * Date: 25.06.2019
 * Time: 14:19
 */
define('MODX_API_MODE', true);
require 'index.php';
$modx->getService('error', 'error.modError');
$modx->setLogLevel(modX::LOG_LEVEL_FATAL);
$modx->setLogTarget(XPDO_CLI_MODE ? 'ECHO' : 'HTML');
$msg = "";
$table_prefix = $modx->config['table_prefix'];
//Ищем двойников
$find_query = $modx->query("SELECT group_concat(`id`) ids, count(id) c FROM `" . $table_prefix . "site_content` GROUP by concat(uri) HAVING c > 1");
$dubles = $find_query->fetchAll(PDO::FETCH_ASSOC);
//Если нашли
if (count($dubles)) {
    foreach ($dubles as $item) {
        //Разбивем ID
        $ids = explode(",", $item['ids']);
        //Сортируем - старые вверх
        sort($ids, SORT_NUMERIC);
        $count = 0;
        foreach ($ids as $doc_id) {
            $count++;
            //ПРопускаем оригинал
            if ($count > 1) {
                //Обновляем ресурс
                $originalRes = $modx->getObject('modResource', $doc_id);
                $generated = $originalRes->cleanAlias($originalRes->get('pagetitle')) . "-" . $count;
                $originalRes->set('alias', $generated);
                $originalRes->save();
                //В лог
                $msg .= $originalRes->get('id') . " | " . $originalRes->get('pagetitle') . " - обновлен.\n";
            }
        }
        //Сброрс кеша
        $modx->cacheManager->refresh();
    }
} else {
    $msg .= "Дублей нет\n";
}
echo "<pre>" . $msg;        Fatal error: Uncaught --> Smarty Compiler: Syntax error in template "eval:
            Недавно решил обновится до с 2.5.2 до 2.7.0 версии, PHP Version 5.4.45, обновилось все удачно, полез в админку и бац мне вылезло:
        
        
        
    Fatal error: Uncaught --> Smarty Compiler: Syntax error in template "eval:<li id="limenu-site" class="top"> <a hre..." on line 141 "});{/literal} ">Завершить все сеансы<span class="description">Завершить все сеансы работы пользователей и произвести принудительный выход из системы всех пользователей.</span>" - Unexpected " MODx.msg.confirm({ title: _('flush_sessions') ,text: _('flush_sessions_confirm') ,url: MODx.config.connector_url ,params: { action: 'security/flush' } ,listeners: { 'success': {fn:function() { location.href = './'; },scope:this} } });", expected one of: LITERALSTART , LITERALEND , LITERAL <-- thrown in .../core/model/smarty/sysplugins/smarty_internal_templatecompilerbase.php on line 141Ну я пошел гуглить в чем проблема и наткнулся на эту тему, там проблему не решили, но в заголовке стоит «Решено».        Indexbot - Показ информации определенному боту
            Думаю полезно будет для СЕОшников, которые постоянно хотят показывать информацию только избранным ботам.
Озадачил меня один сеошник и его товаришь А.
Примеры вызова
или
Название сниппета:indexbot
        
        
        
    Озадачил меня один сеошник и его товаришь А.
Нам нужно показывать этот PLACEHOLDER или TV только гугл боту, а другой TV яндекс ботуСобственно написал небольшой сниппет, может кому пригодится
Примеры вызова
[[*pagetitle:indexbot=`googlebot`]] или
[[indexbot? &input=`Заголовок <b>[[*pagetitle]]</b> виден только для <b>googlebot</b>` &options=`googlebot` &debug=`1`]]Название сниппета:indexbot