Николай Загумённов

Николай Загумённов

Был в сети 19 июня 2026, 19:34
Заказы не принимаю
сохраняем файл update_minishop2_previews.php в корне сайта и запускаем его из консоли SSH и ждем. (советую сделать полный бэкап прежде чем запускать скрипт)

php /var/www/......../update_minishop2_previews.php

<?php

// >> Подключаем
define('MODX_API_MODE', true);

if(file_exists('index.php'))
{
	require_once 'index.php';
}
else if(file_exists(dirname(dirname(dirname(dirname(__FILE__)))) . '/index.php'))
{
	require_once dirname(dirname(dirname(dirname(__FILE__)))) . '/index.php';
}
else if(file_exists(dirname(dirname(dirname(dirname(dirname(__FILE__))))) . '/index.php'))
{
	require_once dirname(dirname(dirname(dirname(dirname(__FILE__))))) . '/index.php';
}
else {
	print "Не удалось подгрузить MODX";
	die;
}
// << Подключаем


// >> Включаем обработку ошибок
$modx->getService('error','error.modError');
$modx->setLogLevel(modX::LOG_LEVEL_ERROR);
$modx->setLogTarget(XPDO_CLI_MODE ? 'ECHO' : 'HTML');
// << Включаем обработку ошибок


if(!isset($parents)) { $parents = 0; }		// Можно указать список категорий для поиска товаров
if(!isset($resources)) { $resources = ''; }	// Можно указать конкретный список товаров

$pdo = $modx->getService('pdoFetch');
$condition = array('parents' => $parents);
$files = $pdo->getCollection('msProduct',
	array(
		'msProduct.class_key' => 'msProduct',
	),
	array(
		'class' => 'msProduct',
		'parents' => $parents,
		'resources' => $resources,
		'innerJoin' => array(
			'msProductFile' => array(
				'alias' => 'msProductFile',
				'on' => array(
					'msProduct.id = msProductFile.product_id',
					'msProductFile.parent' => 0,
					'msProductFile.type' => 'image',
				)
			)
		),
		'select' => array(
			'msProductFile' => 'all'
		),
		'sortby' => 'msProduct.id'
	)
);

print $pdo->getTime();

foreach($files as $row)
{
	$file = $modx->newObject('msProductFile');	
	$file->fromArray($row, '', true, true);
	
	$children = $file->getMany('Children');
	foreach($children as $child)
	{
		$child->remove();
	}
	$file->generateThumbnails();
	
	// Обновляем thumb и image товара
	if($product = $file->getOne('Product'))
	{
		$product->updateProductImage();
	}
}

print microtime(true) - $modx->startTime;
Чтобы перегенерировать превьюшки надо зайти в товар нажать правой кнопкой мыши на картинку и нажать «Обновить превью», если нужно обновить все превью разом то нужно запустить консольный скрипт который обновит всё. Не нужно удалять папку — assets/images/products
Так и не разобрался с этой проблемой, решил таким костылем: плагин на событие OnMODXInit

<?php
switch ($modx->event->name) {
    case 'OnMODXInit':
        // $modx->getService('lexicon','modLexicon');
        $modx->lexicon->load('tournaments:default');
        break;
}
Еще этот вариант помог мне выводить лексиконы в параметре tpl, сниппета pdoResources, выводящиеся через pdoPage. Когда листаешь страницу, ajax пагинация не подгружает кастомные лексиконы.