Symfony 2,单个输入的自定义窗体小部件?

时间:2016-03-06 20:03:53

标签: forms symfony

UPDATE / EDIT

这就是我所做的,但由于某种原因,它不起作用。所以服务如下,

clearfix.extended_type:
    class: Bundle\Form\ClearfixExtension
    tags:
        - { name: form.type_extension, extended_type: Symfony\Component\Form\Extension\Core\Type\FormType }

现在我确信这是错的,我没有多少使用过服务,仍然试图绕过它们。

我还建立了这个类,请看下面的答案给其他读这个的人,使用正确的命名空间。

我还对块进行了以下操作,

{%- block form_row -%}
  <div class="other classes here {% if clearfix %}clearfix"{% else %}"{% endif %}>
    {{- form_widget(form) -}}
    {{- form_label(form) -}}
    {{- form_errors(form) -}}
  </div>
{%- endblock form_row -%}

但是当我尝试渲染它时,我从表单中获得的是“变量”clearfix“在......中不存在”

那我做错了什么?我猜这与服务设置有关?

由于

好吧,这是我的一点点,我已经遍历了文档,但我要么完全错了,要么我想做的就是不能做到?

所以我使用Symfony 2.7,并将其设置为指向表单twig文件,以便我可以覆盖一些默认值。这没有任何问题,工作正常。但是我现在希望能够使用添加的clearfix类渲染一些行。这就是我现在要解决的问题,

{%- block form_row -%}
  <div>
    {{- form_widget(form) -}}
    {{- form_label(form) -}}
    {{- form_errors(form) -}}
  </div>
{%- endblock form_row -%}

使用正确的类呈现我的所有行,但我希望能够在某些选定的行上使用以下内容

{%- block _clerfix -%}
  <div class="clearfix">
    {{- form_widget(form) -}}
    {{- form_label(form) -}}
    {{- form_errors(form) -}}
  </div>
{%- endblock _clerfix -%}

然后我用我想要使用添加的clearfix类构建的表单的抽象类型中的block_name来调用它,就像这样,

    ->add('password',   'password', ['label' => 'Password',
                                     'required' => false,
                                     'block_name' => 'clearfix',
                                     'attr' => ['autocomplete' => 'off','class' => 'Passwordd', 'aria-required' => 'true' ]
                                    ])

我想要的是什么?我真的不想将clearfix添加到我正在构建的用户表单中,因为这不会使我的代码非常干,因为会有(人们会这么认为)我需要重新使用该块的地方渲染其他字段?

欢迎大家帮助。

感谢。

1 个答案:

答案 0 :(得分:2)

您可以创建表单扩展名来定义应用clearfix

的选项

Symfony 2.8

class ClearfixExtension extends AbstractTypeExtension
{

    public function buildView(FormView $view, FormInterface $form, array $options)
    {
        $view->vars['clearfix'] = $options['clearfix'];
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefault('clearfix', false);
    }

    public function getExtendedType()
    {
        return FormType::class;
    }

}

services.yml

clearfix_extension:
    class: Bundle\Form\ClearfixExtension
    tags:
        - { name: form.type_extension, extended_type: Symfony\Component\Form\Extension\Core\Type\FormType }

Symfony 2.7

class ClearfixExtension extends AbstractTypeExtension
{

    public function buildView(FormView $view, FormInterface $form, array $options)
    {
        $view->vars['clearfix'] = $options['clearfix'];
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefault('clearfix', false);
    }

    public function getExtendedType()
    {
        return 'form';
    }

}

services.yml

clearfix_extension:
    class: Bundle\Form\ClearfixExtension
    tags:
        - { name: form.type_extension, alias: form }

并在树枝中检查此选项

{%- block form_row -%}
  <div {% if clearfix %}class="clearfix"{% endif %}>
    {{- form_widget(form) -}}
    {{- form_label(form) -}}
    {{- form_errors(form) -}}
  </div>
{%- endblock form_row -%}