Id de l'enregistrement avant qu'il ne soit créé

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

  • [RÉGLÉ] Id de l'enregistrement avant qu'il ne soit créé

    Bonsoir,

    Lorsque je sauvegarde un élément dans mon composant j'ai besoin de l'ID pour créer le nom de l'image. Or tout logiquement l'ID vaut 0 (je travaille dans le fonction save mon modèle JModelAdmin). Comment récupérer sous quel ID il va être enregistré avant qu'il ne le soit ? Cela me permet de vérifier l'image avant et si ça bloque je ne sauvegarde pas et affiche une erreur.

    Merci beaucoup!
    www.weblogin.fr - Création, Référencement et Design de sites Internet.

  • #2
    Re : Id de l'enregistrement avant qu'il ne soit créé

    Hello,

    Si il existe en SQL des solutions pour recuperer la prochaine valeur de l'AUTOINCREMENT, je te deconseille cette voie qui risque d'avoir des effets de bords néfastes !

    Je me permets donc te repondre en te proposant d'autres axes de reflexions :

    1- utiliser une codification propre a tes besoins (un champ de codif que tu alimentes toi-meme et qui te permettra de retrouver le nom de ton image) ?

    2- ou si tu souhaites reellement utiliser l'ID alors il faut peut-etre envisager de sauver l'image avec un nom temporaire (avec une clé aleatoire dasn le nom ?) puis une fois l'ID récupéré apres le store() alors renommer l'image comme il faut dans le FileSystem et dans la BD !?

    Bonne continuation
    Garstud Workshop - Concepteur, Développeur et Formateur Joomla - http://www.garstud.com
    « Ce n’est pas parce que les choses sont difficiles que nous n’osons pas,
    c’est parce que nous n’osons pas qu’elles sont difficiles. »
    - Sénèque

    Commentaire


    • #3
      Re : Id de l'enregistrement avant qu'il ne soit créé

      Bonjour et merci de me répondre.

      J'utilise cette technique car elle est pas mal pratique pour récupérer l'image par la suite, c'est aussi ce que fais K2 et j'ai trouvé ça pas mal... par exemple quand on fais une sauvegarde d'un nouvel élement on utilise :
      Code PHP:
      $db->setQuery('SELECT MAX(ordering) FROM #__mytable'); 
      Pour avoir le prochain ordering et je pensais à faire la même chose pour l'ID mais tu me conseille de ne pas y toucher pour des effets de bords néfastes. Pourrais tu m'en dire plus, je ne sais pas ce que c'est...

      Sinon l'idée de travailler sur du fichier temp et modifier le nom après le store() sera la meilleur solution je pense.
      D'ailleurs petite question intermédiaire, j'ai regardé le code des composants natifs pour faire ma fonction save() du modèle et j'ai remarqué qui après le store en faisant "$pkName = $table->getKeyName();" on récupère l'ID de l'élément si il est déjà enregistré. Mais quand je regarde le code de cette fonction il marque bien dans les commentaires qu'elle retourne simplement le nom de la clé primaire de la table et non ça valeur. Or il retourne bien ça valeur

      Merci
      www.weblogin.fr - Création, Référencement et Design de sites Internet.

      Commentaire


      • #4
        Re : Id de l'enregistrement avant qu'il ne soit créé

        Bonjour

        Récupérer la valeur de l'ID avant que l'ID soit connu est impossible; ça tu le sais. Faire un MAX() ou autre instruction SQL est relativement dangeureux car il est théoriquement possible qu'entre ton MAX() et ta méthode de sauvegarde, un autre enregistrement soit arrivé. C'est comme cela qu'on arrive à avoir des surbookings dans d'autres domaines.

        Je rejoins Marc lorsqu'il te propose une piste alternative.

        Tu pourrais p.ex. générer un event "OnAfterSaveMonEnregistrement" et tu aurais alors un plugin qui va capturer cet évènement et continuer la sauvegarde de l'image. Cela me semble être plus robuste.

        Si cela te parle, pense juste qu'un plugin peut être dépublié : est-ce un problème dans ton schéma de programmation ?
        Christophe (cavo789)
        Mon blog, on y parle Docker, PHP, WSL, Markdown et plein d'autres choses : https://www.avonture.be
        Logiciel gratuit de scan antivirus : https://github.com/cavo789/aesecure_quickscan (plus de 45.000 virus détectés, 700.000 fichiers sur liste blanche)​

        Commentaire


        • #5
          Re : Id de l'enregistrement avant qu'il ne soit créé

          Merci de cette rapidité à vous deux ! Je comprend mieux pourquoi le MAX n'est pas une bonne solution.

          Alors en fait oui le plugin va poser soucis par le fais qu'il puisse être dépublié. Mais surtout je pense que dans mon schéma il sera superflu étant seulement un composant backend pour la saisie. De ce fait, je pense sinon passer mon enregistrement de l'image après le store pour être capable de récupérer une instance de la table et donc avoir le bon ID. Si l'upload plante, je placerais toujours un message d'erreur mais en mentionnant que l'élément à quand même était enregistré.

          En fait je souhaite rester avec ce système d'ID car il n'y a qu'une image par élément et que cela me permet de le sauvegarde en plusieurs version S, M, L sans grande difficultés... Pour un système plus complexe c'est sur qu'une table "attachement" permettrait de garder les noms d'images attachés à un élément mais bon là se serait trop lourd pour un si petit truc.

          Si tu as 2sec Cavo789 pour éclairer ma lanterne sur le pourquoi du comment de mon interrogation dans le post précédent à propos de "$pkName = $table->getKeyName();" ce serait sympa. Ca n'a rien a voir avec mon soucis c'est juste pour comprendre

          Encore merci
          www.weblogin.fr - Création, Référencement et Design de sites Internet.

          Commentaire


          • #6
            Re : Id de l'enregistrement avant qu'il ne soit créé

            Hello,

            Oui je confirme l'explication de Cavo concernant le Max(), c'est bien un soucis de concurrence d'accès qui peut provoquer des problemes.

            Concernant l'utilisation de plugin, je pense que Cavo propose cette technique dans le cas ou tu souhaites rendre "extensible" l'operation de sauvegarde de ton traitement, comme si tu veux permettre a un developpeur tiers de combiner une autre operation lors de la sauvegarde d'une image (envoyer un email, ajouter des points fidelités au compte de l'utilisateur ... ou permettre d'ajouter une interaction entre ton composant et celui d'un developpeur tiers ... ce ne sont que quelques exemples )

            Pour ce qui est du getKeyName() ... je suis assez étonné du comportement que tu décris, car en regardant le source PHP de table.php et la doc de l'API, il semble bien que cette methode ne renvoie que le nom de la clé !


            A+
            Garstud Workshop - Concepteur, Développeur et Formateur Joomla - http://www.garstud.com
            « Ce n’est pas parce que les choses sont difficiles que nous n’osons pas,
            c’est parce que nous n’osons pas qu’elles sont difficiles. »
            - Sénèque

            Commentaire


            • #7
              Re : Id de l'enregistrement avant qu'il ne soit créé

              Ohhhhh purée ! J'ai vraiment honte ! J'avais complètement zappé une ligne de code qui en fait affecte getKeyName() a $pkname qui est après utilisé avec $table.... TOUTES MES EXCUSES pour le temps perdu pour cette étourderie !

              Oui je vois tout l’intérêt du plugin mais dans mon cas il ne sera pas utile vue les besoins du composant. Mais je garde ça en tête pour les prochains si ils doivent se retrouver en usage libre.
              www.weblogin.fr - Création, Référencement et Design de sites Internet.

              Commentaire


              • #8
                Re : Id de l'enregistrement avant qu'il ne soit créé

                Bon je le passe en résolue, la solution prise avec votre aide :
                - Après le Check() test sur l'image et enregistrement avec un nom temporaire. Ainsi si il y a un soucis il n'y a pas d'upload.
                - Après le Store() renommage avec l'ID en MD5 avec un grain de sable.

                Merci
                www.weblogin.fr - Création, Référencement et Design de sites Internet.

                Commentaire


                • #9
                  Re : Id de l'enregistrement avant qu'il ne soit créé

                  Bonjour

                  Envoyé par garstud Voir le message
                  Concernant l'utilisation de plugin, je pense que Cavo propose cette technique dans le cas ou tu souhaites rendre "extensible" l'operation de sauvegarde de ton traitement, comme si tu veux permettre a un developpeur tiers de combiner une autre operation lors de la sauvegarde d'une image (envoyer un email, ajouter des points fidelités au compte de l'utilisateur ... ou permettre d'ajouter une interaction entre ton composant et celui d'un developpeur tiers ... ce ne sont que quelques exemples )
                  L'enthousiasme aussi Les plug-ins sont un extraordinaire moyen de simplifier son code, de donner encore plus de flexibilité à l'utilisateur, de donner un moyen rapide à un développeur tiers de modifier cette partie-là du code, etc.

                  L'idée était dans ton onAfterSaveMonRecord de faire un appel à ton plugin avec ton ID puisque, à ce moment-là, tu le connais. Le plug-in étant effectivement superflu dans un usage plus privatif de ton composant

                  Bon dev'
                  Christophe (cavo789)
                  Mon blog, on y parle Docker, PHP, WSL, Markdown et plein d'autres choses : https://www.avonture.be
                  Logiciel gratuit de scan antivirus : https://github.com/cavo789/aesecure_quickscan (plus de 45.000 virus détectés, 700.000 fichiers sur liste blanche)​

                  Commentaire


                  • #10
                    Re : Id de l'enregistrement avant qu'il ne soit créé

                    En tout cas merci a vous pour la rapidité et la clarté de vos retours
                    www.weblogin.fr - Création, Référencement et Design de sites Internet.

                    Commentaire

                    Annonce

                    Réduire
                    Aucune annonce pour le moment.

                    Partenaire de l'association

                    Réduire

                    Hébergeur Web PlanetHoster
                    Travaille ...
                    X