Scripts dans un fichier php

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

  • Scripts dans un fichier php

    Bonsoir,
    J'ai besoin de générer un PDF.

    J'utilise JSPDF, voici mon script, la partie englobée qui doit devenir le PDF et le bouton.

    J'utilise cela sur des PHP (normaux) et cela fonctionne.
    Là dans un PHP JOOMLA, il ne se passe rien.
    Peut-être que je ne charge pas mes js correctement (Il sont bien présents dans media/js)

    Quelqu'un aurait-il une idée du souci ?

    Cordialement.

    Eric

    Code PHP:
    <?php
    define
    ('_JEXEC'1); 
    define('JPATH_BASE''../../../../..');  
    require_once(
    JPATH_BASE.'/includes/defines.php'); 
    require_once(
    JPATH_BASE.'/includes/framework.php'); 
    $app JFactory::getApplication('site'); 
    $user JFactory::getUser();
    $userId $user->get('id');

    JHtml::addIncludePath(JPATH_COMPONENT '/helpers/html');
    JHtml::_('bootstrap.tooltip');
    JHtml::_('behavior.multiselect');
    JHtml::_('formbehavior.chosen''select');
    JHTML ::_('stylesheet','media/com_gesform/css/gesform.css');

    $filejs JURI::root().'media/com_gesform/js/jquery.min.js'/*ok*/
    $filejs2 JURI::root().'media/com_gesform/js/jspdf.min.js'/*Ok*/
    $filejs3 JURI::root().'media/com_gesform/js/pdf.js'/*ok*/
    $filejs4 JURI::root().'media/com_gesform/js/html2canvas.min.js';/*ok*/

    $doc JFactory::getDocument(); 
    $doc->addScript($filejs);
    $doc->addScript($filejs2); 
    $doc->addScript($filejs3); 
    $doc->addScript($filejs4); 

    if (
    $user->guest) {  
        die(
    'Acces interdit, vous devez être connecté pour accéder à cette page'); 
    }
    ?>


    <script type="text/javascript">

    function createpdf() {
    var canvasToImage = function(canvas){
            var img = new Image();
            var dataURL = canvas.toDataURL('image/png');
            img.src = dataURL;
            return img;
        };
        var a4  =[595.28,2000];
        var canvasShiftImage = function(oldCanvas,shiftAmt){
            shiftAmt = parseInt(shiftAmt) || 0;
            if(!shiftAmt){ return oldCanvas; }
            
            var newCanvas = document.createElement('canvas');
            newCanvas.height = oldCanvas.height - shiftAmt;
            newCanvas.width = oldCanvas.width;
            var ctx = newCanvas.getContext('2d');
            
            var img = canvasToImage(oldCanvas);
            ctx.drawImage(img,0, shiftAmt, img.width, img.height, 0, 0, img.width, img.height);
            
            return newCanvas;
        };
        
        /* **** */
            var canvasToImageSuccess = function(canvas){
            var pdf = new jsPDF('p','px','letter'),
                pdfInternals = pdf.internal,
                pdfPageSize = pdfInternals.pageSize,
                pdfScaleFactor = pdfInternals.scaleFactor,
                pdfPageWidth = pdfPageSize.width,
                pdfPageHeight = pdfPageSize.height,
                totalPdfHeight = 0,
                htmlPageHeight = canvas.height,
                htmlScaleFactor = canvas.width / (pdfPageWidth * pdfScaleFactor),
                safetyNet = 0;
            
            while(totalPdfHeight < htmlPageHeight && safetyNet < 15){
                var newCanvas = canvasShiftImage(canvas, totalPdfHeight);
                pdf.addImage(newCanvas, 'png',0, 0, pdfPageWidth, 0, null, 'NONE');
                
                totalPdfHeight += (pdfPageHeight * pdfScaleFactor * htmlScaleFactor );
                
                if(totalPdfHeight < htmlPageHeight){
                    pdf.addPage();
                }
                safetyNet++;
            }
            
            /* ***** */
            
             pdf.save('<?php echo 'Formation ';?> <?php echo $_GET['nom'];?> <?php echo $_GET['version'];?>.pdf');
            };
        
        html2canvas($('main')[0], {
            onrendered: function(canvas){
                canvasToImageSuccess(canvas);
            }
        });
    }

    </script>
    <main>
    <?php echo "test de génération d'un PDF"?>
    </main>

    <div class="btn btn-success btn-small">
        <a href="javascript:createpdf()">Créer PDF</a>
    </div>
    Dernière édition par Agrepe à 27/05/2017, 23h05

  • #2
    Re : Scripts dans un fichier php

    Bonjour Éric

    A la lecture de ton code, je vois quelques imperfections, voici quelques pistes d'amélioration :

    1. Comment ce code est-il exécuté ? Dans un article (au travers d'un appel à p.ex. sourcerer ?) ? Est-ce le contenu d'un composant ?
    Il me manque l'appel; depuis Joomla, à ce code...

    2. Si tu fais un appel "depuis Joomla", il n'est pas nécessaire de redéfinir les constantes _JEXEC, JPATH_BASE, ... ni d'inclure les librairies puisque Joomla le fait. Je comprends donc que tu es en dehors de Joomla.

    3. S'il s'agit d'un et d'un seul fichier, tu mixes donc du code php, du code javascript et du code html. Il est toujours préférable de créer des fichiers distincts pour ton javascript (un fichier .js) et ne pas le mettre en "inline". Pour le code html, idéalement, aussi, un fichier distinct. Si tu peux tendre vers cet objectif de développement : un type de langage (php, css, js, ...) = un fichier différent.

    4. Tu as une succession de "<?php echo 'Formation ';?> <?php echo $_GET['nom'];?> <?php echo $_GET['version'];?>", pourquoi pas un seul <?php echo 'Formation '.$_GET['nom'].' '.$_GET['version'];?> tout en sachant que c'est plutôt moyen parce que tu ne fais aucun contrôle de ce que contient $_GET. Imagine que le contenu de 'nom' est hacké et qu'il contient quelque chose comme "../../../../../boot.ini" (c'est juste un exemple); Tu aurais donc un fichier "Formation ../../../../../boot.ini. pdf" ce qui pourrait mettre un peu le bordel sur ton disque. Ou pire. Tu devrais contrôler ce que contient 'nom' et 'version'. Essaie aussi de ne pas utiliser $_GET ou $_POST en direct mais plutôt les fonctions natives à Joomla; qui contiennent déjà des mécanismes de sécurisation de la lecture.

    5. Idéalement : tu as une fonction "function createpdf()" et qui dit fonction dit valeur de retour; un return true; p.ex. pour indiquer que la fonction s'est bien déroulée.

    6. Si je clique sur le bouton "Créer PDF", on fait, je ne vois rien : tu n'affiches aucun retour, aucun "Le fichier a été crée"; tu n'affiches pas de div qui contiendrait un message de succès (ou d'échec). A l'usage, je pourrais donc cliquer une fois, dix fois, cent fois sur le bouton sans comprendre que le code javascript est appelé.

    7. Tu écris

    Code:
    $filejs = JURI::root().'media/com_gesform/js/jquery.min.js'; /*ok*/ 
    $filejs2 = JURI::root().'media/com_gesform/js/jspdf.min.js'; /*Ok*/
    $filejs3 = JURI::root().'media/com_gesform/js/pdf.js'; /*ok*/
    $filejs4 = JURI::root().'media/com_gesform/js/html2canvas.min.js';/*ok*/
    
    $doc = JFactory::getDocument();
    $doc->addScript($filejs);
    $doc->addScript($filejs2);
    $doc->addScript($filejs3);
    $doc->addScript($filejs4);


    ce qui alourdit inutilement le code, le code ci-dessous est plus logique et plus "to-the-point"

    Code:
    $doc = JFactory::getDocument(); 
    $doc->addScript(JURI::root().'media/com_gesform/js/jquery.min.js');
    $doc->addScript(JURI::root().'media/com_gesform/js/jspdf.min.js');
    $doc->addScript(JURI::root().'media/com_gesform/js/pdf.js');
    $doc->addScript(JURI::root().'media/com_gesform/js/html2canvas.min.js');
    (ps : es-tu sûr de devoir charger jquery qui le serait peut-être déjà par ton template (si ton code s'exécute bien "au travers" de Joomla et non en dehors)



    8. Sur le plan de la logique, il n'est pas cohérent de faire ces chargements pour faire un die().

    La partie ci-dessous devrait remonter plus haut dans ton code.

    Code:
    if ($user->guest) {
           die('Acces interdit, vous devez être connecté pour accéder à cette page');
    }


    Le mettre au plus haut càd dès la lecture de $user.

    Code:
    $user = JFactory::getUser();
    if ($user->guest) {
        die('Acces interdit, vous devez être connecté pour accéder à cette page');
    }
    Cela permettrait d'avoir un code plus optimisé, plus logique.



    9. $userId est non utilisé. Tu peux le supprimer

    10. (faut-il déclarer $app ? Tu ne l'utilises pas)

    11. Tu écris JHtml et aussi JHTML, il ne faudrait qu'une seule syntaxe.

    Je vois donc plusieurs endroits où tu pourrais optimiser ton code afin qu'il puisse fonctionner de manière plus correcte.

    Je t'invite aussi à déboguer ton code : affiches la console (touche F12) afin de voir si tu as une erreur javascript.
    Vérifie aussi l'onglet Réseau pour voir si toutes les ressources sont correctement chargées.

    Bonne nuit.
    Dernière édition par cavo789 à 28/05/2017, 11h01
    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


    • #3
      Re : Scripts dans un fichier php

      Bonsoir,
      Merci beaucoup pour ton aide et la richesse de ta réponse. vraiment merci beaucoup.

      J'appelle ce fichier par un clic sur un bouton dans un composant. (que j'ai créé) (www.visioformation.com)
      Mon composant permet de générer des fiches (Qui sont des fiches de formation), sur ma fiche un bouton permet de l'afficher individuellement dans une modal qui contient le bouton qui me permet d'enregistrer la fiche en PDF.
      • Un formulaire permet de renseigner la fiche.
      • Les fiches sont ensuite affichées par le composant.
      • Des boutons sur chacune des fiches permet des actions (Dont un qui s'appelle voir "Fiche PDF", qui à son tour contient le bouton pour générer le PDF qui s'enregistre sur le disque de l'utilisateur)



      Les GET proviennent de la fiche, je les envoie pour construire ensuite le PDF. (Clique sur un bouton que j'ai appelé "Enregistrer en PDF")

      Je vais apporter les corrections à mon fichier.

      J'utilise JSPDF dans des PHP (Dans un cadre différent) et cela fonctionne bien.
      j'essayais donc de le mettre en application dans le petit composant que je suis en train de développer.

      Bien cordialement.

      Eric

      Commentaire


      • #4
        Re : Scripts dans un fichier php

        J'ai inspecter et effectivement j'ai cette erreur:

        Uncaught ReferenceError: html2canvas is not defined
        at createpdf (<anonymous>:52:5)
        at <anonymous>:1:1

        Et visiblement il n'y a que jquery.min.js qui est chargé

        Que puis-je utiliser pour remplacer les GET et les POST ?

        Voici comment je passe mes infos d'un fichier à l'autre: (Par l'URL)

        Code HTML:
        <a href = "../components/com_gesform/views/formations/tmpl/fichephp.php?		
        		id=<?php echo $item->id;?>&
        		code=<?php echo $item->code;?>&
        		nom=<?php echo $item->nom;?>&
        		niveau=<?php echo $item->niveau;?>&
        		image=<?php echo $item->image;?>&
        		version=<?php echo $item->version;?>&
        		categorie=<?php echo $item->categorie;?>&
        		type=<?php echo $item->type;?>&
        		evaluation=<?php echo $item->evaluation;?>&
        		duree=<?php echo $item->duree;?>&
        		prerequis=<?php echo $item->pre_requis;?>&
        		description=<?php echo $item->description;?>&
        		objectif=<?php echo $item->objectif;?>&
        		moyens=<?php echo $item->moyens;?>&
        		competence=<?php echo $item->competence;?>"
        		class ="modal" rel = "{size: {x: 700, y: 500}}">
        		<button class="btn btn-success btn-small" id="pdf1"> Fiche PDF </button> </a>
        Là cela affiche la modal qui contient le bouton "Enregistrer en PDF"

        Cordialement.

        Eric
        Dernière édition par Agrepe à 28/05/2017, 18h40

        Commentaire


        • #5
          Re : Scripts dans un fichier php

          Salut

          Ton composant ne respecte pas la norme de codage de Joomla. Tout doute passe par ton contrôleur et ici ce n'est point le cas. Tu fais un appel direct à un script php ce qui, par principe, n'est pas correct.

          Ton script n'est pas un script Joomla aussi ton appel à jdoc ne semble pas fonctionner, ce qui me paraît logique d'où le non chargement des scripts vu la méthode addScript.

          Revoie ton manière d'appeler ton script ou charge les fichiers js non pas dans la modale mais directement dans ta vue.

          Pour ta question sur get pu post va voir jRequest qui est la bonne façon de lire, sous Joomla, des valeurs.



          (prends peut-être le temps de recoder ton extension et de respecter la norme MVC, cela rendra ton code plus robuste)

          Bonne soirée.
          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


          • #6
            Re : Scripts dans un fichier php

            Merci beaucoup pour ton aide.

            Dans le cas de mon fichier, la norme serait quoi ?

            Je n'ai pas compris la phrase : Tout doute passe par ton contrôleur et ici ce n'est point le cas

            Tu voulais écrire "Tout dois ..."

            Dans ce cas, comment je fais passer par mon contrôleur ?

            Bien cordialement.

            Eric

            Commentaire


            • #7
              Re : Scripts dans un fichier php

              Envoyé par Agrepe Voir le message
              Merci beaucoup pour ton aide.

              Dans le cas de mon fichier, la norme serait quoi ?

              Je n'ai pas compris la phrase : Tout doute passe par ton contrôleur et ici ce n'est point le cas

              Tu voulais écrire "Tout dois ..."

              Dans ce cas, comment je fais passer par mon contrôleur ?

              Bien cordialement.

              Eric
              salut, je croit que tu commet l'erreur de beaucoup de dev non joomla.
              Tu prends Joomla pour un cadre pour balancer tes scripts, qui ne sont pas les plus adaptés.

              Prend conscience que joomla est un framework avant d etre un CMS.
              Appuies toi reellement dessus, utilise les fonctions décrites dans l API, et tu verras que tu ecriras moins de lignes pour le même résultat....
              Quand au modele mvc et aux techniques de programmation d'un composant, regardes ici:

              Commentaire


              • #8
                Re : Scripts dans un fichier php

                Bonjour

                Envoyé par Agrepe Voir le message
                Dans le cas de mon fichier, la norme serait quoi ?
                La norme : lorsqu'on développe un composant Joomla, on devrait (=ce n'est pas une obligation mais c'est tellement mieux) respecter la norme MVC. lefab t'a communiqué un excellent lien pour cela.

                Envoyé par Agrepe Voir le message
                Je n'ai pas compris la phrase : Tout doute passe par ton contrôleur et ici ce n'est point le cas. Tu voulais écrire "Tout dois ..."
                Oui, désolé, satané correcteur sur smartphone. Tu as beau corriger la correction automatique, tu loupes encore des "corrections".

                Oui, "Tout doit", en effet.

                Sous Joomla, tu ne devrais avoir que *deux* (et pas un de plus) points d'entrée : /index.php et /administrator/index.php.
                Jamais (=en principe) un appel vers un autre script qu'un de ceux-là.

                En codant MVC (C=controlleur), toutes tâches exécutées par ton composant passe par le controlleur. Le fameux index.php?option=com_toncomposant&task=xxxx.

                Et là, dans ce cas précis, tu es "dans" Joomla : plus besoin de charger les librairies et toutes les actions comme jDoc->addScript() seront comme un poisson dans l'eau.

                Je rejoins lefab lorsqu'il mentionne que c'est une erreur classique (et que je comprends, Oh combien!) que de coder "comme avant" alors que non, il faudrait coder selon la norme de l'outil.

                Cela étant dit, tu pourrais continuer à utiliser ton script; une norme n'est pas une obligation; juste un excellent cadrage et une façon d'être assez rapidement fonctionnel et prêt aux futures versions de Joomla.

                Dans ton cas, de ce que j'ai compris, ton modal est donc un script tiers; tu pourrais écrire le modal immédiatement dans ta vue non ? Et juste l'afficher au clic sur un bouton...

                Dans ton cas, tu utilises jDoc->addScript() pour charger des scripts et Joomla le fait dans le tag <head> de ton rendu HTML or, dans ta page modale (ton script), tu n'as pas de <head>; selon moi, Joomla ne peut donc pas charger tes fichiers .js d'où ton erreur.

                Tu devrais, je pense, si tu veux rester dans ton schéma de programmation, charger les fichiers .js depuis la vue; pas depuis la fenêtre modale.

                Restera que tu auras toujours ici ou là des probables soucis d'intégration entre un script non Joomla et ton composant.

                Bonne 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


                • #9
                  Re : Scripts dans un fichier php

                  @cavo789: coder selon l'api joomla offres deux gros avantages par rapport aux scripts maisons:

                  1) au lieu d'ecrire 10 lignes de codes, tu en ecrit une ou deux.

                  2) tu gagnes aussi sur la maintenance de ton code car les fonctions sont mises à jour à chaque version du CMS.

                  Donc tu passes moins de temps à gérer les versions de ton code.
                  J'ai des custom code chronoforms qui tournent depuis 5 ans sans soucis majeurs....
                  J'ai fait 8 éditions du formulaire sur la période.....
                  heureusement que c'est pas avec mon code que je gagnes de l argent....

                  C'est la ou tu vois la vraie rentabilité de Joomla par rapport aux autres.....

                  Commentaire


                  • #10
                    Re : Scripts dans un fichier php

                    [ Clin d'oeil ] Mais faut pas essayer de me convaincre; je suis totalement d'accord avec toi; si si [ /Clin d'oeil ]
                    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


                    • #11
                      Re : Scripts dans un fichier php

                      c etait surtout un complément a ce que tu as deja dit.

                      Commentaire


                      • #12
                        Re : Scripts dans un fichier php

                        He he ... ça sent une ptite cession au prochain Jday ça !
                        genre ... "apprendre a se servir de l'API de Joomla!" ... sourire

                        Ce que je sais deja .. c'est qu'il faut éviter de balancer un script "tout fait" directement dans Joomla! sans vraiment comprendre le script
                        Dernière édition par manu93fr à 30/05/2017, 12h12
                        Ce forum, vous l'aimez ? il vous a sauvé la vie ? Vous y apprenez chaque jour ? Alors adhérez à l'AFUJ https://www.joomla.fr/association/adherer
                        Cette année, le JoomlaDay FR a lieu à Bruxelles, les 20 et 21 mai 2022, plus d'infos et inscriptions : www.joomladay.fr

                        Commentaire


                        • #13
                          Re : Scripts dans un fichier php

                          Voilà le genre de post très riche et bien trop rare, très formateur pour l'ensemble de la communauté qui souhaite développer, modifier, enrichir un composant sous Joomla. Bravo à Cavo et tous les autres intervenants pour la précision des réponses ...
                          Developper of JBreeding Manager: http://www.jbreeding.fr/
                          J-cook Referral : Service Générateur d'Extensions pour Joomla

                          Commentaire

                          Annonce

                          Réduire
                          Aucune annonce pour le moment.

                          Partenaire de l'association

                          Réduire

                          Hébergeur Web PlanetHoster
                          Travaille ...
                          X