为了渲染表单行,我需要检测正在呈现的窗口小部件的类型。例如,对于复选框,我想在输入之前输入标签,所以我这样做了:
{% block form_row %}
{% spaceless %}
<div class="row">
{% if form.vars.block_prefixes[1] == "checkbox" %}
{{ form_widget(form) }}
{{ form_label(form) }}
{{ form_errors(form) }}
{% else %}
<div class="small-12 medium-3 columns">
{{ form_label(form) }}
</div>
{{ form_widget(form) }}
{{ form_errors(form) }}
{% endif %}
</div>
{% endspaceless %}
{% endblock form_row %}
我使用 form.vars.block_prefixes [1] 来确定要渲染的小部件。是对的吗?还是有更好的方法?我似乎无法在文档中找到它。
答案 0 :(得分:7)
如果您看到symfony cookbook,则可以找到:
块名称是字段类型和正在呈现字段的哪个部分的组合(例如小部件,标签,错误,行)
因此,要自定义复选框表单类型呈现,您可以为小部件顺序定义checkbox_widget块和checkbox_row:
{% block checkbox_widget %}
{% spaceless %}
<label {% for attrname, attrvalue in label_attr %} {{ attrname }}="{{ attrvalue }}"{% endfor %}>
{{ label }}
</label>
<input type="checkbox" {{ block('widget_attributes') }}{% if value is defined %} value="{{ value }}"{% endif %}{% if checked %} checked="checked"{% endif %} />
{% endspaceless %}
{% endblock checkbox_widget %}
{% block checkbox_row %}
{% spaceless %}
{{ form_widget(form) }}
{{ form_errors(form) }}
{% endspaceless %}
{% endblock checkbox_row %}
答案 1 :(得分:0)
如果模板中需要任何数据,而symfony默认不提供数据,则可以随时创建form type extension
表单类型扩展是一种使您可以在一个地方扩展许多表单类型的机制。您可以扩展所有表单类型,前提是您定义了正确的扩展类型(如果要扩展所有表单,则FormType::class
。
此扩展名同时提供当前实例的block_type
和所有表单类型的类名。让我们在任何通用模板(例如widget_attributes
)中使用这些变量。
我只在symfony 3.4
<?php
namespace YourBundle\Form\Extension;
use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormView;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\Extension\Core\Type\FormType;
class FormTypeExtension extends AbstractTypeExtension
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
}
public function buildView(FormView $view, FormInterface $form, array $options)
{
$type = $form->getConfig()->getType();
$inner_type = $type->getInnerType();
$view->vars = array_replace($view->vars, array(
'block_prefix' => $type->getBlockPrefix(),
'type_name' => get_class($inner_type)
));
}
public function getExtendedType()
{
return FormType::class;
}
}