我正在开发一个项目,我需要一些自定义表单模板块。不是现有块的修改版本,而是新块。
我已经能够创建新的块并让 Symfony/Twig 识别和使用它们,但有限制。
表单模板块似乎有严格的命名约定。
看来模板名称必须恰好包含一个下划线。下划线之前的单词似乎也有要求和/或限制。我已经能够让 form_ 工作,但除此之外什么都没有。此外,如果您以 _widget 结尾块的名称,则不会引发异常,但如果您直接在页面模板中使用该块,则不会呈现任何内容。我认为 _widget 块只能在 form_blocks 中使用(正确吗?)。
我的目标是使用项目的首字母缩写(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 它工作正常。
所以,问题是:
自定义表单块的正式命名要求和限制是什么。
Update 27-Aug-2015 09:30
Some additional information in response to a comment by @lxg:
A block是一个简单的 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()
, and 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()
方法没有产生额外的理解。