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)
        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)
        Développeur de marknotes, logiciel de gestion de prises de notes avec interface web et de multiples convertisseur https://github.com/cavo789/marknotes
        Mes logiciels OpenSource : https://www.avonture.be

        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é !
            http://api.joomla.fr/joomla25/d2/d7a...c36b18de3b88a9

            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)
                  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)
                  Développeur de marknotes, logiciel de gestion de prises de notes avec interface web et de multiples convertisseur https://github.com/cavo789/marknotes
                  Mes logiciels OpenSource : https://www.avonture.be

                  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
                    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

                    Partenaire de l'association

                    Réduire

                    Hébergeur Web PlanetHoster
                    Travaille ...
                    X