Новое в Symfony 2.7: Рефакторинг ChoiceFormType

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;
    },
));

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

3 × три =