Для конкретного проекта мы используем 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
}
]
}
Если вам нужна дополнительная информация, пожалуйста, дайте мне знать.Заранее спасибо.С наилучшими пожеланиями.