Начиная с версии 1,5 в Prestashop появилась нормальная возможность реализации фронт контроллера для кастомного модуля с помощью добавленного класса ModuleFrontControllerCore, являющегося потомком FrontController.
Основные отличия от обычного FrontController это: тип самого контроллера (свойство controller_type), наличие свойства module, хранящего модуль, породивший этот контроллер и метод getTemplatePath с отличиями в поиске темплейтов.
Отличие в путях которые использует ModuleFrontController::getTemplatePath($template):
1. сначала ищется шаблон по пути название_темы/modules/имя_модуля/сам_шаблон (_PS_THEME_DIR_.'modules/'.$this->module->name.'/'.$template
)
2. если предыдущий вариант ничего не принес, то поиск осуществляется здесь название_темы/modules/имя_модуля/views/templates/front/сам_шаблон (PS_THEME_DIR_.'modules/'.$this->module->name.'/views/templates/front/'.$template
)
3. если предыдущий вариант также ничего не принес, то последняя попытка происходит здесь директория_модулей/имя_модуля/views/templates/front/сам_шаблон (_PS_MODULE_DIR_.$this->module->name.'/views/templates/front/'.$template
).
Создание кастомного фронт контроллера стало очень и очень простым, для этого (рассмотрим на примере модуля mailalerts в упрощенном варианте), сначала размещаем контроллер в директории модуля, а именно по пути имя_модуля/controllers/front/имя_контроллера (/modules/mailalerts/controllers/front/account.php
)
1 2 3 4 5 6 7 8 9 10 |
class MailalertsAccountModuleFrontController extends ModuleFrontController { public function initContent() { parent::initContent(); $this->context->smarty->assign('id_customer', Context::getContext()->customer->id); $this->setTemplate('mailalerts-account.tpl'); } } |
Здесь, в методе initContent() устанавливается кастомный темплейт для этого модуля. С новым контроллером работаем в обычном режиме (как с обычным потомком FrontController), если вы не задаете кастомный теплейт, то будет обычная страница без главного контента (заголовок, хуки, колонки подвал и т.д. на странице будут).
После создания контроллер будет доступен по пути /index.php?fc=module&module=mymodule&controller=mycontroller (или в нашем примере по пути /index.php?fc=module&module=mailalerts&controller=account
) – не самый лучший вариант для ЧПУ, на мой взгляд, поэтому рекомендую настроить адекватный url через админку (пожалуйста, не стоит использовать htaccess в данном случае, т.к. реализованные cms возможности достаточно широки) Preferences -> SEO & URLs блок SEO & URLs добавляем новый:
в поле Page ищем наш новый фронт контроллер, после чего заполняем все поля и сохраняем (подробнее о ЧПУ можно почитать здесь), если вас не устраивает такой вариант, то в блоке (Preferences -> SEO & URLs -> Schema of URLs) заданы вами или по-умолчанию правила маршрутизации для модулей, это значит, что ваш контроллера так же будет доступен по указанному шаблону.
Вот собственно и все, если вам необходимо ссылка на новую страницу воспользуйтесь методом Link::getPageLink() ($link->getModuleLink('mailalerts', 'account', array(), true)
) линк будет сформирован с установленными ранее (читай выше) правилами маршрутизации.