Немного о ЧПУ в версии Prestashop 1,5

Для понимая работы ЧПУ в 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 в качестве параметров которого передаются: тип контроллера (фронт, фронт-модуля, админ), сам котроллер, а так же флаг принадлежит контроллер модулю или нет:

Обратите внимание, что в версии 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, который доступен в объекте контекст и на темплейтах.