Intereting Posts

Symfony2.4 form 'Эта форма не должна содержать лишних полей

Я пытаюсь создать приложение, основанное на REST api ang AngularJS. Я слежу за этим учебным пособием http://npmasters.com/2012/11/25/Symfony2-Rest-FOSRestBundle.html, но должен изменить некоторые детали (обесцененные методы), и прямо сейчас, когда я отправляю сообщение для создания нового объекта, который я получаю «Эта форма не должна содержать лишних полей».

class MainController extends Controller { public function indexAction(Request $request) { $form = $this->createForm(new TaskType(),null,array('action' => $this->generateUrl('post_tasks').'.json')) ->add('submit','submit'); $note_form = $this->createForm(new NoteType()) ->add('submit','submit'); return $this->render('MyBundle:Main:index.html.twig', array( 'form'=>$form->createView(), 'note_form'=>$note_form->createView(), ) ); } } 

моя форма TaskType:

  public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('timeStart','datetime',array( 'date_widget' => 'single_text', 'time_widget' => 'single_text', 'date_format' => 'yyyy-MM-dd', 'data' => new \DateTime('now') )) ->add('timeStop','datetime',array( 'date_widget' => 'single_text', 'time_widget' => 'single_text', 'date_format' => 'yyyy-MM-dd', 'data' => new \DateTime('now') )) ->add('project') ->add('descriptionTask') ->add('isCompleted',null,array('required' => false)) ->add('isVisible',null,array('required' => false)) ; } и  public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('timeStart','datetime',array( 'date_widget' => 'single_text', 'time_widget' => 'single_text', 'date_format' => 'yyyy-MM-dd', 'data' => new \DateTime('now') )) ->add('timeStop','datetime',array( 'date_widget' => 'single_text', 'time_widget' => 'single_text', 'date_format' => 'yyyy-MM-dd', 'data' => new \DateTime('now') )) ->add('project') ->add('descriptionTask') ->add('isCompleted',null,array('required' => false)) ->add('isVisible',null,array('required' => false)) ; } 

прямо сейчас, на мой взгляд, я показываю только одну форму, но я на тестовом этапе :

 {%extends 'MyBundle::layout.html.twig' %} {%block content %} <div ng-view></div> {{ form(form) }} {% endblock %} 

И это контроллер REST, который должен очищать данный объект:

 public function cpostAction(Request $request) { $entity = new Task(); $form = $this->createForm(new TaskType(), $entity); $form->handleRequest($request); if ($form->isValid()) { $em = $this->getDoctrine()->getManager(); $em->persist($entity); $em->flush(); return $this->redirectView( $this->generateUrl( 'get_organisation', array('id' => $entity->getId()) ), Codes::HTTP_CREATED ); } return array( 'form' => $form, ); } 

WEIRD THING: когда я помещаю тот же код из контроллера REST в MainController, форма проверяется и новый объект очищается, но как-то REST-контроллер выдает ошибку …

    Потому что, когда вы генерируете форму, вы добавляете кнопки отправки, но когда вы их проверяете, вы не являетесь. пытаться:

     public function cpostAction(Request $request) { $entity = new Task(); $form = $this->createForm(new TaskType(), $entity)->add('submit','submit'); ... 

    Кнопка отправки технически является полем, хотя symfony не будет сопоставлять его с свойством entity по умолчанию. Поэтому, когда вы создаете форму с помощью кнопки отправки, а затем отправляете эту форму, форма, которую вы генерируете в вашем действии контроллера проверки, также должна иметь кнопку отправки.

    Если вы хотите, чтобы валидатор игнорировал дополнительные поля, вы должны попробовать передать 'allow_extra_fields' => true в качестве опции для FormBuilder.

    Если вы хотите отключить проверку полей, вы должны добавить

     public function setDefaultOptions(\Symfony\Component\OptionsResolver\OptionsResolverInterface $resolver) { $resolver->setDefaults(array( 'csrf_protection' => false, 'validation_groups' => false, )); } 

    И в методе buildForm:

      public function buildForm(FormBuilderInterface $builder, array $options) { $builder->addEventListener(FormEvents::POST_SUBMIT, function ($event) { $event->stopPropagation(); }, 900); $builder->add('field1','text') ->add('field2','text') . . . } 

    Для получения дополнительной информации: http://symfony.com/doc/current/cookbook/form/dynamic_form_modification.html#cookbook-dynamic-form-modification-suppressing-form-validation