We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 5811
    • 1,717 Posts
    Juste pour infos, j’ai amendé l’article HowTo : Use AJAX with modxAPIen ajoutant "the lightweight solution" à la solution préconisée par Francisco de dospuntoscero.cl. L’article est anglais, si nécessaire je peux le traduire mais comme il y a surtout du code, je pense que ce n’est pas très utile.

    Merci de vos remarques pour l’amender si nécessaire. Si pb de compréhension ou interrogation "do not hesitate !!!"
      • 16732
      • 592 Posts
      Merci pour cette nouvelle solution pour utiliser AJAX avec MODx.

      J’ai juste une petite remarque : depuis la 096 on peut accéder directement à toute l’API en utilisant juste
        define('MODX_API_MODE', true);
        include('index.php');// avec le bon chemin vers index.php en fonction de la position du fichier appelant
      


      Il faut juste vérifier que le "exit" en toute dernière ligne de l’index.php est commenté ou supprimé wink
        • 5811
        • 1,717 Posts
        Oui mais en incluant le fichier index.php, tu retombes sur la solution "full MODx API" car l’inclusion de ce fichier (plutot que index-ajax.php) charge aussi l’appel de methode $modx->executeParser(); Qui est lui consommateur de temps. Pour plus d’infos voir les échanges avec SirLancelot et OpenGeek sur ce sujet. A priori je partage l’avis de SirLancelot, maintenant je n’ai pas explorer les "limites" de la solution. Je sais simplement que dans le cadre de la solution dite "légère" une fois la variable $modx initialisée et $modx->documentMap disponible, tu peux faire beaucoup de choses (en codant un peu) notamment utiliser la chunkie class (fait avec AnythingRating depuis le backend).
          • 16732
          • 592 Posts
          Je n’avais pas vu cette discussion forte intéressante
            • 867
            • 241 Posts
            Hello merci d’avoir signaler.
            Même si relativement assimilable, vu qu’il n’ya pas trop trop de codes, cela serait topissime d’avoir un tut avec quelques exemples d’usages smiley

            Quelqu’un en est capable et veut améliorer son karma ?!

            Merci d’avance smiley
              • 5811
              • 1,717 Posts
              Alchime, je n’ai pas beaucoup de temps pour écrire un tuto. Par contre si tu télécharges par exemple le snippet AnythingRating, je suis prêt à faire une explication détaillée sur ce post pour expliquer les quelques astuces et les points qui pourraient t’échapper.

              Dans le package AnythingRating, 2 pgm sont à regarder : la class anythingRating.php et le fichier JS : anythingRating.js.
              Tu les trouveras ici : http://modxcms.com/forums/index.php/topic,24771.msg155279.html#msg155279
                • 15001
                • 697 Posts
                Bonjour,

                Depuis plusieurs jours, je me bat avec un snippet utilisant Ajax et l’API de MODx (0.9.6.2) et qui fonctionne uniquement lorsque l’on est connecté au backend de MODx (depuis une autre fenêtre du même navigateur).

                Ce snippet fonctionne également en local (localhost), que l’on soit connecté au backend de MODx ou non.

                Sur le serveur distant, la page générée est identique que l’on soit connecté au backend ou non, y compris les appels de scripts situés dans l’en-tête.

                (...)

                Merci pour votre aide.
                  • 5811
                  • 1,717 Posts
                  Bonsoir Jul

                  Est ce que tu peux poster,
                  1/ le bout de code js qui appelle index-ajax.php
                  2/ le code php appelé (au moins la mise en place de l’API Modx).

                  Cela sera plus facile pour t’aider.
                    • 15001
                    • 697 Posts
                    Bonjour coroico,

                    Merci, de ta réponse. En fait, je n’appelle pas index-ajax.php (...). Je ne réalise pas non plus d’initialisation explicite de l’API MODx. (...)

                    En fait, lors des requêtes Ajax, les pages appellent un autre document MODx contenant un appel de snippet (TreasureChest). (...)
                      • 15001
                      • 697 Posts
                      Après un débogage intensif, le problème est mieux ciblé.

                      Ce qui échoue est provoqué par treasurechest.js qui initialise le système de panier:
                      $(document).ready(function () {
                          $.post(cart_doc, {
                              action: 'config'
                          },
                          // post-traitement ici
                          );
                         // autres actions d'initialisation
                      });


                      Comme on le voit, il s’agit d’une requête POST passée par Ajax au document "cart_doc" avec un paramètre "action".
                      "cart_doc" contient une chaîne de caractères du type "index.php?id=789" et indique quel document reçoit la requête Ajax.
                      Le document appelé par "cart_doc" contient lui-même un appel du service "panier" de TreasureChest, c.-à-d. [!TreasureChest? &service=`cart` (...) !]

                      Dans le snippet TreasureChest, on a ceci:
                       switch ($service)
                          {
                              case 'cart' :
                                  switch ($cart_action)
                                  {
                                      (...)
                                          
                                      case 'config':
                                          return json_encode($Cart->TreasureConfig());
                                          break;
                                       (...)
                                  }
                          }


                      Dans notre cas, on a bien affaire au service "cart" avec l’action "config".
                      La méthode TreasureConfig() est donc appelée et c’est là que ça coince.

                      Si l’on est connecté au gestionnaire de MODx avant de charger la page, TreasureConfig() fonctionne et retourne le contenu de la table modx_treasure_chest_config sous la forme d’un tableau de clés et valeurs qui peut alors être converti en une chaîne JSON de ce type:
                      {"business":"[email protected]","business_name":null,"currency_code":"CHF","sandbox":"","cart_id":"345","cart_add":"Au panier","cart_view":"Voir","cart_empty":"Vider","cart_warn":"Etes-vous certain de vouloir supprimer tous les produits de votre panier ?","class_add":"addToCart","class_empty":"emptyCart","pdt_token":"xadUEgde36Ddx","pdt_id":"567","cart_el":".treasure_cart","cart_remove_one":"-1","cart_control":".treasure_cart_controls","class_remove_one":"removeOne"}


                      Par contre, si la page est chargée alors que l’on n’est pas connecté "parallèlement" au gestionnaire de MODx, alors la méthode TreasureConfig() est incapable de lire la table modx_treasure_chest_config et alors pas de tableau!
                      Il s’ensuit que json_encode() ne peut faire son travail ce qui provoque une erreur du parseur MODx.

                      La méthode TreasureConfig() est également appelée par les inserts du snippet TreasureChest présents dans la page pour afficher le produit (service par défaut de TreasureChest) et elle fonctionne parfaitement, même lorsque déconnecté.

                      Voici cette méthode écrite par Scotty Delicious:
                      function TreasureConfig()
                      {
                      global $modx;

                      $config_table = $modx->getFullTableName(’treasure_chest_config’); // Retrieve the full table of general TreasureChest settings
                      $config = $modx->db->query("SELECT * FROM ".$config_table);

                      $config_array = array();
                      while ($row = $modx->db->getRow($config, ’assoc’))
                      {
                      // The table column for keys :
                      // some values of the "setting_name" column have a "store_" prefix. We remove it.
                      $key = str_replace(’store_’, ’’, $row[’setting_name’]);

                      // The table column for values: decode values.
                      $val = htmlspecialchars_decode($row[’setting_value’]);

                      // Sets the php "$config_array[]" associative array from the table.
                      $config_array[$key] = $val;
                      }

                      return $config_array; // Return the array.
                      }

                      C’est donc la requête ajax passée à un autre document (appelant le service "cart") qui échoue dans le cas où l’on est déconnecté du gestionnaire MODx. Il s’agit peut-être d’une restriction de sécurité pour l’extraction en base de données.
                      Je pense que lorsque l’on est connecté au gestionnaire, les données utilisateurs pour la connexion à la base de données sont trouvées et pas autrement. Je suppose que la prochaine étape est de s’intéresser à "manager\includes\extenders\dbapi.mysql.class.inc.php".