Шаблоны Twig
Шаблон — файл с HTML страницы, в котором места для данных помечены особыми тегами. OpenCart использует язык шаблонов Twig. Контроллер готовит массив данных, шаблон превращает его в HTML.
Где лежит
Шаблоны витрины лежат в catalog/view/template/, у файлов расширение .twig. Путь повторяет путь контроллера:
catalog/
├── controller/information/hello.php
└── view/template/information/hello.twigСоздание шаблона
Создайте catalog/view/template/information/hello.twig вручную:
{# catalog/view/template/information/hello.twig #}
<h1>{{ heading_title }}</h1>
<p>{{ text_welcome }}</p>Двойные фигурные скобки выводят переменную. Первая строка — комментарий Twig, на страницу он не попадает.
Вывод из контроллера
// catalog/controller/information/hello.php
public function index(): void
{
$this->load->language('information/hello');
$data = [];
$this->response->setOutput($this->load->view('information/hello', $data));
}Откройте index.php?route=information/hello — страница покажет заголовок и приветствие. load->view() принимает путь к шаблону без расширения и массив данных. Тексты в $data не клали: все строки загруженных файлов перевода сами становятся переменными шаблона.
Переменные
Каждый ключ $data становится переменной:
$data['name'] = $this->request->get['name'] ?? '';
$data['products'] = [
['name' => 'Кружка', 'price' => '$8.00'],
['name' => 'Футболка', 'price' => '$15.00'],
];Условия и циклы
{% if name %}
<p>Здравствуйте, {{ name }}!</p>
{% else %}
<p>{{ text_welcome }}</p>
{% endif %}
<ul>
{% for product in products %}
<li>{{ product.name }} — {{ product.price }}</li>
{% else %}
<li>Товаров нет.</li>
{% endfor %}
</ul>В тегах со знаком процента записана логика. Элемент массива читают через точку. Ветка else у for выводится, когда массив пуст.
| Запись | Смысл |
|---|---|
{{ name }} | Вывести переменную |
{% if ... %} | Условие |
{% for item in items %} | Цикл |
{{ name|upper }} | Фильтр: изменить значение перед выводом |
{# ... #} | Комментарий |
Шапка и подвал
Контроллер вызывает контроллеры шапки и подвала и передаёт их HTML в шаблон:
$data['header'] = $this->load->controller('common/header');
$data['column_left'] = $this->load->controller('common/column_left');
$data['footer'] = $this->load->controller('common/footer');{{ header }}
<div id="information-hello" class="container">
<div class="row">{{ column_left }}
<div id="content" class="col">
<h1>{{ heading_title }}</h1>
<p>{{ text_welcome }}</p>
</div>
</div>
</div>
{{ footer }}Теперь на странице есть меню магазина, левая колонка с модулями и подвал. Этот каркас одинаков во всех шаблонах витрины в ядре.
Частая ошибка
Twig в OpenCart не экранирует переменные: автоматическое экранирование выключено, потому что в шаблон передают готовый HTML шапки и подвала. Данные, которые пришли не через $this->request — из импорта, из внешнего API, — нужно экранировать вручную: {{ name|escape }}.