Intereting Posts
Заголовок Content-Length всегда равен нулю Ссылка: что такое идеальный пример кода с использованием расширения MySQL? Генерация и деление сетки с помощью css / js / php Когда использовать метод стирания строки? fgetcsv () катит символы с диакритикой (т.е. не-ASCII) – как исправить? объединение двух наборов значений массива в один многорядный массив Как управлять одним сеансом PHP5 на нескольких серверах Apache? Каковы некоторые из недостатков Drupal? PHP и MySQL сравнивают пароль логин на сайте без пароля и имени пользователя использовать пользовательскую форму активный домен каталога Как получить результат сложного шаблона Википедии? Как я могу отделить число и получить первые две цифры в PHP? создать представление, которое получает ранг, имя пользователя и количество записей пользователя Возврат списка цепочек и последнего сообщения каждого сообщения с использованием базы данных php и mysql Как получить первое изображение из файла ramlbr rss в PHP

Значения форм пусты (не значение) после визуализации виджета в форме

У меня есть эта форма:

OrdersType

class OrdersType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { // Others $builder fields goes here if ($this->register_type[0] == "natural") { $builder->add('person', new NaturalPersonType(), array('label' => FALSE)); } elseif ($this->register_type[0] == "legal") { $builder->add('person', new LegalPersonType(), array('label' => FALSE)); } } } 

PersonType

 class PersonType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('description', 'text', array( 'required' => TRUE, 'label' => FALSE )) ->add('contact_person', 'text', array( 'required' => FALSE, 'label' => 'Persona de Contacto' )); } } 

Это то, что я делаю в контроллере:

 public function editAction($id = null) { $em = $this->getDoctrine()->getManager(); $order = $em->getRepository('FrontendBundle:Orders')->find($id); $type = $order->getPerson()->getPersonType() === 1 ? "natural" : "legal"; $orderForm = $this->createForm(new OrdersType(array($type)), $order, array( 'action' => $this->generateUrl('update-order', array('id' => $id)), 'method' => 'POST', )); return array( 'entity' => $order, "form" => $orderForm->createView(), 'id' => $id ); } 

Затем, на мой взгляд, я обрабатываю поля следующим образом:

 {{ form_widget(form.person.person.description) }} 

Код отображает поле справа, но без значений и да, он имеет значения, где ошибка? Это другие формы, которые я использую:

LegalPersonType

 class LegalPersonType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('rif', 'text', array( 'required' => true, 'label' => false, 'attr' => array( 'maxlength' => 10, )) ) ->add('identification_type', 'choice', array( 'label' => FALSE, 'choices' => RifType::getChoices(), 'attr' => array( 'class' => 'toSelect2' ) )) ->add('person', new PersonType(), array('label' => FALSE)); } } 

Работа с картографированием

PersonType

 class PersonType extends AbstractType { .... public function setDefaultOptions(OptionsResolverInterface $resolver) { $resolver->setDefaults(array( 'data_class' => 'Tanane\FrontendBundle\Entity\Person', 'inherit_data' => true )); } public function getName() { return 'person'; } } 

NaturalPersonType

 class NaturalPersonType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { parent::buildForm($builder, $options); $builder ->add('identification_type', 'choice', array( 'label' => 'Número de Cédula', 'choices' => CIType::getChoices() )) ->add('ci', 'number', array( 'required' => true, 'label' => false, 'attr' => array( 'maxlength' => 8, )) ) ->add('person', new PersonType(), array( 'label' => FALSE, 'data_class' => 'Tanane\FrontendBundle\Entity\NaturalPerson' )); } public function setDefaultOptions(OptionsResolverInterface $resolver) { $resolver->setDefaults(array( 'data_class' => 'Tanane\FrontendBundle\Entity\NaturalPerson' )); } public function getName() { return 'natural_person'; } } 

Если я setDefaultOptions метод setDefaultOptions из NaturalPersonType я получу эту ошибку:

Ожидается, что данные вида формы будут иметь тип скаляр, массив или экземпляр \ ArrayAccess, но это экземпляр класса Tanane \ FrontendBundle \ Entity \ NaturalPerson. Вы можете избежать этой ошибки, установив параметр «data_class» в «Tanane \ FrontendBundle \ Entity \ NaturalPerson» или добавив трансформатор представлений, который преобразует экземпляр класса Tanane \ FrontendBundle \ Entity \ NaturalPerson в скаляр, массив или экземпляр \ ArrayAccess.

Если я уйду, так получилось:

Метод «описание» для объекта «Symfony \ Component \ Form \ FormView» не существует в /var/www/html/tanane/src/Tanane/BackendBundle/Resources/views/Order/edit.html.twig в строке 134

Похоже, что PersonType неправильно сопоставляется с вашей сущностью.

Поскольку он используется как LegalPersonType и NaturalPersonType для обработки некоторых своих свойств, я бы определил его как parent для этих двух. Этого можно добиться с помощью опции inherit_data ( документация ).

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

PersonType

 class PersonType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('description', 'text', array( 'required' => TRUE, 'label' => FALSE )) ->add('contact_person', 'text', array( 'required' => FALSE, 'label' => 'Persona de Contacto' )); } public function setDefaultOptions(OptionsResolverInterface $resolver) { $resolver->setDefaults(array( 'inherit_data' => true, )); } } 

Обратите внимание, что вы должны удалить параметр data_class из setDefaultOptions() .

LegalPersonType

 class LegalPersonType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('rif', 'text', array( 'required' => true, 'label' => false, 'attr' => array( 'maxlength' => 10, )) ) ->add('identification_type', 'choice', array( 'label' => FALSE, 'choices' => RifType::getChoices(), 'attr' => array( 'class' => 'toSelect2' ) )) ->add('data', new PersonType(), array( 'label' => FALSE, 'data_class' => 'YourBundle\Entity\LegalPerson', )); } } 

Ваш NaturalPersonType будет похож на LegalPersonType .

Теперь вы можете сделать это в своем представлении:

 {{ form_widget(form.person.data.description) }}