如何解决找出/自定义Symfony Forms Twig块名称
我想重写表单的各个部分的呈现方式,但是我总是忘记symfony表单呈现给哪个树枝块名称。如果找不到该块,则不会得到任何反馈,为什么找不到该块以及应如何调用它。
示例:
class SetPasswordType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder,array $options)
{
$builder->add('plainPassword',PasswordType::class);
$builder->add('repeatPlainPassword',PasswordType::class);
}
}
三个基本问题:
- symfony表单如何确定
SetPasswordType
的细枝块名称? - 我该如何查找?
- 如何自定义此内容?
解决方法
对于这种特定类型,树枝widget
的块名称为set_password_widget
。
像这样在您的表单主题中覆盖它:
{% block set_password_widget %}
<div class="row">
<div class="col">
{{ form_row(form.plainPassword) }}
</div>
<div class="col">
{{ form_row(form.repeatPlainPassword) }}
</div>
</div>
{% endblock %}
如何覆盖块
- 确定块前缀,默认情况下取决于类名称。对于
SetPasswordType
,它是set_password
- 确定要渲染的块。如果要更改布局,则可能会覆盖
row
块。如果要更改输入,则可能会覆盖widget
块。请参阅文档:https://symfony.com/doc/current/form/form_themes.html#form-fragment-naming - 将块前缀和块名称结合在一起。对于
widget
的{{1}}块,您要覆盖SetPasswordType
。 - 将树枝块放置在表单主题中。
覆盖失败的问题排查
- 检查细枝块是否位于
set_password_widget
中配置的文件中,或者是否包含表单主题。 - 检查
twig.form_themes
中的$blockPrefixes
,以查看确定了哪些块前缀。将首先查找数组中的最后一个条目。 - 检查
Symfony\Component\Form\Extension\Core\Type\BaseType::buildView
中的$blockNameHierarchy
,以查看要查找的特定块。将首先查找数组中的最后一个条目。
详细演练
块的名称在Symfony\Component\Form\FormRenderer::searchAndRenderBlock
变量内的Symfony\Component\Form\Extension\Core\Type\BaseType::buildView
中建立。 $blockPrefixes
定义了以下优先级(首先提到的是最高优先级。它被反向存储!):
- 唯一的块名称(根据属性名称分层构建)。
- 块前缀(如果已配置)
- 类型的名称(如果从
$blockPrefixes
继承,则该名称在AbstractType
中生成) - 所有父类型的名称(沿
AbstractType::getBlockPrefix()
方法的链之后)。
例如,它可能看起来像这样:
FormTypeInterface::getParent()
用树枝渲染表单时,将分别使用$blockPrefixes = [
0 => "form",# because `AbstractType::getParent()` returns `FormType`
1 => "set_password",# our type,name resolved automatically depending on class name
## at this position,a block prefix would be included if one is configured
2 => "_set_password" # the hierarchical unique name,prefixed with `_`. for the plainPassword field,this value would be "searchAndRenderBlock".
];
(例如Symfony\Component\Form\FormRenderer::searchAndRenderBlock
或$blockNameSuffix
)调用widget
。通过在每个可能的前缀后加上row
来创建$blockNameHierarchy
。
对于$blockNameSuffix
,它看起来像这样:
$blockNameSuffix == "row"
寻找这些块,然后选择可以找到的最高优先级的块。数组中的时间越晚,优先级越高。
自定义块前缀
您可以像这样自定义前缀:
$blockNameHierarchy = [
0 => "form_widget",1 => "set_password_widget",2 => "_set_password_widget"];
这将导致
class SetPasswordType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder,array $options)
{
$builder->add('plainPassword',PasswordType::class,['mapped' => false]);
$builder->add('repeatPlainPassword',['mapped' => false]);
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefault('block_prefix','my_custom_prefix');
$resolver->setDefault('block_name','my_custom_name');
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。