Содержание
Переопределение контроллеров
Как мы знаем, основной файл frontend-контроллера это файл /system/controllers/{имя компонента}/frontend.php. Иногда может возникнуть потребность, не внося изменений в этот файл, дополнить функциональность контроллера или вовсе его изменить. Для этого в CMS можно создать файл /system/controllers/{имя компонента}/custom.php.
Класс контроллера
В этом файле вы должны определить класс {имя компонента}_custom, унаследовав его от класса контроллера, объявленного в основном файле frontend-контроллера.
В простейшем случае класс выглядит так:
class shop_custom extends shop { public function __construct($request) { $this->name = str_replace('_custom', '', strtolower(get_called_class())); parent::__construct($request); } }
где shop - название компонента, совпадающие с названием его папки. Конструктор класса обязателен, в примере показано его минимальное содержимое.
Конечно же, вы можете унаследовать класс и от системного класса cmsFrontend и реализовать полностью свою логику выбранного компонента, также, как бы вы это делали в файле /system/controllers/{имя компонента}/frontend.php.
Определение действий
В этом файле вы можете переопределить/дополнить любой метод класса, начиная от основного контроллера (cmsController), заканчивая непосредственно вашим основным контроллером. Вы можете переопределить любой экшен, даже если он находится не в основном классе, а в папке actions директории контроллера.
Таким образом, вы можете переопределить любое поведение выбранного контроллера.
Переопределение действий во внешних файлах
Ядро сначала проверяет наличие внешнего экшена, а потом уже ищет внутренние. Поэтому, чтобы переопределить внешний экшен, нам нужно его переименовать воспользовавшись методом routeAction. Например:
public function routeAction($action_name){ if($action_name === 'index'){ $action_name = 'external_index'; } return $action_name; }
И после этого определить метод экшена с новым именем:
public function actionExternalIndex($params){ /****/ }
Не забудьте, что некоторые контроллеры уже могут содержать переопределение метода routeAction в своем файле frontend.php, соответственно вам нужно будет переопределять именно этот метод со всей логикой определенной в нем.