Symfony, embedded 5 or 6 entities without relation in the one form

Par NEIRANG, il y a 10 ans


Bonjour,

Voila je rencontre un petit problème avec mon code.
Dans mon cas, j'ai 30 entités qu'il n'y a pas de relation entre eux et toutes les entités ont deux colonnes. Je voulais avoir 6 ou 7 entités dans une forme, mais je ne sais pas quelle est la meilleure façon de le faire? ceci est mon code ...

ceci est mon contrôleur:

public function general1Action(Request $request) { $example1 = new Example1(); $example2 = new Example2(); $example3 = new Example3(); $example4 = new Example4(); $formexample1 = $this->createForm('...Bundle\Form\Example1Type', $example1); $formexample2 = $this->createForm('...Bundle\Form\ Example2Type', $example2); $formexample3 = $this->createForm('...Bundle\Form\ Example3Type', $example3); $fprmexample4 = $this->createForm('...Bundle\Form\Example4Type', $example4); $example1->handleRequest($request); $example2->handleRequest($request); $example3->handleRequest($request); $example4->handleRequest($request); $em = $this->getDoctrine()->getManager(); if ($example1->isSubmitted() && $example1->isValid()) { /** * To generate the value example1 first column(e1fc) and second column(e1sc) */ $prefix=$this->container->getParameter('prefix'); $e1fcCle=$em->getRepository("...Bundle:Example1")->genereCle('Example1',$prefix); $example1->sete1fc($e1fcCle); /** * To generate the value example1 second column(e1sc) */ $example1->sete1sc("e1sc".($e1fcCle)); /** * to check, the fields are not empty */ if(($formexample2["e2sc"]->getData())!=""){ $example2->sete1fc($e1fcCle); $em->persist($example2); } if(($formexample3["e3sc"]->getData())!=""){ $example3->sete1fc($e1fcCle); $em->persist($example3); } if(($formexample4["e4sc"]->getData())!=""){ $example4-> sete1fc($e1fcCle); $em->persist($example4); } $em->persist($example1); $em->flush(); return $this->forward('...Bundle:General...: general2', array('E1FC' => $e1fcCle)); } return $this->render('.../general1.html.twig', array( 'example1' => $example1, 'formExample1' => $formexample1->createView(), 'formExample2' => $formexample2->createView(), 'formExample3' => $formexample3->createView(), 'formExample4' => $formexample4->createView(), )); }` ```

and this is my general1.html.twig :

{% extends 'base.html.twig' %} {% block body %} {{ form_start(formExample1) }} {{ form_row(formExample2.e2sc) }} {{ form_row(formExample3.e3sc) }} {{ form_row(formExample4.e4sc) }} <input type="submit" value="Next" /> {{ form_widget(formExample1._token) }} {{ form_end(formExample1, {"render_rest":false}) }} <ul> <li> <a href="{{ path('..._index') }}">Back to the list</a> </li> </ul> {% endblock %}`,

I have another question : when i try to use isValid() for the other form like this

if(($formexample2["e2sc"]->getData())!=""&& $example2->isValid())

i have this error: Fatal error: Call to a member function get...() on null

1 réponse

nico41, il y a 10 ans

Bonjour,

Pour chaque type d'entité, créer une classe formulaire (sans submit), ex Entity1Type pour Entity1

namespace AppBundle\Form; use AppBundle\Form; //... class Entity1Type extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder->add("prop_one", ...) ->add("prop_two", ...) //.... etc... } public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults([ "data_class"=>Entity1::class ]); } }

Créer un objet qui rassemble les entites que tu veux mettre dans ton formulaire

namespace AppBundle\Form\Model; class MyModel { /** * @var \AppBundle\Entity\Entity1 * @Assert\Valid() */ private $entity1; /** * @var \AppBundle\Entity\Entity2 * @Assert\Valid() */ private $entity2; /** * @var \AppBundle\Entity\Entity3 * @Assert\Valid() */ private $entity3; /** * @var \AppBundle\Entity\Entity4 * @Assert\Valid() */ private $entity4; //... etc ... // getters & setters ... }

Créer une classe formulaire pour MyModel :

namespace AppBundle\Form; use AppBundle\Form\Model\MyModel; //... class MyModelForm extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder->add("entity1", Entity1Type::class, [...]) ->add("entity2", Entity2Type::class, [...]) ->add("entity3", Entity3Type::class, [...]) ->add("entity4", Entity4Type::class, [...]) //.... etc ... ->add("submit", SubmitType::class, ["label"=>"Enregistrer"]) ; } public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults([ "data_class"=>MyModel::class ]); } }

dans ton controller :

public function monactionAction(Request $request) { // ... $model = new MyModel(); $model->setEntity1($entity1)->setEntity2($entity2)....... etc; $form = $this->createForm(MyModelForm::class, $model); $form->handleRequest($request); if($form->isValid()){ // ici les entités ont leurs nouvelles valeurs // ... code 'maison', persistence, ... // redirection } return $this->render("mapage.html.twig", ["form"=>$form->createView()]; }