Как включить необработанные HTML-файлы в шаблоны Symfony2 / Twig? - PullRequest
10 голосов
/ 05 октября 2011

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

Ответы [ 4 ]

10 голосов
/ 29 августа 2012

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

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

Вот рабочая функция расширения 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>.

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

8 голосов
/ 13 октября 2011

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

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

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, то включи их как скрипттеги на вашей странице.

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

  3. Если выдействительно настаиваю на том, что вы всегда можете написать расширение Twig, включающее необработанные HTML-файлы.(РЕДАКТИРОВАТЬ: см. Ответ @ Haprog ниже для получения более подробной информации об этой опции).

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

  4. ОБНОВЛЕНИЕ 2015 С тех пор веточка добавила функцию источника:

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

Слава @Nigel Angel в комментариях ниже для варианта 4.

5 голосов
/ 28 мая 2014

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

Возможно, это поможет кому-то в будущем.

4 голосов
/ 30 июля 2013

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

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».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...