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 :

[Form] Valider un champ texte vide [2.x]


Sujet :

Symfony PHP

  1. #1
    Membre éclairé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    772
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2004
    Messages : 772
    Points : 872
    Points
    872
    Par défaut [Form] Valider un champ texte vide
    Bonjour,

    Sur un champ text non "required", sans contrainte NotBlank ou autre, la valeur correspondante de mon entité n'est pas écrasée par une chaine vide.

    Doctrine tente de faire un setMonChamp(null) qui n'écrase pas l'ancienne valeur... Si je fais un setMonChamp('') à la main ça marche bien...

    Avez-vous rencontré ce problème ?
    • Mon blog PHP : http://blog.alterphp.com
    • "Peace cannot be kept by force, it can only be achieved by Understanding" -- Albert Einstein

  2. #2
    Inscrit
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 319
    Points : 476
    Points
    476
    Par défaut
    Salut,

    C'est etrange oui, mais pourquoi un setTonChamp(null) n'ecrase pas l'ancienne valeur ? A partir du moment ou Doctrine appelle bien cette methode de l'objet, c'est a toi de gerer le cas dans cette methode.

  3. #3
    Membre éclairé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    772
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2004
    Messages : 772
    Points : 872
    Points
    872
    Par défaut
    Je n'en sais rien, "mon entité est brut de génération".

    J'ai remarque que le problème se pose pour une entité qui est "proxyfiée" par Doctrine2, pour les autres je peux setter une valeur vide sans problème...
    edit: FAUX, j'en ai qui marche, même proxyfiée...
    • Mon blog PHP : http://blog.alterphp.com
    • "Peace cannot be kept by force, it can only be achieved by Understanding" -- Albert Einstein

  4. #4
    Membre éclairé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    772
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2004
    Messages : 772
    Points : 872
    Points
    872
    Par défaut
    Voici le code côté Controller :

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
       public function editProfilAction()
       {
          $user = $this->get('security.context')->getToken()->getUser();
          $profile = $user->getCustomerAccount();
     
          $form = $this->get('form.factory')
             ->createBuilder('form', $profile)
             ->add('companyName', 'text', array ('label' => "youraccount.companyName", 'required' => false))
             ->add('contactFullname', 'text', array ('label' => "youraccount.contactName", 'required' => true))
             ->add('phoneNumber', 'text', array ('label' => "youraccount.phoneNumber", 'required' => true))
             ->add('address1', 'text', array ('label' => "youraccount.address1", 'required' => false))
             ->add('address2', 'text', array ('label' => "youraccount.address2", 'required' => false))
             ->add('zip', 'text', array ('label' => "youraccount.zipcode", 'required' => false))
             ->add('city', 'text', array ('label' => "youraccount.city", 'required' => false))
             ->add('state', 'choice', array ('label' => "shipcountry", 'choices' => array ('FR' => 'FR', 'DE' => 'DE', 'UK' => 'UK'), 'required' => true))
             ->getForm();
     
          $request = $this->get('request');
          if ($request->getMethod() == 'POST')
          {
             $form->bindRequest($request);
     
             if ($form->get('contactFullname')->isValid() && $form->get('phoneNumber')->isValid() && $form->get('state')->isValid())
             {
                $em = $this->get('doctrine')->getEntityManager();
                $em->persist($profile);
                $em->flush();
                return $this->redirect($this->generateUrl('_account'));
             }
          }
     
          return $this->render('CompanyAccountBundle:EditAccount:editProfil.html.twig'));
    • Mon blog PHP : http://blog.alterphp.com
    • "Peace cannot be kept by force, it can only be achieved by Understanding" -- Albert Einstein

  5. #5
    Membre éclairé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    772
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2004
    Messages : 772
    Points : 872
    Points
    872
    Par défaut
    Je n'y comprends rien, j'ai écrit un test qui ressort une entité de ma base, setCompanyName(null) puis persist et flush... et là ça marche bien...
    • Mon blog PHP : http://blog.alterphp.com
    • "Peace cannot be kept by force, it can only be achieved by Understanding" -- Albert Einstein

  6. #6
    Membre éclairé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    772
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2004
    Messages : 772
    Points : 872
    Points
    872
    Par défaut
    J'explique le code de mon contrôlleur :

    Je récupère le customerAccount lié à ma table user (via la colonne user.customer_account_id). Doctrine m'a mappé une association ManyToOne et donc je récupère le customerAccount en question directement depuis le User connecté :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $user = $this->get('security.context')->getToken()->getUser();
    $customerAccount = $user->getCustomerAccount();
    Seulement je ne récupère pas une entité réelle mais une ProxyClass auto-générée par Doctrine2.

    Je pense que certaines classes sont automatiquement "proxyfiée" quand elles sont chargées... mais franchement je ne saurai dire sur quelq critères


    Et donc quand je souhaite sauvegarder les données de mon form, un champ textuel initialement non-vide que je souhaiterais vider n'est pas sauvegardé...

    Mais là où ça devient intéressant, c'est que si j'essaie de modifier un customerAccount autre que celui de mon user courant, les données sont bien mises à jour, même avec une chaîne vide !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
          $customerAccount = $em->getRepository('Company\SellerBundle\Entity\CustomerAccount')->findOneBy(array ('customerAccountId' => 8));

    Il semble donc qu'il y ait un rapport avec les proxy...
    • Mon blog PHP : http://blog.alterphp.com
    • "Peace cannot be kept by force, it can only be achieved by Understanding" -- Albert Einstein

  7. #7
    Inscrit
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 319
    Points : 476
    Points
    476
    Par défaut
    Uhm interessant. J'avais deja lu un truc sur les proxy Doctrine qui expliquait bien mais pas moyen de remettre la main dessus...

    Tu t'en sers souvent de ton CustomerAccount ? Une alternative (que je fais perso) est de personnaliser le UserProvider pour recuperer non seulement le User, mais aussi le CustomerAccount via une jointure. Et ce a chaque page. Ainsi, quand tu feras $user->getCustomerAccount(), ca ne va pas trigger une requete. Et tu auras une vraie entite, pas un proxy fantome a la Doctrine :p

  8. #8
    Membre éclairé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    772
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2004
    Messages : 772
    Points : 872
    Points
    872
    Par défaut
    Ahh! Je vais tester ça, ça m'a l'air intéressant
    • Mon blog PHP : http://blog.alterphp.com
    • "Peace cannot be kept by force, it can only be achieved by Understanding" -- Albert Einstein

  9. #9
    Membre éclairé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    772
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2004
    Messages : 772
    Points : 872
    Points
    872
    Par défaut
    Merci Winzou, ça marche du tonnerre !!

    Néanmoins j'ai déclaré le bug sur Symfony car ne pas pouvoir faire un setXxxx(null) sur un proxy est bien embêtant...
    https://github.com/symfony/symfony/issues/1417
    • Mon blog PHP : http://blog.alterphp.com
    • "Peace cannot be kept by force, it can only be achieved by Understanding" -- Albert Einstein

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Recherche sur champ texte vide impossible
    Par DelphiCool dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 14/02/2009, 17h42
  2. Tester un champ texte vide avec DLookup
    Par spoker04 dans le forum VBA Access
    Réponses: 3
    Dernier message: 16/09/2008, 13h34
  3. SQL Autoriser champ texte vide
    Par kilimanjaro dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 09/06/2007, 17h41
  4. [VBA-E] Mise en forme d'un champ si VIDE
    Par ickyknox dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 17/04/2007, 14h28
  5. [CR] mise en forme d'un champs texte en fonction des données
    Par niPrM dans le forum SAP Crystal Reports
    Réponses: 6
    Dernier message: 29/06/2004, 11h57

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