admin composant : JTable et champs vides

Réduire
X
  • Filtrer
  • Heure
  • Afficher
Tout effacer
nouveaux messages

  • [RÉGLÉ] admin composant : JTable et champs vides

    Bonjour,
    Je suis en train de réaliser la partie admin d'un composant et je me trouve confronté à une petite difficulté :

    J'aimerais que certains champs du formulaire d'édition d'items soient facultatifs.
    Dans ma table, les colonnes correspondantes sont NULL par défaut.
    Dans la classe JTable correspondante, j'ai donc mis ces variables à NULL.

    Mon problème est qu'à de la validation du formulaire les champs laissés vides transmettent une chaîne vide et non la valeur NULL. Or pour les colonnes de type DATE et TIME, une chaîne vide correspond à la "date" '0000-00-00' et à l'heure '00:00:00'

    Le paramètre $ignore de la fonction JTable::bind() permet effectivement d'ignorer de manière systématique une colonne, mais j'aimerais savoir s'il existe un moyen de lui signifier que si le champ est vide il faut l'ignorer/prendre la valeur par défaut autrement qu'en remplacement manuellement les chaînes vides par NULL...

    d'avance merci
    Code:
    ˛`ˉˉTˉˉ`¸
        |  /\__/\
        |  =°__°=
        J~( ^^^^ )\
           \ __ /
            U  U

  • #2
    quel est la différence entre vide et null?
    Connaitre son ignorance est la meilleure part de la connaissance.

    Commentaire


    • #3
      pour le champs date
      $items->date = gmdate('Y-m-d H:i:s');
      Connaitre son ignorance est la meilleure part de la connaissance.

      Commentaire


      • #4
        J'ai réussi à trouver une solution à mon problème

        Ma déclaration de structure de ma table contient en particulier ces deux lignes qui définissent un champ de type DATE et un champ de type TIME :
        Code:
        `dateFin` date DEFAULT NULL,
        `heure` time DEFAULT NULL
        Si on ne spécifie pas de valeur pour une de ces colonnes lors de l'ajout d'une ligne, elles sont censées prendre la valeur NULL (d'après le "DEFAULT NULL").
        Mais à la validation du formulaire, les champs non remplis contiennent une chaîne de caractères vide (c'est à dire "") et c'est cette valeur qui est transmise à la requête SQL.
        Or en insérant une chaîne vide dans un champ DATE, cette valeur est considérée comme invalide et la "date" '0000-00-00' est enregistrée à la place.

        Ce qu'il faut c'est donc que JTable::store() reçoive NULL comme valeur pour ces variables et non une chaîne vide.

        Ma solution : Après analyse du code de la fonction JTable::bind(), je l'ai légèrement modifiée et redéfinie
        Code PHP:
        function bind$from$ignore=array() )
        {
            
        $fromArray    is_array$from );
            
        $fromObject    is_object$from );
            if (!
        $fromArray && !$fromObject)
            {
                
        $this->setErrorget_class$this ).'::bind failed. Invalid from argument' );
                return 
        false;
            }
            if (!
        is_array$ignore )) {
                
        $ignore explode' '$ignore );
            }
            foreach (
        $this->getProperties() as $k => $v)
            {
                
        // internal attributes of an object are ignored
                
        if (!in_array$k$ignore ))
                {
                    if (
        $fromArray && !empty( $from[$k] )) { //<--- isset => !empty
                        
        $this->$k $from[$k];
                    } else if (
        $fromObject && !empty( $from->$k )) { //<--- isset => !empty
                        
        $this->$k $from->$k;
                    }
                }
            }
            return 
        true;

        ce qui fait que si la variable contient une chaîne de caractère vide, celle-ci est ignorée et la valeur par défaut est conservée.

        Ensuite, la fonction JTable::store(), admet un paramètre $updateNulls valant false par défaut qu'il faut mettre à true pour que la fonction accepte de passer NULL comme valeur dans la requête SQL.

        Voilà, en espérant que cela aide d'autres personnes !
        Code:
        ˛`ˉˉTˉˉ`¸
            |  /\__/\
            |  =°__°=
            J~( ^^^^ )\
               \ __ /
                U  U

        Commentaire


        • #5
          Envoyé par khadimoukoum Voir le message
          quel est la différence entre vide et null?
          je parlais d'une chaîne de caractères vide, c'est-à-dire : "" ce qui est totalement différent de NULL !
          Code:
          ˛`ˉˉTˉˉ`¸
              |  /\__/\
              |  =°__°=
              J~( ^^^^ )\
                 \ __ /
                  U  U

          Commentaire


          • #6
            Bonjour,

            Sans faire un cours de SQL ISO99, déclarer un champ date, datetime ou time en NULL par défaut est un hérésie. Bien qu eMySQL l'accepte (pour l'instant, MySQL 5.5 ne l'accepte plus, pour conformance ISO), le NULL en traitement des dates reste invalide et doit déclencher une exception. Une date nulle doit être entrée sous la forme YYYY-MM-DD soit 0000-00-00, ce qui est le comportement remarqué en cas de date invalide.

            Aller bricoler pour forcer une date à NULL risque de poser de très gros problèmes lors des mises à jour des serveurs MySQL par les hébergeurs.
            Pas de demande de support par MP.
            S'il n'y a pas de solution, c'est qu'il n'y a pas de problème (Devise Shadok)

            Commentaire


            • #7
              Merci pour l'info
              Code:
              ˛`ˉˉTˉˉ`¸
                  |  /\__/\
                  |  =°__°=
                  J~( ^^^^ )\
                     \ __ /
                      U  U

              Commentaire

              Annonce

              Réduire
              1 sur 2 < >

              C'est [Réglé] et on n'en parle plus ?

              A quoi ça sert ?
              La mention [Réglé] permet aux visiteurs d'identifier rapidement les messages qui ont trouvé une solution.

              Merci donc d'utiliser cette fonctionnalité afin de faciliter la navigation et la recherche d'informations de tous sur le forum.

              Si vous deviez oublier de porter cette mention, nous nous permettrons de le faire à votre place... mais seulement une fois
              Comment ajouter la mention [Réglé] à votre discussion ?
              1 - Aller sur votre discussion et éditer votre premier message :


              2 - Cliquer sur la liste déroulante Préfixe.

              3 - Choisir le préfixe [Réglé].


              4 - Et voilà… votre discussion est désormais identifiée comme réglée.

              2 sur 2 < >

              Assistance au forum - Outil de publication d'infos de votre site

              Compatibilité: PHP 4.1,PHP4, 5, 6DEV MySQL 3.2 - 5.5 MySQLi from 4.1 ( @ >=PHP 4.4.9)

              Support Version de Joomla! : | J!3.0 | J!2.5.xx | J!1.7.xx | J!1.6.xx | J1.5.xx | J!1.0.xx |

              Version française (FR) D'autres versions sont disponibles depuis la version originale de FPA

              UTILISER À VOS PROPRES RISQUES :
              L'exactitude et l'exhaustivité de ce script ainsi que la documentation ne sont pas garanties et aucune responsabilité ne sera acceptée pour tout dommage, questions ou confusion provoquée par l'utilisation de ce script.

              Problèmes connus :
              FPA n'est actuellement pas compatible avec des sites Joomla qui ont eu leur fichier configuration.php déplacé en dehors du répertoire public_html.

              Installation :

              1. Téléchargez l'archive souhaitée : http://afuj.github.io/FPA/

              Archive zip : https://github.com/AFUJ/FPA/zipball/master

              2. Décompressez le fichier de package téléchargé sur votre propre ordinateur (à l'aide de WinZip ou d'un outil de décompression natif).

              3. Lisez le fichier LISEZMOI inclus pour toutes les notes de versions spécifiques.

              4. LIRE le fichier de documentation inclus pour obtenir des instructions d'utilisation détaillées.

              5. Téléchargez le script fpa-fr.php à la racine de votre site Joomla!. C'est l'endroit que vous avez installé Joomla et ce n'est pas la racine principale de votre serveur. Voir les exemples ci-dessous.

              6. Exécutez le script via votre navigateur en tapant: http:// www. votresite .com/ fpa-fr.php
              et remplacer www. votresite .com par votre nom de domaine


              Exemples:
              Joomla! est installé dans votre répertoire web et vous avez installé la version française du fichier FPA:
              Télécharger le script fpa-fr.php dans: /public_html/
              Pour executer le script: http://www..com/fpa-fr.php

              Joomla! est installé dans un sous-répertoire nommé "cms" et vous avez installé la version française du fichier FPA:
              Télécharger le script fpa-fr.php dans: /public_html/cms/
              Pour executer le script: http://www..com/cms/fpa-fr.php

              En raison de la nature très sensible de l'information affichée par le script FPA, il doit être retiré immédiatement du serveur après son utilisation.

              Pour supprimer le script de votre site, utilisez le lien de script de suppression fourni en haut de la page du script. Si le lien de suppression échoue pour supprimer le script, utilisez votre programme FTP pour le supprimer manuellement ou changer le nom une fois que le script a généré les données du site et le message publié sur le forum. Si le script est toujours présent sur le site, il peut être utilisé pour recueillir suffisamment d'informations pour pirater votre site. Le retrait du script empêche des étrangers de l'utiliser pour jeter un oeil à la façon dont votre site est structuré et de détecter les défauts qui peuvent être utilisé à vos dépends.
              Voir plus
              Voir moins
              Travaille ...
              X