2015-11-02 93 views
1

我有一個Symfony2的主要形式,與現場什麼是其他領域的集合類,像多標籤一個產品實體,但這些標籤具有唯一的哈希值。 有一個eventListener附加到主窗體。如果我向表單發送一個數據,並且發送一個標籤以及這個唯一的標籤,那麼這個類的唯一限制就是說該字段必須是唯一的。這個工作很好,但在這個EventListener中,我在數據庫中搜索這個獨特的字段,如果它是正確的,我做一個分配,我用數據庫中的一個實體替換髮布的內容。Symfony2的收集表格唯一性

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); 
} 

如果我傾倒使用setData後的$數據值,我看到有從數據庫中的實體,但我仍然有一個獨特的驗證錯誤,我在驗證檢查,symfony中通在原崗位的內容。

爲什麼這樣,我該如何解決這個問題?

回答

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']]],我不能用DB中的對象替換那裏。 – ghostika

+0

當然你可以看到我更新的答案 –