Symfony2.4 Modulo 'Questo modulo non dovrebbe contenere un errore di campi aggiuntivi "
-
21-12-2019 - |
Domanda
Sto cercando di costruire un'app basata su Rest API Angularjs.Ho seguito questo tutorial http://npmasters.com/2012/11/25/symfonia2-Rest-fosrestbunddle.html ma devono modificare alcuni dettagli (metodi ammortizzati) e in questo momento quando post-post per creare una nuova entità ottengo "Questo modulo non dovrebbe contenere un errore di campi aggiuntivi.
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(),
)
);
}
}
.
My TaskType Form:
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))
;
}
.
In questo momento, a mio avviso, sto rendendo solo una forma ma sono nella fase di test :
{%extends 'MyBundle::layout.html.twig' %}
{%block content %}
<div ng-view></div>
{{ form(form) }}
{% endblock %}
.
E questo è il controller di riposo che dovrebbe flush dato entità:
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: Quando metto lo stesso codice dal controller di riposo a MainController, il modulo è convalidato e la nuova entità viene scaricata, ma in qualche modo il controller di riposo lancia l'errore ...
Soluzione
è perché quando stai generando il modulo aggiungendo pulsanti di invio ma quando lo stai convalidando, non lo sei.Prova:
public function cpostAction(Request $request)
{
$entity = new Task();
$form = $this->createForm(new TaskType(), $entity)->add('submit','submit');
...
.
Il pulsante di invio è tecnicamente un campo anche se symfony non la mapperà a una proprietà di entità per impostazione predefinita.Quindi, quando si genera il modulo con un pulsante di invio e quindi inviare questo modulo il modulo generato nella tua azione del controller di validazione deve anche avere un pulsante di invio.
Altri suggerimenti
Se si desidera che il validatore ignorasse i campi aggiuntivi, è necessario provare a passare 'allow_extra_fields' => true
come opzione per il Formbuilder.
Se vuoi disabilitare la convalida dei campi, è necessario aggiungere
public function setDefaultOptions(\Symfony\Component\OptionsResolver\OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'csrf_protection' => false,
'validation_groups' => false,
));
}
.
e nel metodo 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')
.
.
.
}
.
Per maggiori dettagli: http://symfony.com/doc/current/cookbook/form/ddynamic_form_modification.html#cookbook-dynamic-form-modification-suppressing-form-validation
Se si aggiunge un singolo pulsante di invio di prove o simile, si utilizza la soluzione Chausser indicata
$entity = new Task();
$form = $this->createForm(new TaskType(), $entity)->add('submit','SubmitType::class');
.
Tuttavia, nel caso in cui si stia utilizzando un collectionType e incorporando un insieme di sottoduzioni secondari, è necessario includere 'Allow_ADD'=> TRUE nei parametri per quel tipo.Ad esempio, nel Builder Form EntityTyPe:
$builder->add('subEntities', CollectionType::class, array(
'entry_type' => SubEntityType::class,
'entry_options' => array('label' => false),
'allow_add' => true,
))
.
Assicurati di farlo per tutti i livelli di incorporamento se hai più livelli.