При расширении функциональности приложения часто возникает необходимость подменить один контроллер другим. Например, в приложении электронной коммерции (интернет-магазине) довольно часто требуется добавить дополнительные поля в html-форму заказа и произвести обработку добавленных полей (поместить введенные пользователем данные в БД, сообщить об успехе/неудаче операции пользователю и т.д.). При подмене контроллера следует руководствоваться таким алгоритмом:
- Создаем новый модуль, например, mymodule. Подробнее о том, как создавать модули, описано в Создание нового модуля.
- В каталоге модуля создаем контроллер (ext/mymodule/controllers/mycontroller.php) и, если нужно, модель (ext/mymodule/models/mymodel.php) и представление (ext/mymodule/views /myview.php). Подробнее, как создавать элементы приложения в MVC1, описано в МVC1. Например, контроллер, который мы хотим подменить, находится по адресу: ext/whop/controllers/catalog.php. В новом модуле по этому же адресу пишем свой контроллер: ext/mymodule/controllers/catalog.php.
- Далее можно использовать два варианта:
- Первый вариант. Создаём плагин на событие "После инициализации страницы" (Код (Id) события - sys_onPageInit). Подробнее о том, как работать с плагинами, описано в Плагины. В плагине прописываем правила подмены контроллеров следующим образом:
switch($parser->pageId)
{
case 'wshop/makeorder':
$parser->controller = 'mymodule/controllers/makeorder'; break;
}
Здесь wshop/makeorder – код (Id) страницы, на которой происходит замена контроллера, mymodule/controllers/makeorder – новый контроллер, который вносит другую функциональность в форму заказа. $parser – объект класса PageParser.
- Второй вариант. В карточке модуля mymodule, в поле Представление (View) для модуля выбираем модуль, в котором будем подменять объекты. Инсталлируем модуль mymodule. Если надо поменять все view и layout, копируем их из модуля-источника в mymodule и редактируем, т.е. копируем весь каталог views. Если надо подменить конкретный view, то копируем только его и редактируем. Аналогично работаем с контроллерами.