Skip to content

[Events] Пара событий смены опции названа несимметрично: Options до, Option после #807

Description

@biz87

Проблема

Пара событий смены опции в корзине названа несимметрично: «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 в единственном числе, чего не существует вовсе. Если ошиблись мы, глядя в код, то тем более ошибётся тот, кто читает по памяти.

Что предлагается

Развилка, решение за мейнтейнером:

  1. Оставить как есть, но зафиксировать в документации оба имени рядом и прямым предупреждением. Ничего не ломается, цена — постоянная сноска.
  2. Добавить msOnChangeOptionsInCart как основное имя, старое вызывать следом и пометить устаревшим. Существующие плагины продолжают работать, новые пишутся по общему правилу. Цена — два вызова на одно действие в течение переходного периода.
  3. Переименовать с ломающим изменением в следующем мажоре.

Второй вариант выглядит разумнее: правило имён восстанавливается, никто не ломается.

Если решение — вариант 1, issue можно закрыть, а сноску оставить в документации.

Затрагиваемые файлы

  • core/components/minishop3/src/Services/Cart/CartMutationHandler.php:219, :269 — вызовы
  • _build/elements/events.php:13-14 — регистрация

Найдено при сверке документации с кодом для страницы frontend/cart.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingjavascriptPull requests that update javascript code

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions