Настраиваемый тип Enum расширен от ChoiceType. Symfony

В типе для формы используется настраиваемый тип «enum». Когда я выбираю значение в выделении формы и сохраняю его, когда я повторно открываю форму в выделении, это значение НЕ появляется первым. Например, если я выбрал «вторичный» сохраненный и снова открыл форму, то при выборе в первую очередь он все равно будет «первичным». Как поставить значение экземпляра на первое место в select?

 /**
 * Class SomethingType
 *
 * @method static SomethingType PRIMARY()
 * @method static SomethingType SECONDARY()
 */
final class SomethingType extends AbstractEnum
{
    const PRIMARY = 'primary';
    const SECONDARY = 'secondary';
}

В нестандартном типе:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('type', 'enum', [
            'class' => 'SomethingType',
        ]);
}

перечисление:

class EnumType extends AbstractType
{

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->resetViewTransformers()
            ->addModelTransformer(new EnumTransformer($options['class']));
    }

    /**
     * @param OptionsResolver $resolver Validates options and merges them with
     *                                  default values.
     * @return void
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver
            ->setDefined('class')
            ->setDefault('choices', function (Options $options) {
                $data = [];
                if (isset($options['class'])) {
                    $enum = call_user_func($options['class'] . '::values');
                    /** @var AbstractEnum $item */
                    foreach ($enum as $item) {
                        $value = $item->getValue();
                        $data[$value] = $value;
                    }
                }
                return $data;
            });
    }

    public function getParent()
    {
        return 'choice';
    }

    public function getName()
    {
        return $this->getBlockPrefix();
    }

    public function getBlockPrefix()
    {
        return 'enum';
    }
}

Какая у вас версия Symfony? Тип формы как строка (не FQCN) некоторое время назад устарел.

Stephan Vierkant 11.07.2018 23:45
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
0
1
624
1

Ответы 1

Вам необходимо создать собственный шаблон веточки:

{% block enum_widget %}
    {% if form is defined %}
        {% if instanceof(form.vars.value, 'AbstractEnum')  %}
            {% spaceless %}
                {%- set currentValue = form.vars.value.getValue -%}
                <select {{ block('widget_attributes') }}{% if multiple %} multiple = "multiple"{% endif %}>
                    {%- set options = choices -%}
                    {% for group_label, choice in options %}
                        <option value = "{{ choice.value }}"
                                {% if choice.attr %}{% with { attr: choice.attr } %}{{ block('attributes') }}{% endwith %}{% endif %}
                                {% if choice.value == currentValue %} selected = "selected"{% endif %}>
                            {{ choice_translation_domain is same as(false) ? choice.label : choice.label|trans({}, choice_translation_domain) }}
                        </option>
                    {% endfor %}
                </select>
            {% endspaceless %}
        {% else %}
            {{ block('choice_widget') }}
        {% endif %}
    {% endif %}
{% endblock %}

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