在buildForm()中禁用选择小部件的一些复选框

时间:2013-08-18 13:33:09

标签: symfony symfony-forms symfony-2.3

我有一个“选择”类型的表单窗口小部件,它显示为许多复选框的列表。一切都很好。所以要强调它:有一个小部件,有多个复选框(而不是几个复选框小部件)。

现在,我想禁用其中一些复选框。这些数据可以在$ options-Array中找到。

这是我的FooType.php

的buildForm()函数
...
public function buildForm(FormBuilderInterface $builder, array $options)
{
  $builder
    ->add('foo', 'choice', array('choices'  => $options['choiceArray']['id'],
      'multiple' => true,
      'expanded' => true,
      'disabled' => $options['choiceArray']['disabled'] // does not work (needs a boolean)
      'data'     => $options['choiceArray']['checked'], // works
      'attr'     => array('class' => 'checkbox')))
  ;
}
...

My Twig-template看起来像这样:

{% for foo in fooForm %}

    <dd>{{ form_widget(foo) }}</dd>

{% endfor %}

我只能禁用所有复选框(通过在buildForm中设置'disabled'=&gt; true)。并且传递数组不起作用(在代码片段中注释)。

如何禁用我选择的小部件中的某些选中的复选框(存储在$ options ['choiceArray'] ['disabled']中)?

1 个答案:

答案 0 :(得分:1)

我已经使用JQuery解决了这个问题。

  • 在我的FooType.php中,我将字符串化应该禁用的字段数组。
  • 我在buildForm()中传递该字符串 - 通过隐藏字段将函数传递给模板
  • 我使用JQuery将字符串再次拆分为ID并处理禁用复选框并使标签变灰

这是PHP代码(FooType.php):

...
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $disabledCount  = sizeof($options['choiceArray']['disabled']);
    $disabledString = '';

    for ($i = 0; $i < $disabledCount; $i++)
    {
        $disabledString .= $options['choiceArray']['disabled'][$i];

        if ($i < $disabledCount-1)
        {
            $disabledString .= '|';
        }
    }



    $builder
        ->add('foo', 'choice', array('choices'  => $options['choiceArray']['id'],
                                               'multiple' => true,
                                               'expanded' => true,
                                               'data'     => $options['choiceArray']['checked'],
                                               'attr'     => array('class' => 'checkbox')))
        ->add('foo_disabled', 'hidden', array('data' => $disabledString))
    ;
}
...

这是JavaScript部分(Twig-template):

function disableModule()
{
    var disabledString = $('#foo_disabled').val();

    var disabledArray = disabledString.split('|');

    $.each( disabledArray, function( disKey, disVal )
    {
        // deactivate checkboxes
        $('input[id="'+idCurrent+'"]').attr("disabled", true);

        // grey out label for checkboxes
        $('label[for="'+idCurrent+'"]').attr("style", "color: gray;");
    });
}

在我的Entity / Foo.php中,我不得不使用setter和getter方法添加string类型的属性“foo_disabled”。