IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

Comment rendre un formulaire imbriqué optionnel ?


Sujet :

Symfony PHP

  1. #1
    Membre à l'essai
    Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 33
    Points : 16
    Points
    16
    Par défaut Comment rendre un formulaire imbriqué optionnel ?
    Bonjour,

    Voici mon entité catégorie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    /**
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
     private $id;
    /**
     * @var string $titre
     *
     * @ORM\Column(name="titre", type="string", length=255)
     */
     private $titre;
    /**
     * @ORM\ManyToOne(targetEntity="App\AppBundle\Entity\Media", cascade={"persist"})
     * @ORM\JoinColumn(name="picto_id", referencedColumnName="id")
     */
     private $picto;
    Mon formulaire d'édition de catégorie est comme celui-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder
            ->add('titre')
            ->add('picto', new MediaType(), array('required' => false))
        ;
    }
    Mon formulaire média est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder
            ->add('file', 'file', array('required' => true))
        ;
    }
    Mon problème est que lorsque je valide mon formulaire sans renseigner de picto, j'ai l'erreur suivante :
    SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'fichier' cannot be null

    C'est à dire que mon formulaire de catégorie traite quand même mon formulaire de média.

    N'y a t'il donc pas moyen de rendre ce formulaire de média optionnel et qu'il ne soit pas traiter lorsque celui-ci n'est pas renseigner ?

    Merci de votre aide

  2. #2
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2011
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2011
    Messages : 135
    Points : 153
    Points
    153
    Par défaut
    Ta colonne fichier représente quoi? le path?
    sinon si tu veux pas qu'il te retourne cette erreur il faut que tu rajoute ceci dans ton entity :
    comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    @ORM\Column(name="fichier", type="string", 
    length=150,nullable=true)

  3. #3
    Membre à l'essai
    Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 33
    Points : 16
    Points
    16
    Par défaut
    Oui je sais, mais je n'ai pas envie d'insérer des médias dont le path est null.
    Il faudrait que la propriété picto soit null dans mon entité catégorie

    Ma colonne fichier me retourne mon path.

  4. #4
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2011
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2011
    Messages : 135
    Points : 153
    Points
    153
    Par défaut
    Sinon niveau controleur dans foreach tu test si le path est null et si c'est le cas tu le remove...

    genre si c'est un formulaire imbriqué:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    if ( $request->getMethod() == 'POST' ) {
    			$form->bindRequest($request);
     
    			if ($form->isValid() ) {
    			foreach($user->getTableauImg as $img)
                              {
                                       if ($img->getPath() != null)
                                            $img->upload()
                                       else
                                           $user->getTableauImg->removeElement($img);
                              }
     
    			}
    		}

  5. #5
    Membre à l'essai
    Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 33
    Points : 16
    Points
    16
    Par défaut
    Oui c'est une solution mais celle-ci ne me convient pas trop car j'aurai plusieurs formulaires qui intégreront le formulaire de média, il faudra donc copier ce bout de code à plusieurs endroits.
    Aussi, je ne pense pas que ce soit au niveau du controller qu'il fasse faire une re-validation du formulaire. je pense plutôt que cela doit se faire pendant la validation du formulaire mais je ne sais pas où.

  6. #6
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2011
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2011
    Messages : 135
    Points : 153
    Points
    153
    Par défaut
    Bah si tu fais un enregistrement par ajax tu test si le champ est vide ou non... et tu le supprimes.

  7. #7
    Membre à l'essai
    Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 33
    Points : 16
    Points
    16
    Par défaut
    Bonjour,

    J'ai réussi à rendre optionnel mon formulaire en utilisant un formlistener, dont voici le code de la méthode preBind :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public function preBind(DataEvent $event)
        {
            $data = $event->getData();
            $form = $event->getForm();
     
            if (null === $data || (null !== $data && null === $data['file']))
                if ($form->hasParent())
                    $form->getParent()->remove($form->getName());
        }
    Le problème qui se pose dorénavant, c'est lorsque je veux modifier ma catégorie.
    La relation entre la catégorie et mon picto ne se fait pas, c'est à dire que ma catégorie est bien enregistrée en base ainsi que mon picto mais mon champs picto_id est NULL.
    Ce problème apparaît uniquement lorsque j'ai ajouté une propriété supplémentaire à mon entité catégorie et que je rajoute le champs associé à mon formulaire de catégorie, voici la propriété :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    /**
         * @ORM\ManyToOne(targetEntity="App\AppBundle\Entity\Categorie", inversedBy="children")
         * @ORM\JoinColumn(name="parent_id", referencedColumnName="id", onDelete="SET NULL")
         */
        private $parent;
    Merci de votre aide

Discussions similaires

  1. Comment rendre mon formulaire plus performant
    Par pierrot10 dans le forum jQuery
    Réponses: 2
    Dernier message: 12/06/2013, 20h31
  2. Réponses: 4
    Dernier message: 10/08/2010, 23h40
  3. Réponses: 4
    Dernier message: 19/02/2008, 16h35
  4. Comment rendre visible des formulaires invisibles ?
    Par Taiyaki dans le forum Access
    Réponses: 3
    Dernier message: 14/12/2006, 11h21
  5. Réponses: 3
    Dernier message: 17/06/2006, 14h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo