Заголовок страницы, хлебные крошки и пагинация
Готовой странице кроме содержимого нужны ещё три вещи: заголовок во вкладке браузера, путь от главной страницы (хлебные крошки) и, для длинных списков, ссылки на следующие страницы. Первое задают через объект $this->document, остальные два — массивы, которые контроллер передаёт шаблону.
Объект document
$this->document собирает то, что шапка выводит внутри тега head. Заполнить его нужно до вызова контроллера шапки:
// catalog/controller/information/hello.php
$this->load->language('information/hello');
$this->document->setTitle($this->language->get('heading_title'));
$data['header'] = $this->load->controller('common/header');Откройте index.php?route=information/hello — во вкладке браузера написано «Здравствуйте».
| Метод | Что задаёт |
|---|---|
setTitle($title) | Заголовок страницы |
setDescription($text) | Мета-описание |
setKeywords($text) | Ключевые слова |
addStyle($href) | Файл стилей |
addScript($href) | Скрипт |
addLink($href, $rel) | Тег link, например канонический адрес |
Хлебные крошки
Контроллер строит массив — от главной страницы до текущей:
$language = 'language=' . $this->config->get('config_language');
$data['breadcrumbs'] = [];
$data['breadcrumbs'][] = [
'text' => $this->language->get('text_home'),
'href' => $this->url->link('common/home', $language),
];
$data['breadcrumbs'][] = [
'text' => $this->language->get('heading_title'),
'href' => $this->url->link('information/hello', $language),
];Шаблон выводит его сразу после шапки:
<ul class="breadcrumb">
{% for breadcrumb in breadcrumbs %}
<li class="breadcrumb-item"><a href="{{ breadcrumb.href }}">{{ breadcrumb.text }}</a></li>
{% endfor %}
</ul>Над заголовком появится строка «Главная / Здравствуйте».
Пагинация
Постраничный вывод — это три шага: прочитать номер страницы, запросить у модели только строки этой страницы, построить ссылки.
$page = max(1, (int) ($this->request->get['page'] ?? 1));
$limit = 4;
$this->load->model('catalog/product');
$products = $this->model_catalog_product->getProducts(['start' => ($page - 1) * $limit, 'limit' => $limit]);
$total = $this->model_catalog_product->getTotalProducts([]);В четвёртой версии ссылки строит контроллер common/pagination:
$data['pagination'] = $this->load->controller('common/pagination', [
'total' => $total,
'page' => $page,
'limit' => $limit,
'url' => $this->url->link('information/hello', $language . '&page={page}'),
]);Текст {page} в адресе заменяется номером страницы. Контроллер возвращает готовый HTML, шаблон выводит его через {{ pagination }}. Откройте index.php?route=information/hello&page=2 — страница покажет вторую четвёрку товаров и ссылки «1 2 3».
Частая ошибка
$this->document->setTitle() вызывают после $this->load->controller('common/header'). Шапка к этому моменту уже отрисована, и во вкладке стоит название магазина вместо заголовка страницы. Сначала задайте всё через $this->document, и только потом вызывайте шапку.