Symfony2渲染表单小部件form_row()(HTML5注意事项)

时间:2012-08-19 22:15:05

标签: symfony twig

我想渲染表单小部件。这是我想要生成的原始HTML:

<input type="email" class="input-long" placeholder="Enter Email" name="email" id="email" required="required">

使用此:

{{ form_row(form.email, { 'type' : 'email', 'attr' : { 'class' : 'input-long', 'placeholder': "Enter Email", 'name': "email", 'id':"email", 'required': "required"}}) }}

未生成所需的输出(例如,输入类型为“text”)。

如何自定义表单窗口小部件以指定输入类型,占位符等?

更新

这是我的表单类:

class ContactType extends AbstractType
{
    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder
            ->add('fist_name')
            ->add('last_name')
            ->add('email')
            ->add('token')
            ->add('is_validated')
            ->add('created_at')
            ->add('updated_at')
            ->add('promotion')
            ->add('refferer')
        ;
    }

    public function getName()
    {
        return 'acme_contactlistbundle_contacttype';
    }

    public function getDefaultOptions(array $options)
    {
        return array(
            'data_class' => 'Acme\ContactlistBundle\Entity\Contact',
        );
    }
}

{{ form.email }}呈现:

<label for="acme_contactlistbundle_contacttype_email" class=" required">Email</label><input id="acme_contactlistbundle_contacttype_email" name="acme_contactlistbundle_contacttype[email]" required="required" type="text">

当表单构建时将小部件电子邮件添加为add->('email','email')

它呈现了这个:

<label for="acme_contactlistbundle_contacttype_email" class=" required">Email</label><input id="acme_contactlistbundle_contacttype_email" name="acme_contactlistbundle_contacttype[email]" required="required" type="email">

但是,我不希望标签呈现出来(它弄乱了我精心布置的页面!)。

最后,我厌倦了并使用了这个丑陋的hackery ...(fobj是从控制器动作传入的表单对象):

1 个答案:

答案 0 :(得分:1)

如果您对表单呈现的要求与Symfony2提供的要求不同,那么您可以定义自己的小部件。只需扩展表单主题并重新定义所需的块:

{% form_theme form _self %}
{% block field_widget %}
    {% set type = type|default('text') %}
    <input type="{{ type }}" {{ block('widget_attributes') }} value="{{ value }}" />
{% endblock field_widget %}

当然,请检查documentation on form theming


<强>更新

如果您只想在不<input>的情况下呈现<label>代码,那么您应该以下一种方式重新定义字段小部件:

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

_contact适用于您的Type名称 _email用于字段名称。