I’ve just released Twig 1.4.0 RC2.
Like RC1, it focuses on performance with some nice tweaks. The biggest change is that Twig now comes with an optional C extension that you can install to enhance the runtime performance of Twig templates (it overrides the Twig_Template::getAttribute() method by a C implementation).
Please try out this release candidate on your current projects; and be sure to
report any regressions or bugs
before we mark this release as stable.
Вышел Twig 1.1.1. В этой версии была неплохо улучшена производительность.
И не забудьте очистить кэш после обновления.
Twig 1.1.0 доступен для скачивания
Вышел Twig 1.1 RC2. В этой версии исправлено несколько ошибок RC1. Пожалуйста, примите участие в тестировании этой версии и сообщите о любых найденных багах.
Вот, наконец-то, и вышел Twig 1.1 RC1, и, надеюсь, скоро выйдет финальный релиз. В Twig 1.1 исправлено несколько мелких ошибок, но главное – это добавление следующего функционала:
spaceless, но как же быть с пробелами возле тэгов Twig? Теперь можно удалять пробелы до или после тэгов Twig просто добавив «-» с нужной стороны тэга. Вы можете почитать об этом в документации.Обновляйтесь Twig до 1.1! Только не забудьте очистить кэш.
Понятные сообщения об ошибках одна из сильных сторон Twig, особенно, когда речь идет о синтаксических ошибках в шаблонах. Теперь эти сообщения стали еще лучше.
Во-первых, Twig 1.1 добавляет название шаблона и номер строки, в которой произошла ошибка, в сообщение о ней (даже если исключение вызвано не Twig – ниже подробнее об этом). И это очень удобно при отладке.
Далее, когда бросалось исключение во время обработки шаблона, довольно проблематично было узнать, откуда оно было вызвано.
Это из-за того, что Twig не перехватывал исключения и поэтому сообщение об ошибке указывало на место, где рендериться шаблон (скорее всего – в контроллере). Конечно, всегда можно посмотреть на стек исключений PHP, и увидеть, что ошибка содержится, к примеру, в скопилированном файле, а не в оригинальном шаблоне. Это хорошо для разработчиков PHP, но никак не для верстальщика.
Twig 1.1 убрал эту проблему, теперь все исключения рендеринга шаблонов содержат информацию о том, где они произошли в оригинальном файле шаблона.
Рассмотрим следующий шаблон:
{{ foo.bar }}
Где Foo выглядит так:
class Foo
{
public function bar()
{
throw new Exception('Ошибка вызова bar.');
}
}
Сообщение об ошибке в Twig 1.0:
Uncaught exception 'Exception' with message 'Ошибка вызова bar.' in .../controller.php:22
И сообщение об ошибке в Twig 1.1:
Next exception 'Twig_Error_Runtime' with message 'An exception has been thrown during the rendering of a template ("Ошибка вызова bar.") in "index" at line 13.'
И еще лучше с PHP 5.3, где исключения Twig можно обрабатать вашим кодом.
Я уверен что вам понравятся эти изменения, так как они безусловно могут повысить производительность.
Наконец-то вышел долгожданный финальный релиз Twig 1.0.0.
С релиза RC2 были исправлены один major баг (при использовании песочницы, все вызовы методов дублировались) и два minor бага. Теперь ведется работа над Twig 1.1
Рад сообщить, что вышел второй релиз-кандидат Twig 1.0.0. В этом релизе исправлены некоторые ошибки, код использующий библиотеку должен работать без каких-либо изменений. Если не будет найдено никаких существенных ошибок, через несколько дней выйдет окончательная версия Twig.
Наконец то вышел долгожданный первый RC Twig 1.0, что положит начало циклу релизов версии 1.0. Это значит что отныне будет сохраняться обратная совместимость.
Кроме многочисленных мелких оптимизаций и улучшения вывода сообщений об ошибках (смотрите лог изменений), этот релиз содержит две важные особенности: функции и глобальные переменные. Они очень упрощают использование Twig).
Twig имеет много возможностей для расширения и каждый релиз их увеличивает. Две наиболее распространенные – фильтры и тэги. Фильтры очень легко сделать, но они могут только преобразовывать значение; добавить тэг сложнее, да и реже необходимо, так как они определяют структуру языка (которая меняется не очень часто).
До сих пор тэги использовались, если надо было добавить какой-либо сложный функционал в шаблоны (в том числе и в ядро Twig). Теперь, с введением функций, ситуация изменилась.
Функции Twig похожи на функции PHP. Они похожи на макросы (macro), но определенные в PHP коде. Это позволяет легко добавлять новые функции, генерирующие содержание. Рассмотрим два примера, где тэг и фильтр были преобразованы в функции:
{# range() это скорее не фильтр, а функция преобразующая аргумент в другое значение #}
{# 1 это первый аргумент фильтра #}
{% for in 1|range(10) %}
{# теперь range это функция, генерирующая массив #}
{% for i range(1, 10) %}
{# display это все же не языковая конструкция, а способ отобразить блок #}
{% display title %}
{# функция block теперь отображает содержимое блока #}
{{ block('title') }}
Функции можно спокойно использовать в любых выражениях:
{{ range('a', 'z')|join(', ') }}
Список всех фильтров и тегов которые были преобразованы в функции в Twig 1.0 RC1:
| До | После |
|---|---|
{% for in 1|range(10) %}
|
{% for i range(1, 10) %}
|
{% if status is "Post::PUBLISHED"|constant %}
|
{% if status is constant("Post::PUBLISHED") %}
|
{{ ['odd', 'even']|cycle(i) }}
|
{{ cycle(['odd', 'even'], i) }}
|
{% parent %}
|
{{ parent() }}
|
{% display title %}
|
{{ block('title') }}
|
Иногда бывает нужно определить переменную, которая будет всегда доступна в шаблоне:
// Глобальная переменная может быть константой
$twig->addGlobal('pi', 3.14);
// или любой переменной PHP, например, объектом:
$twig->addGlobal('request', new Request());
Глобальные переменные используются в шаблонах точно так же как и обычные:
{{ pi }}
{{ request.params('name') }}
Теперь, при желании расширить Twig, имейте в виду следующее:
| Что? | Как сложно? | Как часто? | Когда? |
|---|---|---|---|
| макросы | легко | часто | Генерация контента |
| глобальные переменные | легко | часто | Хелперы |
| функции | легко | часто | Генерация контента |
| фильтры | легко | часто | Изменение значений |
| тэги | сложно | редко | Изменение структуры языка |
| проверки | легко | редко | Булевы структуры |
| операторы | легко | редко | Изменение значений |
Вот и пришло время нового релиза Twig. И я надеюсь, что он последний, перед версией 1.0.
Обратите внимание, скоро информация о различиях версий будет удалена из документации. Так что сейчас самое время перейти на последнюю версию Twig и подготовиться к выходу 1.0.
Как обычно, полный список изменений.
В этом посте описаны только самые важные.
Изменен синтаксис обычных и ассоциативных массивов:
Обычные массивы по прежнему можно определить с помощью квадратных скобок: [1, 2];
Ассоциативные массивы теперь определяются с помощью круглых скобок: {"a": вместо
"b"}["a": "b"];
Обычные массивы с ключами и ассоциированные без ключей больше не поддерживаются: [1, "foo": "bar"] или {"foo": "bar", 1}.
Расширение Escaper теперь включено по умолчанию, что означает экранирование всех переменных.
Экранирование можно отключить выставив опцию autoescape равную false:
$env = new Twig_Environment($loader, array('autoescape' => false));
Или вы можете удалить расширение Escaper (тэг autoescape больше не существует):
$env->removeExtension('escaper');
Расширение i18n перемещено в репозитарий расширений Twig
Удален атрибут without loop из тега for, так как теперь для этого есть расширение Optimizer (см ниже).
Новое расширение Optimizer (которое по умолчанию подключено) оптимизирует шаблоны до их компиляции. На сегодняшний день он делает 2 вещи:
Удаляет создание переменной в цикле for, если вы ее не используете;
Удаляет фильтр raw, который нужен только для того чтобы корректно работало экранирование.