Une fois la première installation de base de Drupal complétée, je suis allé voir du côté de la configuration pour prendre connaissance des options offertes. Comme je n'ai pas d'expérience avec ce CMS, il existe un risque que je veuille modifier quelque chose et que ça tourne à la catastrophe, principalement si j'ai la mauvaise idée de le faire directement sur l'environnement de production. Dans ce cas, mieux vaut rendre le site temporairement indisponible en le mettant en maintenance.
Pour basculer en mode maintenance, il suffit de se connecter en administrateur à partir du bloc d'identification situé sur la page d'accueil, puis de se rendre par le menu d'administration à Configuration / Development / Maintenance Mode puis de cocher la case "Put site into maintenance mode" et de personnaliser le message qui apparaîtra sur le site jusqu'à ce qu'il redevienne disponible une fois les correctifs appliqués.
Pour tester, j'ai mis le site offline et je me suis déconnecté. Le problème, c'est qu'il n'y avait plus moyen de retourner au formulaire pour remettre le site online puisque le formulaire d'authentification avait disparu. Si j'avais lu le commentaire sous la case à cocher, j'aurais su qu'il est possible d'accéder directement à l'URL à locahost/code18/user durant la maintenance pour pouvoir se reconnecter en tant qu'administrateur pour changer la configuration à nouveau.
La partie technique qui intéressera les programmeurs
Entre temps, pour trouver le moyen de retirer la maintenance, j'ai fouillé sous le capot de Drupal, ce qui m'a permis de mieux comprendre une partie de son fonctionnement interne. Je soupçonnais fortement qu'un flag ou un champ booléen soit stocké dans la base de données et je devais simplement trouver où.
J'ai commencé par faire une recherche dans le code source pour le terme "maintenance" et j'ai revu le fonctionnement comme en reverse engineering :
- J'ai trouvé plusieurs instructions du type variable_set('maintenance_mode', TRUE), ce qui indique qu'on peut mettre le site en maintenance, par programmation.
- Sachant l'URL de la page de configuration (admin/config/development/maintenance), j'ai trouvé que la route qui mène à cette section est définie dans un array nommé $items situé dans le fichier system.module (situé dans modules/system à la racine de Drupal). Chaque définition de module est faite à l'aide d'un fichier .info situé dans le répertoire du module, auquel correspond un fichier .module qui contient l'implémentation en PHP.
- Lorsqu'on accède à cette URL, Drupal invoque la fonction system_site_maintenance_mode() qui se trouve dans system.admin.inc.
- La fonction system_site_maintenance_mode() utilise un array nommé $form pour définir par programmation les champs du formulaire à afficher, comme si on le faisait dans un contrôleur MVC.
- Dans ce formulaire, l'appel à variable_get('maintenance_mode', 0) sert à obtenir la valeur par défaut de la variable nommée maintenance_mode. Si elle n'existe pas, la valeur par défaut sera 0.
- variable_get() et variable_set() sont définies dans bootstrap.inc qui contient plusieurs fonctions utiles qui me font penser aux helpers dans Codeigniter.
- La fonction variable_set() utilise à l'interne db_merge() pour stocker dans la table "variable" les différentes clés/valeurs. Chaque fois que variable_set() est appelée, un appel interne à cache_clear_all() se fait pour réinitialiser la mémoire cache de Drupal. Lorsque j'examinais les options du menu Configuration, j'ai vu qu'il est possible de forcer cette manoeuvre par l'interface en cliquant sur le bouton "Clear all caches" situé sous Configuration / Development / Performance.
- Finalement, system_settings_form() appelle system_settings_form_submit() où s'opère l'enregistrement dans la base de données à l'aide de variable_set().
Dans le mode Grid View de Navicat pour MySQL, on peut voir que les valeurs de la table variable sont stockées en tant que type blob (binary large object). Il suffit de basculer en mode "Memo" pour faire apparaître la valeur : "i:1;", où 1 équivaut à une maintenance activée et 0 à un fonctionnement normal. Comme on l'a vu plus haut, si on change la valeur directement dans la base de données, il ne faut pas oublier de réinitialiser la cache pour simuler le mécanisme interne de variable_set() afin que le changement prenne effet. Allez-y par le bouton"Clear all caches" si c'est nécessaire.
Bonjour,
très bel article.