Тип выбора Symfony с отключенными параметрами

Есть ли способ с Symfony, чтобы сделать <select> тип формы с отключенными опциями, основанный на достоверности данных choices опции?

Я видел эту ветку (спасибо DonCallisto) об отключении расширенных опций выбора; Однако я не хочу иметь расширенный выбор. Я хотел бы сохранить select элемент, с отключенным options,

$builder->add('list', 'choice', array(
    'choices' => array(
        array(
            'value' => 1,
            'label' => '1',
            'disabled' => false
        ),
        array(
            'value' => 2,
            'label' => '2',
            'disabled' => false
        ),
        array(
            'value' => 3,
            'label' => '3',
            'disabled' => true
        )
    ),
    // Instead of
    // 'choices' => array(
    //     1 => 'Option 1',
    //     2 => 'Option 2',
    //     3 => 'Option 3'
    // )
);

# Which would render to the following element
<select [...]>
    <option value='1'>1</value>
    <option value='2'>2</value>
    <option value='3' disabled='disabled'>3</value>
</select>

Я просто не могу найти способ... Нужно ли создавать собственный тип поля?

3 ответа

Решение

Начиная с версии 2.7, Symfony представила способ устанавливать атрибуты выбора с помощью вызываемой функции, это как раз то, что вам нужно.

этот код взят из официальной документации Symfony

$builder->add('attending', ChoiceType::class, array(
    'choices' => array(
        'Yes' => true,
        'No' => false,
        'Maybe' => null,
    ),
    'choices_as_values' => true,
    'choice_attr' => function($val, $key, $index) {
        // adds a class like attending_yes, attending_no, etc
        return ['class' => 'attending_'.strtolower($key)];
    },
));

Вы можете использовать 'choice_attr' и передать функцию, которая решит, добавить ли disabled атрибут или нет в зависимости от значения, ключа или индекса по выбору.

...
    'choice_attr' => function($key, $val, $index) {
        $disabled = false;

        // set disabled to true based on the value, key or index of the choice...

        return $disabled ? ['disabled' => 'disabled'] : [];
    },
...

Согласно макету формы:

https://github.com/symfony/symfony/blob/2.7/src/Symfony/Bridge/Twig/Resources/views/Form/form_div_layout.html.twig

и choice_widget_collapsed и choice_widget_options, я не думаю, что это возможно напрямую с формой выбора по умолчанию Symfony.

Ты можешь попробовать:

  • создать свою собственную форму выбора (расширяя существующую и добавляя параметры в список опций, я думаю, что это лучший способ)
  • использовать javascript/jquery для изменения параметров параметров во время загрузки с помощью существующего выбора Symfony от

Это еще один способ загрузить параметры из Entity. Вы можете создать новую сущностьAttendingи используйте его с EntityType.

      ->add('attending', EntityType::class, [
'class' => Attending::class,
'choice_attr' => function($key, $val, $index) {
    if ($key->getId() == StaticVal) {
      return ['disabled' => 'disabled'];
    }
    return [];
}]

ЗдесьStaticValможет быть любым значением, которое вы хотите отключить.$keyдаст вам значение объекта$valдаст вам значение, начинающееся с 0, если вы используете опцию заполнителя.

Другие вопросы по тегам