В типе для формы используется настраиваемый тип «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';
}
}




Вам необходимо создать собственный шаблон веточки:
{% 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 %}
Какая у вас версия Symfony? Тип формы как строка (не FQCN) некоторое время назад устарел.