Встраиваемая форма Symfony 4 с collectionType без доктрины allow_delete, кажется, работает неправильно - PullRequest
0 голосов
/ 22 ноября 2018

Для конкретного проекта мы используем symfony без ORM.Мы используем REST API для получения и хранения данных.У нас есть классы, очень похожие на сущности доктрины, но это специальный сервис, который получает и хранит данные с помощью API.

Для действительно сложной страницы у нас есть несколько повторяющихся форм встраивания.Все работает нормально, кроме процесса удаления.

Когда мы удаляем элемент (удаляя поля в DOM с помощью JavaScript) из коллекции embed и отправляем, данные формы по-прежнему содержат строку удаленного элемента, но всесвойства нулевые.Точно так же, как если бы мы забыли использовать свойство allow_delete в поле CollectionType.

Не могли бы вы нам помочь?

Основной класс объекта:

class Survey extends WSObject
{
    protected $id;
    protected $title;
    protected $surveyQuestions;

    //Getter and setters are ok
}

Класс дочернего объекта:

class SurveyQuestion extends WSObject
{
    protected $id;
    protected $title;
    protected $surveyId;

    //Getter and setters are ok
}

Формаконструкция:

// $survey is a well constructed survey with data
$form = $this->createFormBuilder($survey)
        ->add('title', TextType::class,array(
            'label'         => 'Title FR *',
            'required'      => true
        ))
        ->add('surveyQuestions', CollectionType::class, array(
            'entry_type' => SurveyQuestionType::class,
            'allow_add' => true,
            'allow_delete' => true,
            'delete_empty'=>true,
            'label' => false,
            'entry_options' => array(
                'surveyId'=>$survey->getId(),
                'empty_data' => null
            )
        ))
        ->getForm();

Тип SurveyQuestion:

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;

class SurveyQuestionType extends AbstractType
{

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('id', HiddenType::class,array(
        'required'          => false
    ));
    $builder->add('title', TextType::class,array(
        'required'          => true
    ));
    $builder->add('surveyId', HiddenType::class,array(
        'data' => $options['surveyId'],
        'required'          => false
    ));
}

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => SurveyQuestion::class,
        'surveyId' => null
    ));
}
}

Представьте себе существующий опрос, в котором уже есть два вопроса.Если мы удалим один вопрос в форме (удалив поля из DOM в JavaScript) и отправим.$ Form-> getData ();возвращает:

Survey {
    id : 42,
    title : 'the meaning of life',
    surveyQuestions : array(2) [
        0 : surveyQuestion {
            id : 1,
            title : 'My first question',
            surveyId : 42
        },
        // This is the corresponding deleted row
        1 : surveyQuestion {
            id : null,
            title : null,
            surveyId : null
        },
    ]
}

То, что мы ожидаем, это:

Survey {
    id : 42,
    title : 'the meaning of life',
    surveyQuestions : array(1) [
        0 : surveyQuestion {
            id : 1,
            title : 'My first question',
            surveyId : 42
        }
    ]
}

Если вам нужна дополнительная информация, пожалуйста, дайте мне знать.Заранее спасибо.С наилучшими пожеланиями.

...