Для понимая работы ЧПУ в prestashop следует посетить в админке вкладку preferences (настройка) -> seo & urls
.
Условно страница разделена на 3 основных блока:
- 1-й: SEO & URLS задает url для стандартных отдельных страниц (my-account, history, order и прочих), а так же для новых страниц, создаваемых для работы каких-либо модулей (например, блогов)
- 2-й: SET UP URLS включает/выключает ЧПУ, включает/выключает диакритические символы в url, некоторые настройки для apache
- 3-й: SCHEMA OF URLS определяет структуру url с помощью использования ключевых слов (они перечислены под соответствующим input-ом и * отмечены обязательные из них), например, структура url для категории:
{id}-{rewrite}
несложно догадаться, что id – id категории, а rewrite – значение из Friendly URL со страницы редактирования категории
для продукта:
{category:/}{id}-{rewrite}.html
{category:/} – категория, что id – id продукта, а rewrite – значение из Friendly URL со страницы редактирования продукта
Важно: все выше установленные правила будут работать с учетов языков магазина, т.е., когда Friendly URL, например, для английского и испанских языков у вас разные, то и в конечном итоге uri для объектов у вас тоже будут разные и на фронтенде они будут формироваться так же правильно с учетом языка.
Класс Dispatcher
Разруливаются ЧПУ с помощью Dispatcher – в точке входа (index.php) вызывается Dispatcher::getInstance()->dispatch();
,
именно этот метод и реализует человеко-понятные урлы.
Dispatcher::dispatch() – осуществляет разруливание урлов и запуск контроллера, в нем контроллеры делятся на 3 типы:
- фронт контроллеры
- фронт контроллеры модулей
- контроллеры панели администратора (в нем происходит проверка обычный ли это админ котроллер или принадлежащий модулю).
В этом же классе находятся и другие очень важные и любопытные методы:
- Dispatcher::getController() – получает контроллер из урлы, с помощью установленный роутов, если по каким-то причинам контроллер определить не удалось, то считаем, что обращение происходит к pagenotfound контроллеру;
- Dispatcher::getModuleControllers() – получает котроллеры модуля (напоминаю, что контроллеры модуля должны хранится здесь – директория_модулей/имя_модуля/controllers (_PS_MODULE_DIR_.$mod->name.’/controllers/’);
- Dispatcher::loadRoutes и Dispatcher::addRoute – осуществляют загрузку роутов, сначала берутся стандартные правила маршрутизации (из свойства default_routes класса Dispatcher), после чего из базы берутся роуты, которые создал/изменил пользователь на странице (SEO & URLS) и загружаются они.
- Dispatcher::createUrl() – возвращает нам правильный uri на сущность с учетом установленных правил маршрутизации, выбранного языка и магазина, чаще всего он (метод) используется в классе Link для получения верных урлов.
После обнаружения (или не обнаружения) контроллера (в Dispatcher::dispatch()) происходит его запуск, но перед этим (строкой выше) происходит вызов хука типа actionDispatcher в качестве параметров которого передаются: тип контроллера (фронт, фронт-модуля, админ), сам котроллер, а так же флаг принадлежит контроллер модулю или нет:
1 2 |
if (isset($params_hook_action_dispatcher)) Hook::exec('actionDispatcher', $params_hook_action_dispatcher); |
Обратите внимание, что в версии Prestashop 1.6 одноименных файлов в корне (для реализации ЧПУ как это было в версиях до 1.6: address.php, addresses.php, attachment.php и т.д.) НЕТ и это прекрасно.
Класс Link
Этот класс, пожалуй, чаще всего обращается к классу Dispatcher и то, к методу createUrl или getController.
Собственно, этот класс вспомогательный – здесь формируются ссылки на сущности в зависимости от языка, магазина, установленных роутов (хотя сами uri формируются в Dispatcher
$url.$dispatcher->createUrl('manufacturer_rule', $id_lang, $params, $this->allow, '', $id_shop);
), он как удобная обертка для получения ссылок:
$link->getManufacturerLink($manufacturer, $manufacturer->link_rewrite, $lang['id_lang']);
Еще очень удобным является тот факт, что объект link содержится в контексте и так же доступен нам в темплейтах.
Можно подвести итог, что свои правила маршрутизации задаются здесь preferences (предпочтения) -> seo & urls, а разруливание происходит с помощью класса Dispatcher, получить верные ссылки с учетом языка, текущего магазина и установленных правил маршрутизации можно с помощью класс Link, который доступен в объекте контекст и на темплейтах.