Bonjour, je vous remercie d'avance de m'aider.

Voilà je dois créer un générateur de formulaire pour mon entreprise et je dois le faire avec Symfony 4 sur lequel je suis plus que débutant.

Pour le moment aucun problème j'arrive a afficher mes entité (Formulaire et ChampsForm) qui sont en relation Many(ChampForm)toOne(Formulaire)

le formulaire d'ajout de Formulaire fonctionne j'arrive a ajouter en base de données aucun problème mais je n'arrive pas a récupérer les données du formulaire de la partit ChampsForm qui est imbriquer a celui du Formulaire, je peut ajouter des champs en javascript,le script n'est pas de moi je les pris puis modifier sur le cour de symfony sur openclassrooms je vous met aussi toutes mes entité +Controlleur.

l'erreur est que il n'arrive pas à envoyé en base de données car toutes mes valeurs sont null et j'en conclu qu'il ne récupère pas les valeur dans le formulaire, et bien sur quand il m'affiche l'erreur ci-dessous il m'ajoute quand même dans ma base de données les formulaires mais pas les champs

An exception occurred while executing 'INSERT INTO champs_form (champ_nom, champs_type, champs_required, champ_max_size, champ_regex, champ_help, champs_order, champ_label, champ_form_id_id) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)' with params [null, null, null, null, null, null, null, null, 20]:

je ne cherche absolument pas une reponse toute faite mais au moins une piste sa fais deux jours que je cherche mais sans succès

ChampformType:

<?php
 
namespace App\Form;
 
use App\Entity\ChampsForm;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use App\Entity\Formulaire;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\IntegerType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
 
class ChampformType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
        ->setMethod('POST')
        ->add('champNom')
        ->add('champsType')
        ->add('champsRequired',CheckboxType::class)
        ->add('champMaxSize',IntegerType::class)
        ->add('champRegex')
        ->add('champHelp')
        ->add('champsOrder',IntegerType::class)
        ->add('champLabel')
        ;
    }
 
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => ChampsForm::class,
        ]);
    }
}

Formulaire:

<?php
 
namespace App\Entity;
 
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
 
/**
 * @ORM\Entity(repositoryClass="App\Repository\FormulaireRepository")
 */
class Formulaire
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;
 
    /**
     * @ORM\Column(type="string", length=255)
     */
    private $formNom;
 
    /**
     * @ORM\Column(type="string", length=255)
     */
    private $formDescription;
 
    /**
     * @ORM\Column(type="integer")
     */
    private $formTraitement;
 
    /**
     * @ORM\Column(type="boolean")
     */
    private $formActive;
 
    /**
     * @ORM\Column(type="integer")
     */
    private $formHit;
 
    /**
     * @ORM\Column(type="integer")
     */
    private $formHitValide;
 
    /**
     * @ORM\OneToMany(targetEntity="App\Entity\ChampsForm", mappedBy="champFormId", orphanRemoval=true ,cascade={"persist"})
     */
    private $champsForms;
 
    public function __construct()
    {
        $this->champsForms = new ArrayCollection();
    }
 
    public function getId(): ?int
    {
        return $this->id;
    }
 
    public function getFormNom(): ?string
    {
        return $this->formNom;
    }
 
    public function setFormNom(string $formNom): self
    {
        $this->formNom = $formNom;
 
        return $this;
    }
 
    public function getFormDescription(): ?string
    {
        return $this->formDescription;
    }
 
    public function setFormDescription(string $formDescription): self
    {
        $this->formDescription = $formDescription;
 
        return $this;
    }
 
    public function getFormTraitement(): ?int
    {
        return $this->formTraitement;
    }
 
    public function setFormTraitement(int $formTraitement): self
    {
        $this->formTraitement = $formTraitement;
 
        return $this;
    }
 
    public function getFormActive(): ?bool
    {
        return $this->formActive;
    }
 
    public function setFormActive(bool $formActive): self
    {
        $this->formActive = $formActive;
 
        return $this;
    }
 
    public function getFormHit(): ?int
    {
        return $this->formHit;
    }
 
    public function setFormHit(int $formHit): self
    {
        $this->formHit = $formHit;
 
        return $this;
    }
 
    public function getFormHitValide(): ?int
    {
        return $this->formHitValide;
    }
 
    public function setFormHitValide(int $formHitValide): self
    {
        $this->formHitValide = $formHitValide;
 
        return $this;
    }
 
    /**
     * @return Collection|ChampsForm[]
     */
    public function getChampsForms(): Collection
    {
        return $this->champsForms;
    }
 
    public function addChampsForm(ChampsForm $champsForm): self
    {
        if (!$this->champsForms->contains($champsForm)) {
            $this->champsForms[] = $champsForm;
            $champsForm->setChampFormId($this);
        }
 
        return $this;
    }
 
    public function removeChampsForm(ChampsForm $champsForm): self
    {
        if ($this->champsForms->contains($champsForm)) {
            $this->champsForms->removeElement($champsForm);
            // set the owning side to null (unless already changed)
            if ($champsForm->getChampFormId() === $this) {
                $champsForm->setChampFormId(null);
            }
        }
 
        return $this;
    }
}

ChampsForm:

<?php
 
namespace App\Entity;
 
use Doctrine\ORM\Mapping as ORM;
 
/**
 * @ORM\Entity(repositoryClass="App\Repository\ChampsFormRepository")
 */
class ChampsForm
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;
 
    /**
     * @ORM\Column(type="string", length=255)
     */
    private $champNom;
 
    /**
     * @ORM\Column(type="integer")
     */
    private $champsType;
 
    /**
     * @ORM\Column(type="boolean")
     */
    private $champsRequired;
 
    /**
     * @ORM\Column(type="integer")
     */
    private $champMaxSize;
 
    /**
     * @ORM\Column(type="text")
     */
    private $champRegex;
 
    /**
     * @ORM\Column(type="string", length=255)
     */
    private $champHelp;
 
    /**
     * @ORM\Column(type="integer")
     */
    private $champsOrder;
 
    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Formulaire", inversedBy="champsForms",cascade={"persist"})
     * @ORM\JoinColumn(nullable=false)
     */
    private $champFormId;
 
    /**
     * @ORM\Column(type="string", length=255)
     */
    private $champLabel;
 
    public function getId(): ?int
    {
        return $this->id;
    }
 
    public function getChampNom(): ?string
    {
        return $this->champNom;
    }
 
    public function setChampNom(string $champNom): self
    {
        $this->champNom = $champNom;
 
        return $this;
    }
 
    public function getChampsType(): ?int
    {
        return $this->champsType;
    }
 
    public function setChampsType(int $champsType): self
    {
        $this->champsType = $champsType;
 
        return $this;
    }
 
    public function getChampsRequired(): ?bool
    {
        return $this->champsRequired;
    }
 
    public function setChampsRequired(bool $champsRequired): self
    {
        $this->champsRequired = $champsRequired;
 
        return $this;
    }
 
    public function getChampMaxSize(): ?int
    {
        return $this->champMaxSize;
    }
 
    public function setChampMaxSize(int $champMaxSize): self
    {
        $this->champMaxSize = $champMaxSize;
 
        return $this;
    }
 
    public function getChampRegex(): ?string
    {
        return $this->champRegex;
    }
 
    public function setChampRegex(string $champRegex): self
    {
        $this->champRegex = $champRegex;
 
        return $this;
    }
 
    public function getChampHelp(): ?string
    {
        return $this->champHelp;
    }
 
    public function setChampHelp(string $champHelp): self
    {
        $this->champHelp = $champHelp;
 
        return $this;
    }
 
    public function getChampsOrder(): ?int
    {
        return $this->champsOrder;
    }
 
    public function setChampsOrder(int $champsOrder): self
    {
        $this->champsOrder = $champsOrder;
 
        return $this;
    }
 
    public function getChampFormId(): ?Formulaire
    {
        return $this->champFormId;
    }
 
    public function setChampFormId(?Formulaire $champFormId): self
    {
        $this->champFormId = $champFormId;
 
        return $this;
    }
 
    public function getChampLabel(): ?string
    {
        return $this->champLabel;
    }
 
    public function setChampLabel(string $champLabel): self
    {
        $this->champLabel = $champLabel;
 
        return $this;
    }
}

et pour finir mon controlleur :

/**
    * @Route ("/form/addchamp", name="addchamps")
    */
   public function add_champ(Request $request, ObjectManager $manager)
   {
       $form = new Formulaire();
       $formulaire = $this->createFormBuilder($form)
           ->add('formNom')
           ->add('formDescription')
           ->add('formTraitement')
           ->add('formActive')
           ->add('champsForms', CollectionType::class, array(
               'entry_type'   => ChampformType::class,
               'allow_add'    => true,
               'allow_delete' => true,
           ))
           ->add('formButton', SubmitType::class)
           ->getForm();
 
       $formulaire->HandleRequest($request);
       dump($formulaire);
       if ($formulaire->isSubmitted()&& $formulaire->isValid()) {
           
           $champForm = new ChampsForm;
           $form->addChampsForm($champForm);
           $form->setFormHit(0);
           $form->setFormHitValide(0);
           $manager->persist($form);
      //     echo $form['champsForms'][0]->getData();
            dump($form);
            dump($champForm);
 
           $manager->flush();
           return $this->render('form/add_champ.html.twig', [
               'controller_name' => 'FormController',
               'Forms' => $formulaire->createView(),
           ]);
       }
       return $this->render('form/add_champ.html.twig', [
           'controller_name' => 'FormController',
           'Forms' => $formulaire->createView(),
       ]);
   }

3 réponses


Essayes de mettre un persist($champForm) dans ta fonction "add_champ" tu ne fais pas de persist de champForm. J'ai eu ce problème avec des rôles et des droits que j'attrubuais à un User, et le problème venait de là.

Ou sinon regarde la doc Symfony sur les formulaires imbriqués : https://symfony.com/doc/current/form/embedded.html

je vien de tester et sa ne fonctionne pas le problème vient que je ne recup pas les données du formulaire enfin juste la parti champform

voila j'ai réussi a avancer légèrement j'ai ajouter ce bout de code a mon controller

for($i=0;$i<5;$i++){

          $form->getChampsForms()->add($champForm);
     }

et avec ce code cela me creer bien 5 champ de champNom et j'arrive a récup les données mais le soucis mtn c'est que c'est grâce a ma boucle for et j'aimerai le faire dynamiquement avec javascript comme dans le cour sur OC sur les formulaire imbriqué mais quand je valide sa me met la même erreur que je recup rien quelqu'un aurait une solution ou un début de solution

merci d'avance