簡體   English   中英

Symfony2收集表單唯一性

[英]Symfony2 collection Form uniquenes

我有一個symfony2主窗體,其中的字段是其他字段的集合類型,例如具有多個TagProduct實體,但是這些標簽具有唯一的哈希。 在主窗體上附加了一個eventListener。 如果我將數據發送到表單,並且將Tag和這個唯一的has一起發送,則該類的唯一約束將說該字段必須是唯一的。 這項工作很好,但是在此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傳遞了原始POST內容。

為什么會這樣,我該如何解決呢?

應該

->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%正確,因為我無法對其進行測試,但是您明白了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM