Отключение некоторых флажков выбора виджета в buildForm()


У меня есть виджет формы типа "выбор", который отображается в виде списка из множества флажков. Все работает отлично. Итак, чтобы подчеркнуть это: есть один виджет, с множеством флажков (а не несколько флажков виджетов).

Теперь я хочу отключить некоторые из этих флажков. Данные для этого доступны в массиве $options-Array.

Здесь находится buildForm () - функция my FooType.php

...
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')))
  ;
}
...

Мой шаблон веточки выглядит так:

{% for foo in fooForm %}

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

{% endfor %}

Я могу только отключить все установите флажки (установив 'disabled' = > true в buildForm). И передача массива там не работает (как прокомментировано в сниппете).

Как я могу отключить некоторые выбранные флажки (хранящиеся в $options['choiceArray']['disabled']) моего виджета выбора?

1 2

1 ответ:

Я решил эту проблему с помощью JQuery.

  • в моем Футтипе.php I stringify массив полей, которые должны быть отключены.
  • я передаю эту строку в функции buildForm () через скрытое поле в шаблон
  • там я использую JQuery, чтобы снова разделить строку на идентификаторы и обработать отключить флажки и серую метку

Вот 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;");
    });
}

В моем Сущность/Фу.php мне пришлось добавить свойство "foo_disabled" типа string с методами setter и getter.