We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 15086
    • 13 Posts
    Bonjour à tous,
    Je suis actuellement en train de créer quelques snippets sous MODx (des codes que j’avais d’abord créés "en dur", mais j’ai ensuite décidé de migrer sous MODx) et je rencontre des problèmes pour récupérer des variables de session...
    En fait je m’explique : le site en question va (entre autres) servir de portail vers un "sous-site" qui n’est pas géré par MODx et qui utilise les sessions. Par contre j’aimerais avoir un retour de l’état de ma session dans ce "sous-site" lorsque je suis sur le site MODx.
    Problème: le code suivant ne semble pas fonctionner (tel quel)...
    <?php if ( isset($_SESSION["auth_user"]) and isset($_SESSION["login"]) ) return "<br /><span id=\"sessionGMSouverte\">ta session de GMS est ouverte</span>"; ?>
    J’ai bien essayé
    <?php startCMSSession(); ?>
    mais ça n’y change rien. J’ai donc affiché toutes les variables de session avec
    <?php foreach ($_SESSION as $cle => $val) { echo $cle." | ".$val."<br />"; } ?>
    mais mes variables de "sous-site" n’apparaissent pas.
    Pourtant (!) lorsque ma session de "sous-site" est ouverte et que je retourne sur le site MODx, je peux ensuite directement retourner à mon sous-site sans me logger (les variables de session ne sont donc pas détruites).

    Peut-être bien que le stockage des deux sessions différentes ne s’effectue pas au même endroit, mais dans ce cas comment faire pour récupérer mes variables sans perturber le fonctionnement global ?
    Merci d’avance à tous wink
      • 15086
      • 13 Posts
      [EDIT] Après avoir posté trop vite (et avec un code qui ne marchait que partiellement), j’ai pris un peu plus de temps pour réfléchir et j’ai enfin une solution qui marche (enfin on dirait smiley )[/EDIT]

      Bonsoir,

      M’étant un peu acharné sur le sujet, et après avoir parcouru un peu la doc sur les sessions et un bouquin sur PHP, j’ai vérifié ce que je disais sur un potentiel enregistrement des fichiers de session dans un dossier différent avec
      <?php echo session_save_path(); ?>
      => erreur de ma part, MODx ne modifie pas le chemin d’enregistrement des fichiers de session.
      J’ai alors cherché d’autres éléments qui pourraient être différents à partir du code du fichier config.inc.php, et la fonction session_name() (que je ne connaissais pas auparavant) m’a interpellé. Je fais alors un test avec
      <?php echo session_name(); ?>
      qui me confirme que les noms de session utilisés sont différents et que je n’ai alors pas accès à mes variables de session à travers la session courante de MODx.
      NB: pour changer de nom de session en cours, il faut d’abord fermer la session courante, changer le nom de session à utiliser, et relancer une session.

      Après avoir testé plusieurs pistes avec des session_destroy() (qui supprime totalement les variables de session et la rend irrécupérable), j’ai implémenté quelque chose de plus sage et plus réaliste :
      <?php
      $nomSessionExterne = "PHPSESSID"; // nom de la session a atteindre (PHPSESSID est le nom par defaut habituel)
      
      // enregistrement de la session MODx, puis changement de session vers la session externe
      if (session_name() != $nomSessionExterne) { // changement de session seulement si necessaire
        session_write_close(); // fermeture de la session courante
        $tmpSessName = session_name($nomSessionExterne); // retour a la session "externe"
        if (isset($_COOKIE[session_name()])) { // la session externe est potentiellement ouverte
          $tmpSessID = session_id($_COOKIE[session_name()]); // re-affectation de l'ID en consequence (IMPORTANT! c'est ce qui manquait a mon premier jais...)
          session_start(); // restauration de la session externe
        }
        else { session_name($tmpSessName); } // si la session n'existe pas, on revient au nom precedent par securite
      }
      
      // traitements et operations avec les variables a faire ici
      
      // arret de session externe, retour a la session MODx (= operation inverse)
      if (isset($tmpSessID)) {
        session_write_close(); // fermeture
        session_name($tmpSessName); // changement de nom
        session_id($tmpSessID); // retour a l'ID d'origine
        session_start(); // restauration
      }
      ?>


      Je crois donc que je peux considérer mon problème comme résolu, et j’espère que ça pourra servir à d’autres développeurs qui seraient confrontés à ce genre de problème (qui j’imagine est assez peu courant smiley , tout le monde ne travaillant pas avec plusieurs sessions différentes !)