Когда поля коллекции symfony динамически добавляются / удаляются в DOM с помощью javascript, при сохранении этой коллекции происходит сбой либо валидации, либо постоянных идентификаторов элементов коллекции. Например, если у меня есть выпуск Entity \ User.php, например:
/**
* @var \TestBundle\Entity\UserFollowers
*
* @ORM\OneToMany(targetEntity = "TestBundle\Entity\UserFollowers", mappedBy = "user", cascade = {"persist"}, orphanRemoval=true)
* @Assert\Valid()
*/
protected $user_followers;
и обратное отношение Entity \ UserFollower.php, например:
/**
* @ORM\ManyToOne(targetEntity = "TestBundle\Entity\User", inversedBy = "user_followers")
* @ORM\JoinColumn(name = "user_id", referencedColumnName = "id")
*/
protected $user;
/**
* @var string
* @ORM\Column(name = "name", type = "string")
* @Assert\NotBlank()
*/
private $name;
И UserFormType вроде:
$builder->add('user_followers', CollectionType::class, array(
'entry_type' => UserFollowersType::class,
'allow_add' => true,
'allow_delete' => true,
'prototype' => true,
'prototype_name' => '__name__',
'by_reference' => false,
'label' => 'User followers'
))
и UserFollowersFormType, например:
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder
->add('name', TextType::class, array(
'attr'=> [
'class' =>'input input-group-field'
],
'label' => false
));
}
когда форма обрабатывается и пользователь сохраняется в базе данных, либо проверка формы прикрепляется к неправильному элементу коллекции, либо постоянный идентификатор в базе данных ошибается, различные манипуляции с DOM получают другую ошибку, контроллер похож:
$form->handleRequest($request);
if ($form->isValid()) {
$em->persist($user);
$em->flush();
}
Почему так происходит? его как индексы коллекции форм перепутались ....
Javascript и манипуляции с DOM - это хорошо, например, при отправке: <div id = "user_form_user_followers_1"> <div id = "user_form_user_followers_3"> <div id = "user_form_user_followers_7"> <div id = "user_form_user_followers_10">, но элементы backend viewData-> collection-> не индексируются как (1,3,7,10)






Когда вы динамически добавляете новую форму подписчиков пользователей, вам также необходимо заменить prototype_name__name__ на длину коллекции.
При инициализации коллекции:
var $collection = $(your collection container of forms );
$collection.data('index', $collection.children().length);
var index = $collection.data('index');
//-------on add new form
// Replace '__name__' in the prototype's HTML to
// instead be a number based on how many items we have
var newForm = prototype.replace(prototypeName, index);
// increase the index with one for the next item
$collection.data('index', index + 1);
Я уже делаю это, форма DOM построена правильно, но индексы элементов коллекции DOM и бэкэнд-форма viewData перепутались
Скорее всего, что-то не так: «Когда поля коллекции symfony динамически добавляются / удаляются в DOM с помощью javascript». Вам необходимо проверить, что отправляется в HTTP-запросе.