簡體   English   中英

如何創建自定義Symfony2 Twig表單模板塊

[英]How to create a custom Symfony2 Twig form template block

我正在開發一個項目,我需要一些自定義表單模板塊。 不是現有塊的修改版本,而是新塊。

我已經能夠創建新的塊並讓Symfony / Twig重新識別和使用它們,但有局限性。

看來表單模板塊有嚴格的命名約定。 模板名稱似乎必須只包含一個下划線。 對下划線之前的單詞似乎也有要求和/或限制。 我已經能夠將form_工作,但沒有別的。 此外,如果使用_widget結束塊的名稱,則不會拋出異常,但如果直接在頁面模板中使用塊,則不會呈現任何內容。 我認為_widget塊只能在form_blocks中使用(true?)。

我的目標是使用項目的首字母縮寫(wwui)命名我所有的新自定義塊,以便讓其他開發人員(以及我自己的某個地方:-)清楚地知道哪些標簽是特定於此項目的。

這就是我為了達到目前的觀點所做的工作:
- 創建Symfony表單自定義文檔中指定的fields.html.twig文件
- 在config.yml中的twig.form.resources中指定該表單
- 使用函數聲明創建一個Twig擴展 - 在我的模板中使用我的新塊

一個簡單的例子:

// TwigExtension.php
...
public function getFunctions()
{
  $ret = 
  [
    new \Twig_SimpleFunction( 'wwui_myBlock', 
            null,
            [ 'node_class' => 'Symfony\Bridge\Twig\Node\SearchAndRenderBlockNode',
'is_sage' => [ 'html' ]] ),
    ...
  ];
  return $ret;
)

{# fields.html.twig #}
{% block wwui_myBlock %}
  <p>A simple literal for testing.</p>
{% endblock wwui_myBlock %}

這將拋出異常:

An exception has been thrown during the rendering of a template ("Unable to render the form as none of the following blocks exist: "_siteActivityQueryForm_myBlock", "siteActivityQueryForm_myBlock", "form_myBlock".") in SiteBundle:Queries:activity.html.twig at line 31.

如果我將它重命名為form_byBlock,它可以正常工作。

所以,問題是:
自定義表單塊的正式命名要求和限制是什么。


更新於2015年8月27日09:30
響應@lxg評論的一些其他信息:

是一個簡單的HTML / Twig代碼塊,可以在子模板中重寫。

我認為這不完全准確。 塊(至少是表單塊)是Twig片段,其被引用為類似於Twig函數(例如, {{ form_widget( form ) }} )。

我在這里具體詢問表單塊。

許多這些函數在vendor/symfony/symfony/Bridge/Twig/Extension/FormExtension.php
其中幾個( form_widget()form_errors()form_label()form_row()form_rest()form_start()form_end() )由類Symfony\\Bridge\\Twig\\Node\\SearchAndRenderBlockNode (參見所述getFunctions()在方法FormExtension.php )。

這些的Twig片段在vendor/symfony/symfony/src/Symfony/Bridge/Twig/Resources/views/Form/form_div_layout.html.twig

我想要做的是創建具有項目特定名稱的新表單塊。

我已經能夠創建新的自定義表單塊(如上所示),但不能創建我想要使用的名稱。

檢查Symfony\\Bridge\\Twig\\Node\\SearchAndRenderBlockNode()方法沒有產生額外的理解。

事實證明, Symfony\\Bridge\\Twig\\Node\\SearchAndRenderBlockNode()方法是限制的來源。

還有另一種方法允許我使用我想要的名稱。 它是Symfony\\Bridge\\Twig\\Node\\RenderBlockNode()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM