Demander à Monsieur Joomla d'exécuter un code PHP avant qu'il ne supprime un composan

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

  • [RÉGLÉ] Demander à Monsieur Joomla d'exécuter un code PHP avant qu'il ne supprime un composan

    Bonjour

    Quelqu'un aurait-il une suggestion : est-il possible de demander à Joomla 1.5 d'exécuter un bout de code avant même qu'il ne commence à supprimer le composant ?

    L'objectif est le suivant : procéder à un contrôle et le cas échéant, afficher un popup informant l'utilisateur que supprimer le composant va aussi supprimer un certain nombre de fichiers php qu'il aurait créé manuellement ==> s'il veut les garder, il doit les sauver.

    A ma connaissance, le seul code de type uninstall que Joomla exécute est celui qu'on place dans la fonction com_uinstall et Joomla l'exécute après avoir tout supprimer.

    J'ai essayé ceci

    Code PHP:
    function com_uninstall() {
       echo 
    '<h1>PAS DE UNINSTALL!!!</h1>';    
       return 
    false;
    // function com_uninstall() 
    Je vois bien le message après la désinstallation et je vois bien que la désinstallation n'est pas OK (parce que j'ai fait un return false) mais trop tard, Joomla a déjà supprimé les fichiers.

    (Pour être complet : les fichiers que l'utilisateur aurait créé sont des fichiers PHP. je pourrais les placer dans le dossier des media et là, ils seront l'abri mais ce n'est pas logique vu qu'il ne s'agit en rien de media mais bien de code. Et ce serait même risqué sur le plan de la sécurité vu que /media est plutôt ouvert comme dossier)


    [EDIT]Selon cette doc (http://docs.joomla.org/API15:JInstal...nent/uninstall) cela ne serait pas possible, le composant com_install ne subordonne pas la suppression à un éventuel contrôle.

    Si quelqu'un a une idée amusante et fonctionnelle.... [/EDIT]
    Dernière édition par cavo789 à 12/04/2011, 15h28 Raison: Ajout lien vers l'API
    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)​

  • #2
    Re : Demander à Monsieur Joomla d'exécuter un code PHP avant qu'il ne supprime un com

    Bonjour,

    Je crois que j'ai une solution qui peut te plaire.
    J'ai un peu regardé ton lien et il apparaît que si un fichier de manifest xml existe alors le processus de désinstallation va d'abord exécuter ton fichier de désinstallation avant de supprimer des fichier.

    Il faut jouer à ce moment là sur les redirections.
    Il faut instancier un contrôleur et faire une redirection avec message d'erreur s'il vous plaît.

    Code PHP:
    <?php
    defined
    ('_JEXEC') or die ('No Access to this File');
    jimport('joomla.application.component.controler');
    function 
    com_uninstall() {
        
    $controller = new     JController();
        
    $controller->setRedirect(JRoute::_('/administrator/index.php?option=com_installer',false),'On a arreté la désinstallation','error');
        
    $controller->redirect();
    }
    Et le tour est joué!

    Damien
    www.Crac-Design.com

    Commentaire


    • #3
      Re : Demander à Monsieur Joomla d'exécuter un code PHP avant qu'il ne supprime un com

      Et ça marche ? Cela semble sacrément original (comprendre "imaginatif"). Chapeau bas !

      A relire ton premier paragraphe, je me demande même si un bête jexit() ne suffirait pas à vrai dire.

      Je teste demain.

      Merci
      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


      • #4
        Re : Demander à Monsieur Joomla d'exécuter un code PHP avant qu'il ne supprime un com

        Bien entendu ça marche...
        Un bout de code ne se poste pas à la légère

        Le jexit($msg) marche aussi mais alors c'est pas vraiment pas joli.
        C'est un peu comme:
        Code PHP:
        echo $msg;
        exit(
        0); 
        Bon dev.
        www.Crac-Design.com

        Commentaire


        • #5
          Re : Demander à Monsieur Joomla d'exécuter un code PHP avant qu'il ne supprime un com

          Envoyé par ZDamienZ Voir le message
          Un bout de code ne se poste pas à la légère
          Il m'arrive de poster du code sans le tester; "à la volée" (mais j'avertis mon lecteur dans ce cas).

          Merci pour cette lumineuse idée. Reste à voir comment je vais l'implémenter.

          L'idée est d'avertir mon utilisateur "Attention, vous avez modifié des fichiers PHP du composant AllEvents. En désinstallant le composant, Joomla va supprimer vos fichiers. Si c'est votre intention, cliquez sur Continuer sinon, annuler la désinstallation; faites p.e. un backup de vos fichiers et si nécessaire, relancez la désinstallation". Un truc du genre. Ma première idée serait un petit bout de code JS avec un confirm().

          La redirection a ceci de cavalier c'est que je stoppe l'action alors que, peut-être, mon utilisateur veut vraiment supprimer le composant. Dans ce cas, il faudrait qu'il puisse le faire sans devoir aller dans son FTP, supprimer les fichiers du dossier override.

          A creuser.

          Merci pour ton code.
          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 : Demander à Monsieur Joomla d'exécuter un code PHP avant qu'il ne supprime un com

            Ca c'est un sujet qui me branche bien.

            Une petite idée vite fait de bon matin, tu peux utiliser le morceau de code contenant la redirection pour rediriger l'utilisateur si il a modifié des fichiers sportingEvents vers la page de gestion des composants (de tête com_manager et la tâche manage) avec un message.
            Dans ce message tu insères un lien (balise a classique) pointant sur /administrator/index.php?option=com_manager&task=unsinstall&compo nent=com_sportingevents&confirm=1 (attention le lien est faux pour task et component, il faut regarder exactement le lien permettant une désinstallation).
            Dans ton uninstall.com_sportingevents.php tu vérifies alors que si tu as une variable $_GET['confirm']=1 alors l'administrateur a bien confirmé la désinstallation. Let's do it...

            A vérifier si tu peux intégrer un lien dans un message de redirection, je sais pas si il n'y a pas un htmlentities() qui traine avant.
            Plutôt que $_GET tu peux utiliser JRequest::getInt('confirm') peut-être un peu plus joli.
            Avec un peu de css tu peux même faire comme si ton lien était un joli bouton.

            A coder...
            www.Crac-Design.com

            Commentaire


            • #7
              Re : Demander à Monsieur Joomla d'exécuter un code PHP avant qu'il ne supprime un com

              Bonjour

              BRAVO, c'est une excellente solution que tu proposes-là.

              Ci-dessous le code que j'ai implémenté. Pour le réutiliser dans d'autres composants, il faudra l'adapter quelque peu.

              L'idée : la fonction $g_se_Files->hasBeenOverride() va retourner true dès lors que l'utilisateur a surchargé des fichiers de mon composant. Dans ce cas, je dois interdire à Joomla de supprimer le composant car sinon l'utilisateur non averti perds ses fichiers (et risque de m'insulter de tous les noms alors que je n'y suis pour rien du tout).

              Donc si hasBeenOverride retourne true, je vérifie le paramètre global CanDeleteOverrideFiles qui est par défaut à 0. Si 0, cela signifie que l'utilisateur n'est pas averti de la catastrophe en cours et est redirigé vers une vue de mon composant (&task=uninstalling). Par précaution, je passe le token.

              La tâche uninstalling a pour fonction d'afficher une vue avec un texte explicatif et une possibilité de mettre le paramètre CanDeleteOverrideFiles à true. Si c'est le choix de l'utilisateur, cela permet de relancer la désinstallation de AllEvents et de passer outre mon contrôle en lui donnant un "Je suis pleinement conscient de ce qui sera fait; je souhaite la suppression de mes fichiers."

              Code PHP:

              jimport
              ('joomla.application.component.controler');
              jimport('joomla.filesystem.file');

              function 
              com_uninstall() {

                 global 
              $g_se_Files;
                 global 
              $g_se_Settings;

                 
              $bContinue false;
                 
              $path=JPATH_SITE.DS.'components'.DS.'com_allevents'.DS;
                 
                 
              // Instanciation de deux classes PHP de AllEvents

                 
              if ($g_se_Files==null)    { require_once ($path.'class'.DS.'files.php');    $g_se_Files    =new AllEventsClassFiles();    }
                 if (
              $g_se_Settings==null) { require_once ($path.'class'.DS.'settings.php'); $g_se_Settings =new AllEventsClassSettings(); }
                 
                 
              // Avant de permettre à Joomla de désinstaller AllEvents, il faut vérifier
                 // si l'utilisateur n'a pas faire de l'override.  

                 
              if ($g_se_Files->hasBeenOverride()===true) {
                     
                       
              // Oui ==> est-ce qu'on peut supprimer les fichiers surchargés ?   
                       // Par défaut, non.   Toutefois si l'utilisateur a volontairement activé le paramètre l'autorisant, 
                       // la main est rendue à Joomla qui va supprimer les fichiers

                    
              if ($g_se_Settings->get('CanDeleteOverrideFiles',0)!=1) {
                        
                         
              // Si le code arrive ici, cela signifie que l'utilisateur a fait de l'override et qu'il n'a pas autorisé
                         // la suppression de ces fichiers ==> il est redirigé vers la vue Uninstalling de AllEvents qui lui explique
                         // qu'il serait bon de sauvegarder ses fichiers surchargés et, si tel est son choix, d'autoriser la suppression 
                         // (dans ce cas et seulement dans ce cas, le paramètre CanDeleteOverrideFiles du composant sera mis à 1).

                       
              $jUtil = new JUtility();
                       
              $token $jUtil->getToken();      
                       unset(
              $jUtil);

                       
              $controller = new JController();
                       
              $controller->setRedirect(JRoute::_(JURI::base().'index.php?option=com_allevents&task=uninstalling&'.$token.'=1',false), JText::_('Oups'),'warning');
                       
              $controller->redirect();

                       return 
              false;
                    }

                 } 
              // if ($g_se_Files->hasBeenOverride()===true)
                 
                 // Si le code arrive ici, la désinstallation de AllEvents peut se faire

                
              ...
                ...
                ...

                 echo 
              "Hope to see you again on our flights";

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

              Annonce

              Réduire
              Aucune annonce pour le moment.

              Partenaire de l'association

              Réduire

              Hébergeur Web PlanetHoster
              Travaille ...
              X