2014-02-10 3 views
1

Я пытаюсь получить сообщение об ошибке для встроенной формы для отображения рядом с полем формы с ошибкой.Symfony Doctrine OneToOne встроенная форма error_bubbling

У меня 2 Doctrine объекты, связанные со связью 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_validation в true на контактную форму, которая является корнем формы и error_bubbling к false на всех уровнях. Я тестировал эти параметры конфигурации, и они устанавливаются.

Однако сообщение об ошибке прилагается к form.name, а не form.name.given_name, что я и хочу.

Куда я иду не так?

Matthew

ответ

1

РЕШЕННЫЙ!

Для тех, кто сталкивался с подобной проблемой, проблема заключалась в присвоении имен полям формы.

В моей сущности свойство было названо с использованием верблюжьего следующим образом:

protected $givenName; 

Однако в моей форме я назвал поле с помощью подчеркивания обозначения, как я считаю, что это условность.

Это работало отлично для всего, кроме пузырька ошибок. Простое решение было переименовать мое поле следующим образом:

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

Я надеюсь, что это помогает кто-то :)

0

Вы не должны установить error_bubbling ложь или правда. Сначала попробуйте удалить все строки, которые устанавливают 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'; 
    } 
}  

EDIT: Это также произошло со мной, что вы можете быть в зависимости от аннотаций, чтобы сделать вашу проверку, в отличие от использования файла validation.yml в вашем пачке? (т. е. .../Resources/config/validation.yml)

+0

Спасибо за вашу помощь Дези. Я испробовал все, что вы предложили, и результат остается тем же :(Вы правы, я использую аннотации для моей проверки. Будет ли это иметь значение? – mattvick

+0

Фактически удаление опции 'error_bubbling' повсюду сделало ошибку данного_имя в форме «Контакт», а не в форме «Имя» (как и раньше).Я хочу, чтобы ошибка появлялась в поле actual_name в форме Name. – mattvick

+0

Интересно. Я рекомендую попробовать validation.yml в комплекте, где вы можете установить группу проверки, но мне интересно, есть ли что-то, что происходит с вашим кодом вида формы. Как вы представляете форму? Вы используете пользовательские поля формы и, возможно, не учитываете форму-ошибку для строки формы? –

Смежные вопросы