2014-02-10 36 views
1

我試圖讓嵌入式窗體的錯誤消息顯示在有錯誤的表單字段旁邊。Symfony Doctrine OneToOne嵌入式表單error_bubbling

我有2個與OneToOne關係連接主義實體如下:

class Contact 
{ 
    /** 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id 

    /** 
    * @ORM\OneToOne(targetEntity="Name", mappedBy="contact", cascade={"persist"}) 
    */ 
    protected $name; 

} 

class Name 
{ 
    /** 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id 

    /** 
    * @var string $givenName 
    * 
    * @ORM\Column(type="string", name="given_name", length=255) 
    * @Assert\NotBlank(
    *  message="Given name must not be blank." 
    *) 
    * @Assert\Length(
    *  min="2", 
    *  max="255", 
    *  minMessage="Given name is too short.", 
    *  maxMessage="Given name is too long." 
    *) 
    */ 
    protected $givenName; 

} 

我創建了2種形式,一種爲聯繫人實體,一個是名稱的實體。然後我將姓名錶格嵌入到聯繫人表單中。

class ContactType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('name', new NameType()); 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class'   => AcmeCoreBundle\Entity\Contact, 
      'cascade_validation' => true, 
      'error_bubbling'  => false, 
     )); 
    } 

    public function getName() 
    { 
     return 'acme_contact'; 
    } 
} 

class NameType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('given_name', 'text', array(
       'required'  => true, 
       'error_bubbling' => false, 
      )); 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class'  => AcmeCoreBundle\Entity\Name, 
      'error_bubbling' => false, 
     )); 
    } 

    public function getName() 
    { 
     return 'acme_name'; 
    } 
} 

我已經設置cascade_validationtrue的聯繫形式,這是根本形式,並error_bubblingfalse各級。我測試了這些配置選項,並且正在設置。

但是,錯誤消息正在附加到form.name而不是form.name.given_name,這正是我想要的。

我哪裏錯了?

Matthew

回答

1

已解決!

對於任何遇到類似問題的人來說,問題出在表單域的命名上。

在我的實體的財產使用駝峯如下命名:

protected $givenName; 

但是在我的形式我命名使用下劃線符號的領域,因爲我相信這是慣例。

$builder->add('given_name', 'text'); 

這工作正常,除了錯誤冒泡的一切。簡單的解決辦法就是重命名我的領域如下:

$builder->add('givenName', 'text'); 

我希望這可以幫助別人:)

0

您應該不需要將error_bubbling設置爲false或true。首先嚐試刪除將error_bubbling設置爲false的所有行。

也可以嘗試加入'validation_groups' => array('yourValidationGroup')兩種類型,然後更新您的驗證文件引用yourValidationGroup

那麼也許作爲一個最後的嘗試添加提交按鈕向ContactType,以確保該ContactType是所提交的一個。

class ContactType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('name', new NameType()); 
     $builder->add('save', 'submit')); 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class'   => AcmeCoreBundle\Entity\Contact, 
      'cascade_validation' => true, 
      'validation_groups' => array('yourValidationGroup'), 

     )); 
    } 

    public function getName() 
    { 
     return 'acme_contact'; 
    } 
} 

class NameType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('given_name', 'text', array(
       'required'  => true, 
      )); 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class'  => AcmeCoreBundle\Entity\Name, 
      'validation_groups' => array('yourValidationGroup'), 
     )); 
    } 

    public function getName() 
    { 
     return 'acme_name'; 
    } 
}  

編輯: 它也發生在我,你可能會因註釋做您的驗證,而不是在你的捆綁使用validation.yml文件是什麼? (即.../Resources/config/validation.yml)

+0

感謝您的幫助德西。我已經嘗試了你所建議的一切,結果仍然是一樣的:(你是正確的我正在使用註釋進行驗證,這會有所作爲嗎? – mattvick

+0

事實上,除去'error_bubbling'選項使得出現given_name錯誤在聯繫人表單上,而不是在名稱表單上(與以前一樣)。我想讓錯誤出現在Name窗體的實際given_name字段中。 – mattvick

+0

有趣。我建議在你可以設置驗證組的bundle中嘗試一個validation.yml,但我想知道你的表單視圖代碼是否有什麼問題。你如何呈現表格?你是否使用自定義表單字段,並且可能會遺漏表單行的表單錯誤? –