8721 sujets

Développement web côté serveur, CMS

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

la parti formulaire se soumet bien mais ses la parti champForm qui pose des problèmes

Sur l'image il n'y a que le champNom c'est plus simple pour mes test plutôt que tout réécrire a chaque fois
Bonjours Sheikh, merci d'avoir répondu mais a part reprendre se que j'ai écrit je ne vois pas se que tu as fais de plus
Modifié par nathan1997 (18 Nov 2019 - 08:08)
Administrateur
Bonjour,

il a ajouté des liens dans la citation ; c'est une technique de spam dont le forum est victime depuis pas mal de temps… En général c'est plus évident parce qu'ils citent un post plus court ^^
Le "membre" (enfin le bot) est banni et ses messages supprimés Smiley cligne
Plus maintenant, j'arrive a recup les info du champsform alors je ne sais pas trop comment, je pense que sa vient d'une MAJ de symfony parce que je n'est rien changer et après avoir mis un ptit composer update sa a fonctionné . Le problème maintenant est que je n'arrive pas a en enregistrer plusieurs, je n'en récupère un seul
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