我正在做一个项目,我需要一些自定义表单模板块。不是现有块的修改版本,而是新块。
我已经能够创建新的块,并让Symfony/Twig重新定义和使用它们,但有局限性。
表单模板块似乎有严格的命名约定。模板名称似乎必须正好包含一个下划线。下划线前面的单词似乎也有要求和/或限制。我能让form_工作,但没别的了。此外,如果您以_widget结束一个块的名称,则不会引发异常,但是如果您直接在页面模板中使用该块,则不会呈现任何异常。我假设_widget块只能从form_blocks内使用(真的吗?)。
我的目标是使用项目的首字母缩写(wwui)来命名我的所有新自定义块,以便让其他开发人员(以及我自己:-)清楚地知道哪些标记特定于此项目。
以下是我为达到当前目标所做的工作:
-创建一个字段。html。Symfony表单自定义文档中指定的细枝文件
-在细枝中指定该表单。类型配置中的资源。yml
-创建带有函数声明的细枝扩展-在我的模板中使用我的新块
一个简单的例子:
// 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,它就可以正常工作。
因此,问题是:
自定义表单块的正式命名要求和限制是什么。
块是简单的HTML/Twig代码块,可以在子模板中重写。
我认为这不完全准确。块(至少是表单块)是像Twig函数一样引用的Twig片段(例如,{{form_widget(form ) }}
)。
我在这里特别询问有关表单块的问题。
其中许多函数在供应商/symfony/symfony/Bridge/Twig/Extension/FormExtension中定义。php
以及其中一些(表单小部件()
,表单错误()
,表单标签()
,表单行()
,表单rest()
,表单开始()
,和form\u end()
)由类Symfony\Bridge\Twig\Node\searchanderblocknode
实现(请参见FormExtension中的
)。getFunctions()
方法)。php
在vendor/symfony/symfony/src/symfony/Bridge/Twig/Resources/views/Form/Form\u div\u layout中定义了它们的细枝片段。html。细枝
。
我想做的是用项目特定的名称创建新的表单块。
我已经能够创建新的自定义表单块(如上所示),但不能使用我想使用的名称。
检查Symfony\Bridge\Twig\Node\SearchAndRenderBlockNode()方法并没有获得额外的理解。
事实证明,Symfony\Bridge\Twig\Node\SearchAndRenderBlockNode()方法是限制的来源。
还有一种方法允许我使用我想要的名称。它是Symfony\Bridge\Twig\Node\RenderBlockNode()
。