Symfony Forms CollectionType, индекс по идентификатору - PullRequest
0 голосов
/ 21 января 2019

Я работаю над формой Symfony 4 со встроенными типами для REST API. Форма:

class OffertaType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('pulsanti_social_attivi', CheckboxType::class, [ ])
            ->add('immagini', CollectionType::class, [
                'entry_type' => OffertaImmagineType::class,
                'allow_add' => true,
                'allow_delete' => true,
                'by_reference' => false,
                'prototype' => 'immagini'
            ]);
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(
            [
                'data_class'         => Offerta::class,
                'allow_extra_fields' => true,
                'csrf_protection'    => false,
            ]
        );
    }
}

Коллекция содержит 2 предмета

[
    {
        "id": 1,
        "url": "https://via.placeholder.com/150?text=1"
    },
    {
        "id": 2,
        "url": "https://via.placeholder.com/150?text=2"
    }
]

Все "работает", если я публикую некоторые данные, создается новый объект, и если я обновляю объект, БД обновляется. Странная вещь заключается в том, что обновление / удаление строки кажется основанным на положении объекта в коллекции, а не на его идентификаторе. Если я удаляю первый объект, результат должен быть

[
    {
        "id": 2,
        "url": "https://via.placeholder.com/150?text=2"
    }
]

но его

[
    {
        "id": 1,
        "url": "https://via.placeholder.com/150?text=2"
    }
]

Symfony видит только 1 объект, поэтому удалите второй и обновите первое поле "url".

Как я могу "проиндексировать" коллекцию по ID объектов, а не по их положению?

1 Ответ

0 голосов
/ 21 января 2019

К сожалению, это на самом деле невозможно.Просто примите, что коллекции Symfony основаны на индексах, и разберитесь с ними.Вы можете перейти к одному из возможных решений.

Например, вы можете создать отдельную кнопку удаления для элементов коллекции, а затем установить

'delete_empty' => false,
'allow_delete' => false,

на использование вашей формы только для добавления новых записей..

Или вы можете установить для delete_empty и allow_delete значение true, но в этом случае вы должны установить пустые элементы для позиции сбора, которую вы действительно хотите удалить.

Другой вариант - создатьуникальный обработчик для вашей формы в соответствии с вашими конкретными требованиями, но я не могу привести вам конкретный пример, потому что я не знаю, что вам нужно в данный момент.

...