Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Заголовок страницы, хлебные крошки и пагинация

Готовой странице кроме содержимого нужны ещё три вещи: заголовок во вкладке браузера, путь от главной страницы (хлебные крошки) и, для длинных списков, ссылки на следующие страницы. Первое задают через объект $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, и только потом вызывайте шапку.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.