Pregunta

Estoy tratando de construir aplicaciones basadas en la api de REST de ang AngularJS.He estado siguiendo este tutorial http://npmasters.com/2012/11/25/Symfony2-Rest-FOSRestBundle.html pero tienen que cambiar algunos detalles ( depreciado métodos ) y ahora cuando he puesto a crear nueva entidad me dan Este formulario no debe contener campos extra' de error.

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

mi TaskType forma:

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

ahora, en mi opinión, estoy de representación de una sola forma, PERO ESTOY EN LA ETAPA DE PRUEBA:

{%extends 'MyBundle::layout.html.twig' %}

{%block content %}

<div ng-view></div>

{{ form(form) }}

{% endblock %}

Y este es el RESTO de controlador que se supone vaciar entidad dada:

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

COSA EXTRAÑA: cuando pongo el mismo código de RESTO de controlador para MainController, entonces formulario se valida y la nueva entidad que se vacían, pero de alguna manera el RESTO de controlador tira error...

¿Fue útil?

Solución

Es porque cuando está generando el formulario que está agregando botones de envío, pero cuando los está validando, no lo está.prueba:

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

El botón Enviar es técnicamente un campo aunque Symfony lo mapee a una propiedad de entidad de forma predeterminada.Entonces, cuando genere el formulario con un botón de envío y luego envíe ese formulario, el formulario que genera en la acción de su controlador de validación también debe tener un botón de envío.

Otros consejos

Si desea que el validador a ignorar los campos adicionales que usted debe tratar de pasar 'allow_extra_fields' => true como una opción para el FormBuilder.

Si desea deshabilitar la validación de campos, debe agregar

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

y en el método de construcción:

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

Para más detalles: http://symfony.com/doc/current/cookbook/form/dynamic_form_modification.html#cookbook-dynamic-form-modificación-supressing-form-validation

Si está agregando un solo botón SITPTYPE o similar, use la solución que Chausser indicó

$entity = new Task();
$form = $this->createForm(new TaskType(), $entity)->add('submit','SubmitType::class');

Sin embargo, en caso de que esté usando un tipo de colección e incrustando un conjunto de recursos secundarios, debe incluir 'Permitir_Add'=> Verdadero en sus parámetros para ese tipo.Por ejemplo, en su constructor de formulario EntityType:

$builder->add('subEntities', CollectionType::class, array(
                'entry_type' => SubEntityType::class,
                'entry_options' => array('label' => false),
                'allow_add' => true,
            ))

Asegúrese de hacerlo para todos los niveles de incrustación si tiene múltiples niveles.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top