Encodera

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

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

Оглавление

Шаблоны 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 }}.

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

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