Сергей Фещуков

Сергей Фещуков

Был в сети 11 августа 2026, 07:34
Заказы не принимаю
Отправить деньги
Когда делал и выкладывал компонент, не знал, что существует подобный. Но есть отличия наших компонентов:
1. В моём можно добавлять любые данные, а не только какие-то определённые.
2. В моём можно изменять цены товаров для различных городов.
3. Планируется сделать определение выбранного города и работу компонента по ссылкам и доменам. То есть, при переходе по ссылке moscow.site.ru или site.ru/moscow/ будет выбран город Москва и выводится данные, добавленные для этого города.

Я не знаю как сделать так, чтобы на тестовом сервере можно было устанавливать мои компоненты.
$assigned   =  $instance;
Этот код клонирует объект $instance и записывает в переменную $assigned указатель на клонированный.
$reference  =& $instance;
&$instance — указатель на объект. Соответственно, класс не клонируется, а у объекта просто появляется второе имя. То есть теперь $instance и $reference — это одно и то же. И любые изменения в одной переменной ведут к изменениям в другой.
Обработчик события успешного добавления товара в корзину:
miniShop2.Callbacks.Cart.add.response.success = function(response) {
    //здесь ваш js-код
}
/* Но не забывайте, что есть событие изменения количества товара в корзине */
miniShop2.Callbacks.Cart.change.response.success = function(response) {
    //здесь ваш js-код
}
Для товаров miniShop2 упрощённый вариант плагина:
<?php
if ( $modx->event->name != "OnDocFormSave" || $resource->get('class_key') != 'msProduct' || !empty($resource->get('article')) ) return;
$resource->set('article', substr($resource->get('alias'),0,2).'-'.$resource->get('parent').$resource->get('id'));
$resource->save();
$resource->clearCache();
Возьму на себя смелость переписать это дело под стандартное поле Артикул компонента miniShop2.
<?php
if ($modx->event->name=="OnDocFormSave") // Плагин срабатывает при сохранении ресурса
{
    $id = $resource->get('id'); // Получаем id ресурса
    $parent = $resource->get('parent'); // Получаем id родительского ресурса
    $alias = $resource->get('alias'); // Получаем alias ресурса
    $res = $modx->getObject('msProduct', $id); // Получаем объект товара
    $tvv = $res->get('article'); // Получаем артикул
    
    if (empty($tvv)) // Если артикул пустой то создаем его
    {
        $article = substr($alias,0,2).'-'.$parent.$id; // Создаем артикул
        $res->set('article', $article); // Записываем артикул в соответствующее поле
        $res->save(); // Сохраняем
        $res->clearCache(); // Чистим кеш
    }
}
Но в этом плагине смущают меня два момента:
1. Зачем снова получаем объект ресурса, если он есть в переменной $resource? По-моему, все функции, типа save() и clearCache() в нём тоже доступны.
2. Плагин выполняет код после сохранения страницы. При сохранении страницы чистится кэш (по умолчанию). И создаётся он только тогда, когда к странице снова обратятся на фронтенде (насколько я знаю). Зачем тогда снова чистить кэш после сохранения поля?
Смотрите файл конфига core/config/config.inc.php, насколько мне помнится, там также указывается адрес сайта, но влияет ли он на что-то или нет, я точно не знаю. Точно известно, что в этом же config.inc.php формируется MODX_BASE_URL и MODX_SITE_URL. Ещё после своих изменений удалить всё содержимое папки core/cache/. И должно всё заработать.
Плагин я пробовал, когда выставил в качестве обработчика динамический ресурс.
На OnPageNotFound вроде своего ничего не висит. Но вариант сменить событие на OnHandleRequest сработал и теперь появляется страница 404.
Спасибо за помощь.
$modx->sendErrorPage();
Приводит к циклическому редиректу.
Нашёл также такой вариант вызова:
$modx->sendErrorPage(array('stop' => true));
Но также приводит к циклическому редиректу.

Как правильно то перебросить на страницу 404?
Самый простой — 2 вариант. Только не полный код вы скопировали.
Создаёте плагин с любым именем. В него вставляете следующий код:
switch ( $modx->event->name ) {
	case 'msOnAddToCart':
		$tmp = $cart->get();
		$tmp[$key]['price'] = $tmp[$key]['price']+($tmp[$key]['price']*18)/100;
		$cart->set($tmp);	
		break;
}
Затем самое главное — устанавливаете в соседней вкладке запуск плагина при возникновении события msOnAddToCart. И сохраняете плагин. Готово.