Как включить необработанные файлы HTML в шаблоны Symfony2/Twig?

Я работаю над проектом в Symfony2, и у меня есть несколько небольших фрагментов html, которые нужно включить в одно из моих основных представлений. Согласно официальной документации Twig, я должен иметь возможность просто использовать {% include 'filename.html' %}, но в Symfony, если имя файла не заканчивается на «.html.twig», он выдает ошибку, говорящую, что не может найти файл. Я хотел бы избежать использования шаблонов Twig для этих файлов, поскольку они не имеют динамического содержимого и большого количества двойных фигурных скобок (это шаблоны javascript), и требование, чтобы разработчик шаблонов должен был оборачивать каждый из этих файлов в теги {% raw %}, похоже на действительно Kludgey способ сделать это.


person wdh    schedule 05.10.2011    source источник
comment
Если в официальной документации сказано, что это должно работать, то, возможно, вам следует попытаться обновить twig и пакет twig до более новой версии (отредактируйте файл deps).   -  person greg0ire    schedule 05.10.2011
comment
Я пробовал, но я думаю, что эта проблема связана с тем, как Symfony обрабатывает расположение/тип шаблона, а не с проблемой Twig.   -  person wdh    schedule 06.10.2011
comment
Тогда вам, возможно, следует подать отчет об ошибке.   -  person greg0ire    schedule 06.10.2011


Ответы (4)


Краткий обзор расширений файлов twig (взято из документации):

Каждое имя шаблона также имеет два расширения, которые определяют формат и механизм для этого шаблона.

AcmeBlogBundle:Blog:index.html.twig - HTML format, Twig engine
AcmeBlogBundle:Blog:index.html.php - HTML format, PHP engine
AcmeBlogBundle:Blog:index.css.twig - CSS format, Twig engine

По умолчанию любой шаблон Symfony2 может быть написан либо на Twig, либо на PHP, а последняя часть расширения (например, .twig или .php) указывает, какой из этих двух движков следует использовать. Первая часть расширения (например, .html, .css и т. д.) — это окончательный формат, который будет создан шаблоном.

Поэтому для меня имеет смысл, что включение файла как .html было бы как минимум двусмысленным, даже если бы оно не выдавало ошибку.

Итак, у вас есть 3 варианта:

  1. Если файлы представляют собой чисто javascript, включите их в качестве тегов script на свою страницу.

  2. Если они смешаны HTML и JS, избегайте JS с помощью {% raw %} и включайте файлы как шаблоны foo.html.twig. Если таких скриптов включено много, то, скорее всего, ваши дизайнеры могли бы сделать небольшой рефакторинг и перенести большую часть своих скриптов во внешние файлы (см. вариант 1).

  3. Если вы действительно настаиваете, вы всегда можете написать расширение Twig для включения необработанных HTML-файлов. (EDIT: см. Ответ @Haprog ниже для получения более подробной информации об этой опции).

    {{ include_html('foo/bar.html') }}

  4. UPDATE 2015 twig с тех пор добавил исходную функцию:

{{ source('AcmeSomeBundle:Default:somefile.html.twig') }}

Спасибо @Nigel Angel в комментариях ниже за вариант 4.

person rdjs    schedule 13.10.2011
comment
Я пытаюсь сделать так, чтобы шаблоны усов были включены на страницу для использования javascript. Помещение их непосредственно в шаблон, окруженное тегами {% raw %}, работает, но я чувствую, что это довольно неорганизованно и может стать громоздким, когда есть много маленьких кусочков шаблона. Загрузка битов шаблона через ajax излишне замедляет работу на стороне клиента, поскольку запросов больше. Помещение шаблонов в файл ветки, в котором нет фактической разметки ветки (кроме {% raw %}), вызывает у меня ошибку у разработчика OCD, но в данном случае это кажется самым простым вариантом. Спасибо. - person wdh; 13.10.2011
comment
twig с тех пор добавил функцию source {{ source('AcmeSomeBundle:Default:somefile.html.twig') }} - person Nigel Angel; 15.05.2014
comment
Можно ли вместо этого использовать файлы phtml? - person Yes Barry; 03.03.2015

Я также столкнулся с той же проблемой, пытаясь найти решение для включения файлов (шаблонов усов) как необработанных в шаблоны Twig, чтобы Twig не пытался их анализировать.

Сначала мои файлы шаблонов усов назывались просто sometemplate.html и были заключены в теги {% raw %}. Какое-то время это работало, но потом я начал использовать PhpStorm IDE с плагином Handlebars (для синтаксиса усов). Чтобы PhpStorm распознал файлы с синтаксисом усов, они должны иметь уникальное расширение файла (.mustache по умолчанию), поэтому я переименовал свой файл sometemplate.html в sometemplate.mustache, но мне очень не нравилась идея о том, что мои шаблоны усов должны быть обернуты с помощью Теги ветки. Так что в итоге я сделал то, что @rdjs сказал в своем варианте 3. Это лучшее решение, имхо.

Вот работающая функция расширения Twig, которую я сделал:

function twig_include_raw(Twig_Environment $env, $template) {
    return $env->getLoader()->getSource($template);
}
$twig->addFunction('include_raw', new Twig_Function_Function('twig_include_raw', array('needs_environment' => true)));

Имея это на месте, вы можете легко включать файлы как «сырые» без их разбора Twig, выполнив:

{{ include_raw('sometemplate.mustache')|raw }}

Я даже сделал макрос Twig для упрощения включения шаблонов усов в разделы заголовка HTML:

{% macro mustache_script(id, file) -%}
<script id="{{ id }}" type="text/x-mustache-template">
{{ include_raw(file)|raw }}
</script>
{%- endmacro %}

А после импорта файла с вышеуказанным макросом в ваш шаблон Twig (например, {% import "macros.twig" %}) вы можете легко импортировать файлы шаблонов усов в свои шаблоны Twig, просто выполнив {{ mustache_script('sometemplate_tpl', 'sometemplate.mustache') }} внутри раздела HTML <head>.

Я надеюсь, что это поможет кому-то, кто ищет решение той же проблемы.

person Haprog    schedule 29.08.2012
comment
Кажется, это решит проблему, которую я рассматриваю, но я понятия не имею, где должна быть определена функция twig_include_raw и что/когда следует вызывать $twig->addFunction. Можете ли вы объяснить это немного подробнее. - person Craig; 24.10.2012
comment
@Craig Извините, что не ответил раньше. Вы можете определить функцию где угодно. Просто не забудьте вызвать $twig->addFunction() в любом месте после того, как вы настроили Twig с помощью $twig = new Twig_Environment($loader);. Обычно у меня есть собственная функция twigInit(), которая занимается настройкой среды Twig, включая загрузку используемых мной расширений. Вы также можете прочитать страницу документации о расширении Twig по адресу twig.sensiolabs.org/doc/advanced. .html - person Haprog; 14.02.2013
comment
Отлично. Вы можете обойти потребность в | raw, если вы добавите 'is_safe'=› array('all') к параметрам после needs_environment. - person Matt Kenefick; 30.07.2013
comment
Из какого пространства имен вы используете Twig_Function_Function? Куда добавляется этот код? Я пытаюсь в контроллере. Редактировать: Ах, new \Twig_Function_Function - person Nigel Angel; 15.05.2014

Я наткнулся на этот пост, так как у меня был аналогичный вопрос. Примерно через час поисков и попыток я обнаружил, что начиная с Twig Version 1.15 " исходная функция" была добавлена.

Может быть, это поможет кому-то в будущем.

person Chris    schedule 28.05.2014

Следите за Кари, если вы находитесь в расширении ... вы можете применить его таким образом.

public function getFunctions() {
    return [
        'include_raw' =>  new \Twig_Function_Method($this, 'twig_include_raw', array('needs_environment'=> true, 'is_safe'=> array('all')))
    ];
}

И это будет метод типа $this->twig_include_raw. Вы бы включили в свой шаблон как:

{{ include_raw("my/file/here.html.twig") }}

Нет необходимости в "| raw".

person Matt Kenefick    schedule 29.07.2013