Я работаю над проектом в Symfony2, и у меня есть несколько небольших фрагментов html, которые нужно включить в одно из моих основных представлений. Согласно официальной документации Twig, я должен иметь возможность просто использовать {% include 'filename.html' %}
, но в Symfony, если имя файла не заканчивается на «.html.twig», он выдает ошибку, говорящую, что не может найти файл. Я хотел бы избежать использования шаблонов Twig для этих файлов, поскольку они не имеют динамического содержимого и большого количества двойных фигурных скобок (это шаблоны javascript), и требование, чтобы разработчик шаблонов должен был оборачивать каждый из этих файлов в теги {% raw %}
, похоже на действительно Kludgey способ сделать это.
Как включить необработанные файлы HTML в шаблоны Symfony2/Twig?
Ответы (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 варианта:
Если файлы представляют собой чисто javascript, включите их в качестве тегов script на свою страницу.
Если они смешаны HTML и JS, избегайте JS с помощью {% raw %} и включайте файлы как шаблоны foo.html.twig. Если таких скриптов включено много, то, скорее всего, ваши дизайнеры могли бы сделать небольшой рефакторинг и перенести большую часть своих скриптов во внешние файлы (см. вариант 1).
Если вы действительно настаиваете, вы всегда можете написать расширение Twig для включения необработанных HTML-файлов. (EDIT: см. Ответ @Haprog ниже для получения более подробной информации об этой опции).
{{ include_html('foo/bar.html') }}
UPDATE 2015 twig с тех пор добавил исходную функцию:
{{ source('AcmeSomeBundle:Default:somefile.html.twig') }}
Спасибо @Nigel Angel в комментариях ниже за вариант 4.
{% raw %}
, работает, но я чувствую, что это довольно неорганизованно и может стать громоздким, когда есть много маленьких кусочков шаблона. Загрузка битов шаблона через ajax излишне замедляет работу на стороне клиента, поскольку запросов больше. Помещение шаблонов в файл ветки, в котором нет фактической разметки ветки (кроме {% raw %}
), вызывает у меня ошибку у разработчика OCD, но в данном случае это кажется самым простым вариантом. Спасибо.
- person wdh; 13.10.2011
source
{{ source('AcmeSomeBundle:Default:somefile.html.twig') }}
- person Nigel Angel; 15.05.2014
Я также столкнулся с той же проблемой, пытаясь найти решение для включения файлов (шаблонов усов) как необработанных в шаблоны 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>
.
Я надеюсь, что это поможет кому-то, кто ищет решение той же проблемы.
$twig->addFunction()
в любом месте после того, как вы настроили Twig с помощью $twig = new Twig_Environment($loader);
. Обычно у меня есть собственная функция twigInit()
, которая занимается настройкой среды Twig, включая загрузку используемых мной расширений. Вы также можете прочитать страницу документации о расширении Twig по адресу twig.sensiolabs.org/doc/advanced. .html
- person Haprog; 14.02.2013
needs_environment
.
- person Matt Kenefick; 30.07.2013
new \Twig_Function_Function
- person Nigel Angel; 15.05.2014
Я наткнулся на этот пост, так как у меня был аналогичный вопрос. Примерно через час поисков и попыток я обнаружил, что начиная с Twig Version 1.15 " исходная функция" была добавлена.
Может быть, это поможет кому-то в будущем.
Следите за Кари, если вы находитесь в расширении ... вы можете применить его таким образом.
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".