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

У меня есть виджет формы типа «выбор», который отображается в виде списка многих флажков. Все отлично работает. Итак, чтобы подчеркнуть это: есть ОДИН виджет с МНОЖЕСТВОМ флажков (а НЕ несколько виджетов флажков).

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

Вот функция buildForm() моего 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')))
  ;
}
...

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

{% for foo in fooForm %}

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

{% endfor %}

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

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


person Chris    schedule 18.08.2013    source источник
comment
Symfony EventSubscriber может помочь вам stackoverflow .com/questions/12642473/   -  person Miloš    schedule 18.08.2013
comment
@Milos: Спасибо за полезный комментарий! Использование EventSubscriber кажется решением, но... это очень сложно реализовать. Поскольку я новичок в Symfony2, я был бы очень признателен за помощь. Заранее спасибо за любые дополнительные подсказки и фрагменты! Динамические формы Symfony2   -  person Chris    schedule 18.08.2013
comment
EventSubscriber имеет значение только в том случае, если вы хотите определить, какие параметры отключить на основе текущих значений в вашем объекте. Это не поможет вам установить атрибуты для отдельных элементов опций. Это распространенный запрос без простого решения. Вам нужно либо сделать свой объект выбора формы, либо предоставить свой собственный шаблон ветки. Ни одно из решений не является простым, и я не знаю хороших примеров. JavaScript может быть вашим лучшим выбором здесь.   -  person Cerad    schedule 18.08.2013
comment
@Cerad: Спасибо! И: да, я пошел по пути JavaScript... и подробно опубликовал свое решение.   -  person Chris    schedule 18.08.2013
comment
Этот связанный поток на самом деле показывает именно мою проблему и решает ее... НО: это больше не работает в Symfony 2.3!   -  person Chris    schedule 19.08.2013


Ответы (1)


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

  • в моем FooType.php я упорядочиваю массив полей, которые должны быть отключены.
  • Я передаю эту строку в функцию 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):

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 мне пришлось добавить свойство «foo_disabled» строки типа с методами установки и получения.

person Chris    schedule 18.08.2013