Коллекция Symfony2 Форма уникальности

1

У меня есть основная форма symfony2, с полем, которым является тип коллекции другого поля, например объект Product с несколькими тегами, но этот тег имеет уникальный хеш. К основной форме прикреплен eventListener. Если я отправлю данные в форму и отправлю тег вместе с этим уникальным, уникальное ограничение на класс скажет, что это поле должно быть уникальным. Эта работа хорошая, но в этом EventListener я ищу в БД для этого уникального поля, и если он правильный, я выполняю назначение, я заменяю пост-содержимое сущностью из БД.

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('eventDate', 'datetime',array(
            'widget' => 'single_text',
            'format' => 'yyyy-MM-dd HH:mm',
            'invalid_message' => 'Wrong datetime format. Please use like this: 2015-09-20 14:45:12',
        ))
        ->add('eventEnds', 'datetime', array(
            'widget' => 'single_text',
            'format' => 'yyyy-MM-dd HH:mm',
            'invalid_message' => 'Wrong datetime format. Please use like this: 2015-09-20 14:45:12',
        ))
        ->add('tag','collection', array(
            'type' => new TagType(),
            'allow_add' => true,
            'allow_delete' => true,
            'by_reference' => false,
            'prototype' => true,
            'property_path' => 'professional',
            'label' => false,
            'options' => array(
                'professional' => true,
            ),
        ))
        ->addEventListener(FormEvents::SUBMIT, [$this, 'submit'])
    ;
}
public function preSubmit(FormEvent $event)
{
    /** @var MainForm $data */
    $data = $event->getData();

    foreach ($data->getTags() as $tag) {
        if ($tag->getId() == null && $tag->getHash()){
            $tagDB = $this->entityManager
                ->getRepository('ApplicationBundle:Tag')
                ->findOneBy([
                    'hash' => $professional->getHash(),
                ]);

            if ($tagDB) {
                $data->removeTag($tag);
                $data->addTag($tagDB);
            }
        }
    }
    $event->setData($data);
}

Если я сброшу значение $ data после setData, я вижу там сущности из БД, но у меня все еще есть уникальная ошибка проверки, и я проверяю валидатор, symfony pass в исходном содержании POST.

Почему так и как я могу решить эту проблему?

Теги:
forms

1 ответ

0

Должно быть

->addEventListener(FormEvents::PRE_SUBMIT, [$this, 'submit'])

(PRE_SUBMIT вместо SUBMIT)

Ваш код должен выглядеть примерно так:

public function preSubmit(FormEvent $event)
{
    /** @var MainForm $data */
    $data = $event->getData();

    $num = count($data['tag']);
    for ($i=0;$i<$num;$i++) {
        $tag = $data['tag'][$i];
        if (!isset($tag['id']) && isset($tag['hash'])){
            $tagDB = $this->entityManager
                ->getRepository('ApplicationBundle:Tag')
                ->findOneBy([
                    'hash' => $tag['hash'],
                ]);

            if ($tagDB) {
                unset($data['tag'][$i]);
                $data['tag'][$i] = array (
                    'id' => $tagDB->getId();
                    'hash' => $tagDB->getHash();
                );
            }
        }
    }
    $event->setData($data);
}

Не уверен, что код на 100% правильный, поскольку я не смог его протестировать, но вы поняли эту идею.

  • 0
    Во время предварительной отправки у меня есть только массив данных, например: ['eventDate' => '2015-01-01 10:10:10', 'tag' => [0 => ['hash' => '1235 ']]], Я не могу заменить там объекты из БД.
  • 0
    Конечно, вы можете увидеть мой обновленный ответ

Ещё вопросы

Сообщество Overcoder
Наверх
Меню