Есть в yii\base\View метод
Код: Выделить всё
public function afterRender($viewFile, $params, &$output)
{
if ($this->hasEventHandlers(self::EVENT_AFTER_RENDER)) {
$event = new ViewEvent([
'viewFile' => $viewFile,
'params' => $params,
'output' => $output,
]);
$this->trigger(self::EVENT_AFTER_RENDER, $event);
$output = $event->output;
}
}
Задача состоит в следующем
- в одном view файле у меня есть шорткод [mycode]....[/mycode].
- сейчас я создаю handler, чтобы заменить эту часть на Html
- НО на странице присутствует меню, listМiew, несколько виджетов, галерея, в которых тоже присутсвуют свои вьюшки (набирается 50 штук и более).
- таким образом, мой хендлер начинает цепляться ко всем этим вьюшкам и выполнять в каждой поиск и замену шорткода. т.е на данном примере отрабатывает 49 раз вхолостую.
- подразумевается, что шорткодов на странице будет десятки (как в WP). Таким образом получаем десятки циклов на каждую вьюшку, среди которых содержащая шорткоды - всего одна.
Предлагаю, по аналогии, добавить вывод всего контента страницы в триггер yii\web\View::beginPage,
чтобы заменить все шорткоды в уже сформированной странице за один проход, а не по частям.
Ну или сделать некое событие, например EVENT_BEFORE_OUTPUT, где можно получить доступ к подготовленной к выводу странице.