Отключение некоторых флажков выбора виджета в 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 ответ:
Я решил эту проблему с помощью 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.