如何创建自定义的Symfony2 Twig表单模板块
我正在为我需要一些自定义表单模板块的项目工作。 不是现有块的修改版本,而是新块。
我已经能够创建新的模块并获得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' => 'SymfonyBridgeTwigNodeSearchAndRenderBlockNode',
'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,它可以正常工作。
所以,问题是:
自定义表单块的正式命名要求和限制是什么?
更新日期27-Aug-2015 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()
)中的一些是由类SymfonyBridgeTwigNodeSearchAndRenderBlockNode
所述getFunctions()
在方法FormExtension.php
)。
Twig snippets for these are defined in vendor/symfony/symfony/src/Symfony/Bridge/Twig/Resources/views/Form/form_div_layout.html.twig
。
我想要做的是创建具有项目特定名称的新窗体块。
我已经能够创建新的自定义窗体块(如上所示),但不能使用我想要使用的名称。
检查SymfonyBridgeTwigNodeSearchAndRenderBlockNode()
方法没有得到额外的理解。
原来, SymfonyBridgeTwigNodeSearchAndRenderBlockNode()
方法是限制来自哪里。
还有另一种方法可以让我使用我想要的名称。 它是SymfonyBridgeTwigNodeRenderBlockNode()
。
上一篇: How to create a custom Symfony2 Twig form template block