2011-10-05 132 views
9

我正在研究Symfony2中的一個項目,並且我有幾個小部分的html需要包含在我的一個主視圖中。根據官方的Twig文檔,我應該可以簡單地使用{% include 'filename.html' %},但是在Symfony中,除非文件名以「.html.twig」結尾,否則會引發錯誤並指出找不到該文件。我想避免使用Twig模板來處理這些文件,因爲它們沒有動態內容和大量雙括號(它們是javascript模板),並且需要模板設計器必須將這些文件中的每一個都包裝在{% raw %}中真正Kludgey的方式來做到這一點。如何在Symfony2/Twig模板中包含原始HTML文件?

+0

如果官方文檔說它應該工作,那麼也許你應該嘗試更新樹枝和樹枝捆綁到一個更新的版本(編輯你的樹皮文件)。 – greg0ire

+0

我試過,但我認爲這個問題與Symfony如何處理模板位置/類型而不是Twig問題有關。 – wdh

+0

然後,你應該可能提交一個錯誤報告。 – greg0ire

回答

7

樹枝上的文件擴展名的快速回顧(從資料爲準):

每個模板的名稱也有指定爲模板的格式和發動機兩個擴展。

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的模板可以寫在任何嫩枝或PHP,以及擴展的最後一部分(例如.twig或.PHP)指定這兩個發動機應使用。擴展的第一部分(例如.html,.css等)是模板將生成的最終格式。

因此,對我來說,包含文件爲.html的文件即使沒有拋出錯誤也至少是含糊不清的。

所以,你有3種選擇:

  1. 如果文件是純粹的JavaScript然後將它們包括在您的網頁腳本標記。

  2. 如果它們混合使用HTML和JS,則使用{%raw%}轉義JS並將文件包含爲foo.html.twig模板。如果包含大量腳本,那麼很可能您的設計人員可以稍做重構,並將其大部分腳本移動到外部文件中(請參閱選項1)

  3. 如果您確實堅持始終可以寫一個Twig擴展以包含原始HTML文件。 (編輯:請參閱下面的@ Haprog的答案以獲取關於此選項的更多詳細信息)。

    {{include_html( '富/一個bar.html')}}

  4. UPDATE此後加入2015樹枝源函數:

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

榮譽給@奈傑爾天使在選項4下面的評論。

+1

我想要做的是讓鬍鬚模板被包含在頁面中供javascript使用。將它們直接放在包含'{%raw%}'標籤的模板中可行,但我覺得它非常混亂,並且在有很多小模板位時會變得笨重。由於存在更多的請求,通過ajax加載模板位會不必要地降低客戶端的速度。將模板放在沒有實際枝條標記的枝條文件中({%raw%}除外)會讓我的OCD開發人員感到厭倦,但在這種情況下,它似乎是最簡單的選項。謝謝。 – wdh

+5

twig自此添加'source'函數'{{source('AcmeSomeBundle:Default:somefile.html.twig')}}' –

+0

是否可以使用** phtml **文件? –

10

我也遇到了同樣的問題試圖找到在Twig模板中生成包含文件(鬍鬚模板)的解決方案,因此Twig不會嘗試解析它們。

起初,我把我的小鬍子模板文件簡單地命名爲sometemplate.html,並將其包裝在{% raw %}標籤中。這工作了一段時間,但後來我開始使用帶有Handlebars插件的PhpStorm IDE(用於鬍鬚語法)。對於PhpStorm將文件識別爲鬍鬚語法,它們需要具有唯一的文件擴展名(默認情況下爲.mustache),所以我將sometemplate.html重命名爲sometemplate.mustache,但我真的不喜歡我的鬍鬚模板需要用枝條標籤。所以我最終做了@rdjs在他的選項3中所說的。這是最好的解決方案。

這裏的工作枝條擴展功能我做:把它們解析

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))); 

有了這個地方,你可以很容易地包含文件爲「原始」沒有枝杈做:

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

我還送用於簡化在HTML頭部分包括小鬍子模板的樹枝宏:

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

在將包含上述宏的文件導入到Twig模板(例如,{% import "macros.twig" %})後,只需在HTML <head>部分內執行{{ mustache_script('sometemplate_tpl', 'sometemplate.mustache') }}即可輕鬆將小鬍子模板文件導入到Twig模板中。

我希望這可以幫助那些正在尋找相同問題解決方案的人。

+0

這看起來會解決我在看的問題,但我不知道應該在哪裏定義twig_include_raw函數,以及什麼時候應該調用$ twig-> addFunction。你能再解釋一下嗎? – Craig

+0

@克雷格對不起,我還沒有回覆。您可以在任何你喜歡的地方定義該功能。只要確保在使用'$ twig = new Twig_Environment($ loader)設置Twig後任何地方調用'$ twig-> addFunction()';'我通常有自己的'twigInit()'函數來處理設置Twig包括加載我使用的擴展。您可能還想閱讀關於在http://twig.sensiolabs.org/doc/advanced.html – Haprog

+2

上延伸Twig的文檔頁面。這非常棒。如果您在「needs_environment」之後的選項中添加「'is_safe'=> array('all')」,您可以繞過「| raw」的需求。 –

4

對Kari進行跟進,如果您在擴展中......可以使用這種方式。

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」。

相關問題