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