获取Twig中的输入类型以确定标签

时间:2015-02-08 19:26:56

标签: forms symfony label twig

我有这个

{% block form_row %}
    <div class="form-group">   
        {{ form_label(form) }}

        {{ form_widget(form) }}
    </div>
{% endblock form_row %}

用于覆盖主要的Twig表单字段。

但是我需要标签不同,具体取决于正在呈现的表单字段的类型。

如何在此处获取该内容,然后调用其他内容而不是form_label

我本来希望能够做到这一点,这是因为它出现的标签出现在复选框的输入之后,但是我想要反转它/自定义它。

{% block form_row %}
    <div class="form-group">   
        {% if(type is checkbox) %}
            // checkbox label here
        {% else %}
            {{ form_label(form) }}
        {% endif %}

        {{ form_widget(form) }}
    </div>
{% endblock form_row %}

2 个答案:

答案 0 :(得分:2)

您可以覆盖用于呈现特定表单类型的块。

例如,如果要覆盖电子邮件输入的标签模板,则应覆盖email_label块:

{% block email_label %}
This is the template used for all email input
{% endblock %}

{% block form_label %}
This is the fallback template for all other input types
{% endblock %}

您可以查看form.vars.block_prefixes

,查看可以覆盖特定表单视图的块

例如,对于“email”类型的“personnal_email”字段,它将包含:

array:4 [▼
  0 => "form"
  1 => "text"
  2 => "email"
  3 => "_form_personnal_email"
]

这意味着您可以覆盖块(从不太具体的一个开始)form_(widget|label|error)text_(widget|label|error)email_(widget|label|error)_form_personnal_email_(widget|label|error)(最后一个用于覆盖渲染一个非常具体的领域)。

它能回答你的问题吗?

<强>更新

这是你要做的事情:

{% block form_row %}
    <div class="form-group">   
        {{ form_label(form) }}

        {{ form_widget(form) }}
    </div>
{% endblock %}

{% block checkbox_label %}
    <!-- Your checkbox specific label -->
{% endblock %}

您无法访问type块中的form_row,因为它仅在form_widget的子块中定义(例如,请参阅here

答案 1 :(得分:0)

您可以使用自定义格式:

 <div class="form-group">
    {{ form_label(form.your_value, 'Your Title of field', { 'label_attr': {'class': 'col-sm-3 control-label'} }) }}
        <div class="col-sm-9">
            {{ form_widget(form.your_value, { 'attr': {'class': 'form-control selectJS'} }) }}
         </div>
 </div>

或者您可以使用FormType(如果您生成实体,这是Form文件夹中的文件),如:

<?php

namespace Ens\YourBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class NoticeType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('title','text', array(
                'label'=>'Title',
                'label_attr'=>array( 'class'=>'col-sm-3 control-label' ),
                'attr'=>array( 'class'=> 'form-control')
            ))
            ->add('text', 'textarea', array(
                'label'=>'Text',
                'label_attr'=>array( 'class'=>'col-sm-3 control-label' ),
                'attr'=>array( 'class'=> 'form-control')
            ))
            ->add('keep_on_top','checkbox', array(
                'label'=>'Keep on top',
                'required'=>false
            ))
            ->add('start', 'date', array(
                'attr'=>array( 'class'=> 'hidden')
            ))
            ->add('end', 'date', array(
                'attr'=>array( 'class'=> 'hidden')
            ))
        ;
    }

    /**
     * @param OptionsResolverInterface $resolver
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Ens\YourBundle\Entity\Notice'
        ));
    }

    /**
     * @return string
     */
    public function getName()
    {
        return 'notice';
    }
}