Тип выбора 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'] : [];
},
...
Согласно макету формы:
и 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, если вы используете опцию заполнителя.