Сохранение db для динамической коллекции в Symfony

Когда поля коллекции 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();
}

Почему так происходит? его как индексы коллекции форм перепутались ....

Скорее всего, что-то не так: «Когда поля коллекции symfony динамически добавляются / удаляются в DOM с помощью javascript». Вам необходимо проверить, что отправляется в HTTP-запросе.

marekful 10.05.2018 16:30

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)

ermacmkx 10.05.2018 17:09
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
2
47
1

Ответы 1

Когда вы динамически добавляете новую форму подписчиков пользователей, вам также необходимо заменить 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 перепутались

ermacmkx 10.05.2018 17:14

Другие вопросы по теме