如何在Symfony Twig渲染中检测窗口小部件类型?

时间:2014-04-03 23:48:12

标签: symfony twig

为了渲染表单行,我需要检测正在呈现的窗口小部件的类型。例如,对于复选框,我想在输入之前输入标签,所以我这样做了:

{% 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] 来确定要渲染的小部件。是对的吗?还是有更好的方法?我似乎无法在文档中找到它。

2 个答案:

答案 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;
    }
}