Проблема
Пара событий смены опции в корзине названа несимметрично: «before» во множественном числе, «after» в единственном.
// core/components/minishop3/src/Services/Cart/CartMutationHandler.php:219
$response = $this->invokeEvent($controller, 'msOnBeforeChangeOptionsInCart', [...]);
// :269
$this->invokeEvent($controller, 'msOnChangeOptionInCart', [...]);
Это единственная такая пара из шести в реестре событий корзины:
// _build/elements/events.php:4-19
'msOnBeforeGetCart', 'msOnGetCart',
'msOnBeforeAddToCart', 'msOnAddToCart',
'msOnBeforeChangeInCart', 'msOnChangeInCart',
'msOnBeforeChangeOptionsInCart', 'msOnChangeOptionInCart', // ← Options / Option
'msOnBeforeRemoveFromCart', 'msOnRemoveFromCart',
'msOnBeforeEmptyCart', 'msOnEmptyCart',
Остальные пять пар строятся по правилу «имя после = имя до без Before». Здесь правило не работает, и угадать второе имя по первому нельзя.
Чем это плохо
Плагин, повешенный на несуществующее имя события, не вызывается и ничего не сообщает. MODX не проверяет, что событие с таким именем зарегистрировано — плагин просто никогда не сработает.
Человек пишет обработчик на msOnBeforeChangeOptionsInCart, затем по аналогии на msOnChangeOptionsInCart — и второй молчит. В логах пусто, в интерфейсе плагин выглядит подключённым.
Наша же документация на этом ошиблась: страница описывала msOnBeforeChangeOptionInCart в единственном числе, чего не существует вовсе. Если ошиблись мы, глядя в код, то тем более ошибётся тот, кто читает по памяти.
Что предлагается
Развилка, решение за мейнтейнером:
- Оставить как есть, но зафиксировать в документации оба имени рядом и прямым предупреждением. Ничего не ломается, цена — постоянная сноска.
- Добавить
msOnChangeOptionsInCart как основное имя, старое вызывать следом и пометить устаревшим. Существующие плагины продолжают работать, новые пишутся по общему правилу. Цена — два вызова на одно действие в течение переходного периода.
- Переименовать с ломающим изменением в следующем мажоре.
Второй вариант выглядит разумнее: правило имён восстанавливается, никто не ломается.
Если решение — вариант 1, issue можно закрыть, а сноску оставить в документации.
Затрагиваемые файлы
core/components/minishop3/src/Services/Cart/CartMutationHandler.php:219, :269 — вызовы
_build/elements/events.php:13-14 — регистрация
Найдено при сверке документации с кодом для страницы frontend/cart.
Проблема
Пара событий смены опции в корзине названа несимметрично: «before» во множественном числе, «after» в единственном.
Это единственная такая пара из шести в реестре событий корзины:
Остальные пять пар строятся по правилу «имя после = имя до без
Before». Здесь правило не работает, и угадать второе имя по первому нельзя.Чем это плохо
Плагин, повешенный на несуществующее имя события, не вызывается и ничего не сообщает. MODX не проверяет, что событие с таким именем зарегистрировано — плагин просто никогда не сработает.
Человек пишет обработчик на
msOnBeforeChangeOptionsInCart, затем по аналогии наmsOnChangeOptionsInCart— и второй молчит. В логах пусто, в интерфейсе плагин выглядит подключённым.Наша же документация на этом ошиблась: страница описывала
msOnBeforeChangeOptionInCartв единственном числе, чего не существует вовсе. Если ошиблись мы, глядя в код, то тем более ошибётся тот, кто читает по памяти.Что предлагается
Развилка, решение за мейнтейнером:
msOnChangeOptionsInCartкак основное имя, старое вызывать следом и пометить устаревшим. Существующие плагины продолжают работать, новые пишутся по общему правилу. Цена — два вызова на одно действие в течение переходного периода.Второй вариант выглядит разумнее: правило имён восстанавливается, никто не ломается.
Если решение — вариант 1, issue можно закрыть, а сноску оставить в документации.
Затрагиваемые файлы
core/components/minishop3/src/Services/Cart/CartMutationHandler.php:219,:269— вызовы_build/elements/events.php:13-14— регистрацияНайдено при сверке документации с кодом для страницы
frontend/cart.