Leo

Leo

Был в сети 03 февраля 2026, 16:36
Заказы не принимаю
UPD: Рабочий вариант — сниппет для вывода списка контекстов, может кому то пригодиться

<?php
$contexts = $modx->getCollection('modContext', ['key:NOT IN' => ['mgr']]); // Исключаем админский контекст

$list = [];
foreach ($contexts as $context) {
    $contextKey = $context->get('key');

    // Получаем название контекста из самого объекта modContext (а не из modContextSetting!)
    $contextName = $context->get('name'); 

    // Получаем настройки контекста (чтобы достать site_url)
    $contextSettings = $modx->getCollection('modContextSetting', ['context_key' => $contextKey]);
    $settings = [];

    foreach ($contextSettings as $setting) {
        $settings[$setting->get('key')] = $setting->get('value');
    }

    // Получаем URL (если не задан - пропускаем контекст)
    $siteUrl = isset($settings['site_url']) ? $settings['site_url'] : '';
    if (empty($siteUrl) || empty($contextName)) {
        continue;
    }

    $list[] = ['name' => $contextName, 'url' => $siteUrl];
}

// Сортируем список по названию
usort($list, function ($a, $b) {
    return strcmp($a['name'], $b['name']);
});

// Получаем текущий контекст
$currentContextKey = $modx->context->get('key');
$currentContext = $modx->getObject('modContext', ['key' => $currentContextKey]);

// Получаем его название (из поля "Название" в админке)
$currentContextName = $currentContext ? $currentContext->get('name') : $currentContextKey;

// Получаем site_url текущего контекста
$currentSettings = $modx->getCollection('modContextSetting', ['context_key' => $currentContextKey]);
$currentSiteUrl = '';

foreach ($currentSettings as $setting) {
    if ($setting->get('key') === 'site_url') {
        $currentSiteUrl = $setting->get('value');
        break;
    }
}

// Вывод HTML
$output = 'Текущий город - <strong>' . htmlspecialchars($currentContextName) . '</strong>';
$output .= '<select onchange="window.location=this.value">';
$output .= '<option value="">Выберите город...</option>';

foreach ($list as $item) {
    $selected = ($item['url'] == $currentSiteUrl) ? ' selected' : '';
    $output .= '<option value="' . htmlspecialchars($item['url']) . '"' . $selected . '>' . htmlspecialchars($item['name']) . '</option>';
}

$output .= '</select>';

return $output;
Обновился до MODX 2.8.6 и наступили проблемы с сохранением родителя с вложенными ресурсами, без вложений сохраняет ок. Когда включаешь php 7.4 все сохраняет. В итоге проблемы с сохранением вызывал плагин autoredirector — после удаления плагина сохранение заработало. Есть проблемы с работой msGallery если попытаться обновить превьюхи под php 7.4 — идет бесконечная загрузка, с php 8 и выше все ок.
Здравствуйте! К сожалению замена на старую версию phpthumb не решила проблему(
Работает текстовой вотермарк, но почему то эта конструкция игнорирует размер шрифта.

[{"w":450,"h":450,"q":90,"zc":"0","bg":"FFFFFF","fltr":"wmt|site.name|20|C|FFFFFF||90|20|0||0|"},{"w":676,"h":676,"q":90,"zc":"0","bg":"FFFFFF","fltr":"wmt|site.name|28|C|FFFFFF||90|20|0||0|"}]
рабочий вариант, проверено

<?php
define('MODX_API_MODE', true);
require 'index.php';		// Если файл лежит не в корне - здесь нужно указать верный путь
$modx->getService('error','error.modError');
$modx->setLogLevel(modX::LOG_LEVEL_INFO);
$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'
	)
);

echo '<pre>';
echo $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();
	}
}

echo microtime(true) - $modx->startTime;
Спасибо всем за помощь! Что с феномом что без линки ведут на категорию самого верхнего уровня, а у меня вложенность: Catalog>Category1>Category2>Product (используя представленные примеры линки и заголовок ведут на Category1)