Symfony 4 формы CollectionType: сделать элемент FileType обязательным только для новых строк - PullRequest
0 голосов
/ 24 сентября 2018

У меня есть массив изображений, которые я хочу добавить / обновить / удалить в форме Symfony 4.

Чтобы создать форму для этих изображений, я использую пользовательскую формус FileType в нем:

public function buildForm(FormBuilderInterface $builder, array $options) {

    $builder
        ->add('image', FileType::class, array(
            'data_class' => null
        ))
    ;

}

Затем я использую CollectionType, заполненный экземплярами формы, описанной выше, для визуализации формы для каждого из изображений в массиве с помощью allow_add и allow_delete.поэтому я могу добавлять / удалять строки с помощью JavaScript.

public function buildForm(FormBuilderInterface $builder, array $options) {

    $builder->add('imagesets', CollectionType::class, array(
        'entry_type' => ImageType::class,
        'entry_options' => array('label' => false),
        'allow_add' => true,
        'allow_delete' => true
    ));
}

Это прекрасно работает для добавления новых изображений, но при обновлении существующих изображений элемент FileType не требуется, он должен быть необходим только для новогостроки.

Вопрос: Как я могу сделать FileType НЕ обязательным для существующих изображений, но обязательным для всех новых строк?

(Обратите внимание, я буду передавать обычныемассивы для этих объектов формы, а не сущностей Doctrine.)

1 Ответ

0 голосов
/ 28 сентября 2018

Вы должны добавить EventListener в форму ImageType и изменить атрибут required , если объект не новый (или не нулевой).Имейте в виду, что добавление второго элемента с тем же именем, что и предыдущее к форме, заменяет его.

$builder
    ->add('image', FileType::class, array(
        'data_class' => null,
        'required' => true,
    ))
    ;

$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
    // get the form object
    $form = $event->getForm();
    // get the entity/object data
    $image = $event->getData();
    // if it is new, it will be null
    if(null !== $image) {
        // modify the input
        $form->add('image', FileType::class, array(
            'data_class' => null,
            'required' => false,
        ))
         ;
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...