Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

События: изменение данных, вывода и аргументов

Обработчик не только наблюдает: он получает значения исходного вызова по ссылке и может их менять. Так дополнение добавляет блок на чужую страницу или исправляет данные перед сохранением — не трогая файл ядра.

Что получает обработчик

Вид триггераbeforeafter
controller, model&$route, &$args&$route, &$args, &$output
view&$route, &$data&$route, &$data, &$output

$args — массив аргументов исходного метода, $data — массив данных шаблона, $output — результат: значение, которое вернул метод модели, или готовый HTML. Амперсанд означает передачу по ссылке — изменение, сделанное в обработчике, увидит движок.

Все обработчики этого урока — методы файла extension/acme_hello/catalog/controller/module/acme_hello.php. Каждый регистрируют в install() со своим кодом и триггером, как в прошлом уроке.

Изменение данных шаблона

// триггер: catalog/view/product/product/before
public function productData(string &$route, array &$data): void
{
    $data['heading_title'] .= ' — ' . $this->config->get('module_acme_hello_text');
}

Откройте страницу товара — после названия товара стоит текст приветствия из настроек модуля. Обработчик изменил переменную до того, как шаблон был отрисован.

Изменение вывода

Новая переменная бесполезна, если шаблон ядра её не выводит. Тогда меняют готовый HTML:

// триггер: catalog/view/product/product/after
public function productOutput(string &$route, array &$data, string &$output): void
{
    $note = '<p class="acme-note">' . $this->config->get('module_acme_hello_text') . '</p>';
 
    $output = str_replace('</h1>', '</h1>' . $note, $output);
}

На странице товара сразу под заголовком появится абзац с текстом.

Изменение аргументов

// триггер: admin/model/catalog/product.addProduct/before
public function normalizeSku(string &$route, array &$args): void
{
    $args[0]['sku'] = strtoupper(trim($args[0]['sku'] ?? ''));
}

$args[0] — первый аргумент addProduct(), массив с формой товара. Добавьте в панели товар с артикулом mug-001 — он сохранится как MUG-001. Этот триггер относится к приложению панели, поэтому обработчик должен лежать в контроллере панели дополнения.

Изменение результата

В обработчике after для модели $output — то, что вернул метод:

// триггер: catalog/model/catalog/product.getProduct/after
public function productResult(string &$route, array &$args, mixed &$output): void
{
    if ($output) {
        $output['name'] = trim($output['name']);
    }
}

Отмена исходного вызова

Если обработчик before возвращает значение, исходный метод не выполняется, а возвращённое значение становится результатом. Так метод ядра заменяется полностью — и ломаются другие дополнения, подписанные на тот же вызов, поэтому это крайняя мера.

Частая ошибка

Вставка через str_replace() зависит от разметки темы. Магазин переходит на другую тему, где заголовок записан иначе, — и блок молча исчезает. Ищите устойчивые фрагменты, а после замены сравнивайте строку с исходной: если ничего не изменилось, пишите строку в журнал.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.