ChoiceFormType один из наиболее продвинутых элементов форм, существующих в Symfony. А также он один из самых важных, потому что много других элементов наследуют от него, например EntityType, CountryType и LocaleType.
В Symfony 2.7 этот элемент был полностью переработан, чтобы поддержать динамическую генерацию меток, значений, индексов и атрибутов. Теперь это возможно благодаря новым опциям choice_label
, choice_name
, choice_value
, choice_attr
, group_by
и choices_as_values
.
Динамическая генерация меток
По умолчанию, ключи массива choices
используются в качестве меток, но вы можете воспользоваться параметром choice_label
для их динамической генерации:
$builder->add('attending', 'choice', array(
'choices' => array(
'yes' => true,
'no' => false,
'maybe' => null,
),
'choices_as_values' => true,
'choice_label' => function ($allChoices, $currentChoiceKey) {
return 'form.choice.'.$currentChoiceKey;
},
));
Вы также можете передать имя свойства для использования в качестве метки:
$builder->add('attending', 'choice', array(
'choices' => array(
Status::getInstance(Status::YES),
Status::getInstance(Status::NO),
Status::getInstance(Status::MAYBE),
),
'choices_as_values' => true,
'choice_label' => 'displayName',
));
Динамическая генерация имен и значений
Используйте опцию choice_name чтобы задать имя элемента и опцию choice_value
для указания его строкового значение:
$builder->add('attending', 'choice', array(
'choices' => array(
'Yes' => true,
'No' => false,
'Maybe' => null,
),
'choices_as_values' => true,
'choice_name' => function ($allChoices, $currentChoiceKey) {
// use the labels as names
return strtolower($currentChoiceKey);
},
'choice_value' => function ($allChoices, $currentChoiceKey) {
if (null === $currentChoiceKey) {
return 'null';
}
if (true === $currentChoiceKey) {
return 'true';
}
return 'false';
},
));
Примерно также вы можете работать и с именем свойства.
Динамическая генерация атрибутов
Параметр сhoice_attr определяет все дополнительные атрибуты HTML, применяемые к каждому элементу. Эта опция позволяет задать его значения с помощью обычного массива, который идеально подходит для простых случаев:
$builder->add('attending', 'choice', array(
'choices' => array(
'Yes' => true,
'No' => false,
'Maybe' => null,
),
'choices_as_values' => true,
'choice_attr' => array(
'Maybe' => array('class' => 'text-muted'),
),
));
В более сложных случаях, можно поступить по другому:
$builder->add('attending', 'choice', array(
'choices' => array(
'Yes' => true,
'No' => false,
'Maybe' => null,
),
'choices_as_values' => true,
'choice_attr' => function ($allChoices, $currentChoiceKey) {
if (null === $currentChoiceKey) {
return array('class' => 'text-muted');
}
},
));
///Опять же, вы можете передать этой опции свойства вместо массива или вызова.
Динамическая группировка
По умолчанию, элементы сгруппированы так, как указано в структуре, переданной в параметр choices
:
$builder->add('attending', 'choice', array(
'choices' => array(
'Decided' => array(
'Yes' => true,
'No' => false,
),
'Undecided' => array(
'Maybe' => null,
),
),
'choices_as_values' => true,
));
Группировка элементов может быть также сгенерирована динамически с помощью обратного вызова или значения в параметре group_by
:
$builder->add('attending', 'choice', array(
'choices' => array(
'Yes' => true,
'No' => false,
'Maybe' => null,
),
'choices_as_values' => true,
// grouping defined using a callback
'group_by' => function ($allChoices, $currentChoiceKey) {
if (null === $currentChoiceKey) {
return 'Undecided';
}
return 'Decided';
},
));
Динамическая генерация предпочтительных вариантов
И, наконец, генерация предпочтительных вариантов может быть определена в новом параметре preferred_choices с использованием массива, обратного вызова или значения свойства-пути:
$builder->add('attending', 'choice', array(
'choices' => array(
'Yes' => true,
'No' => false,
'Maybe' => null,
),
'choices_as_values' => true,
// using an array to show the 'true' choice as preferred
'preferred_choices' => array(true),
// using a callable to show the 'true' choice as preferred
'preferred_choices' => function ($choice, $key) {
return true === $choice;
},
));