Как использовать Twig

346
30 мая 2017, 03:30

У меня небольшой проект (mvc,OOP). Покажите пожалуйста как правильно подключать Twig и как его использовать в controller

Answer 1

Существует множество способов установки Twig-a. Самый простой и быстрый - это скачивание компонента с GitHub, после чего архив необходимо распаковать, и перекинуть каталог lib в папку с нашим проектом.

Ну а теперь давайте приступим к делу и рассмотрим структуру нашего небольшого проекта:

compilation_cache
lib
  Twig
templates
  base.html
  books.html
index.php

Весь функционал, связанный с подключением и настройкой Twig-а, содержится в файле index.php. В папке templates мы будем хранить файлы шаблонов. В нашем случае, этих файлов 2: base.html с базовым html кодом и books.html с выводом списка книг. В каталоге compilation_cache будут помещаться PHP файлы, созданные Twig-ом для работы.

Итак, первое что нам необходимо сделать, так это подключить Twig:

require_once 'lib/Twig/Autoloader.php';
Twig_Autoloader::register();

После этого сообщаем шаблонизатору, где у нас хранятся файлы шаблонов. В качестве аргумента передаём путь к каталогу templates:

$loader = new Twig_Loader_Filesystem('templates');

Затем создаём объект шаблонизатора и указываем ещё несколько опций:

$twig = new Twig_Environment($loader, array(
    'cache'       => 'compilation_cache',
    'auto_reload' => true
));

Параметру cache передаём путь к каталогу compilation_cache. Активируем опцию auto_reload, для того чтобы при обновлении страницы Twig заново обрабатывал шаблоны, и мы видели изменения. Если этого не сделать, то шаблонизатор просто закэширует страницы. Когда же работа над проектом будет завершена, эту опцию можно убрать, чтобы ваши страницы закэшировались и грузились ещё быстрее.

Для реализации нашего небольшого примера, возьмём список книг и сформируем массив вида ключ - значение:

$books = array(
    array('number' => 'Книга 1', 'title' => 'Гарри Поттер и философский камень', 'date' => '30.06.1997'),
    array('number' => 'Книга 2', 'title' => 'Гарри Поттер и Тайная комната', 'date' => '2.07.1998'),
    array('number' => 'Книга 3', 'title' => 'Гарри Поттер и узник Азкабана', 'date' => '8.07.1999'),
    array('number' => 'Книга 4', 'title' => 'Гарри Поттер и Кубок огня', 'date' => '8.07.2000'),
    array('number' => 'Книга 5', 'title' => 'Гарри Поттер и Орден Феникса', 'date' => '21.07.2003'),
    array('number' => 'Книга 6', 'title' => 'Гарри Поттер и Принц-полукровка', 'date' => '16.07.2005'),
    array('number' => 'Книга 7', 'title' => 'Гарри Поттер и Дары Смерти', 'date' => '21.07.2007')
);

Для того чтобы передать данные в какой-то шаблон и вывести html результат, нам необходимо воспользоваться методом render(); В качестве первого аргумента передаём название файла шаблона, который будем выводить. В качестве второго -массив вида ключ - значение. В дальнейшем по заданным ключам мы будем получать доступ к нашим данным в самих шаблонах.

echo $twig->render('books.html', array('books' => $books));

Общий вид файла index.php

    require_once 'lib/Twig/Autoloader.php';
Twig_Autoloader::register();
$loader = new Twig_Loader_Filesystem('templates');
$twig = new Twig_Environment($loader, array(
    'cache'       => 'compilation_cache',
    'auto_reload' => true
));
$books = array(
    array('number' => 'Книга 1', 'title' => 'Гарри Поттер и философский камень', 'date' => '30.06.1997'),
    array('number' => 'Книга 2', 'title' => 'Гарри Поттер и Тайная комната', 'date' => '2.07.1998'),
    array('number' => 'Книга 3', 'title' => 'Гарри Поттер и узник Азкабана', 'date' => '8.07.1999'),
    array('number' => 'Книга 4', 'title' => 'Гарри Поттер и Кубок огня', 'date' => '8.07.2000'),
    array('number' => 'Книга 5', 'title' => 'Гарри Поттер и Орден Феникса', 'date' => '21.07.2003'),
    array('number' => 'Книга 6', 'title' => 'Гарри Поттер и Принц-полукровка', 'date' => '16.07.2005'),
    array('number' => 'Книга 7', 'title' => 'Гарри Поттер и Дары Смерти', 'date' => '21.07.2007')
);
echo $twig->render('books.html', array('books' => $books));

Настройка базового шаблона.

Базовый шаблон представляет собой обычный html документ со специальными вставками:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru">
    <head>
        <title>{% block title %}{% endblock %}</title>
        <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
    </head>
    <body>
        <div id="content">
            {% block content %}
            {% endblock %}
        </div>
    </body>
</html>

В нашем главном шаблоне мы прописываем 2 блока: title и content. Названия блоков выбираем сами. В последствии, в эти общие блоки мы будем внедрять характерную для дочерних страниц информацию.

Настройка шаблона вывода книг

Для начала в дочернем шаблоне нам необходимо указать шаблон родителя:

{% extends "base.html" %}

Далее в блок title запишем название дочерней страницы, которая обработается Twig-ом и вставится между тегами title в базовом шаблоне:

{% block title %}Серия романов о Гарри Поттере{% endblock %}

Затем, пишем содержание, которое внедрится в блок под названием content в базовом шаблоне:

{% block content %}
<h1>Серия романов о Гарри Поттере</h1>
<div id="books">
    {% for book in books %}
    <div class="book">
        <strong>{{book.number}}</strong>. "<em>{{book.title}}"</em> - {{book.date}}
    </div>
    {% endfor %}
</div>
{% endblock %}

Тут же в цикле for (Twig for) мы проходимся по всем книгам, которые передали в данный шаблон с помощью записи $twig->render('books.html', array('books' => $books)); и для извлечения значений обращаемся к элементам массива по ключам: {{book.number}}, {{book.title}} и так далее. Таким образом, после срабатывания метода $twig->render('books.html', array('books' => $books)), Twig подгрузит шаблон books.html и сформирует html содержание. Далее он распознает, что books.html - это дочерний шаблон base.html, и поместит сформированное содержание в базовый шаблон. После всего этого Twig вернёт нам полноценную html страницу.

READ ALSO
Привет кто поможет с Telegram bot? написано на PHP

Привет кто поможет с Telegram bot? написано на PHP

У меня есть бот который при приветствии отправляет id пользователяПомогите реализовать генерацию этого id с помощью QR кода и отправку пользователю...

351
Помогите с парсером

Помогите с парсером

Помогите пожалуйста кот может, хочу парсить эту вкладку:

262
Пагинатор на php

Пагинатор на php

Итак, в интернете есть много инструкций, скриптов как сделать пагинатор для постраничного вывода из базы mysql, типа 1, 2, 3

303