繁体   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