Corriger un bug et faire un patch pour la communauté avec Drupal 7 et 8.
Dans cet article je fais part d’un retour d’expérience qui pourrait intéresser les développeurs Drupal.
NB : Dans mon cas, j’ai installé le projet Drupal7 avec composer. Donc les méthodes employées ici ne concernent pas les autres types d’installation.
J’ai pour habitude d’utiliser bootstrap comme thème de base pour mes projets Drupal 7 et 8. Mais récemment j’ai constaté des erreurs de type warning: “Warning: count(): Parameter must be an array or an object that implements Countable in bootstrap_table()”. En pareille circonstance, il ne faudrait pas hacker le module contributeur. NON ! c’est une mauvaise pratique puisque le projet est installé avec composer. Trois possibilités s’offrent à vous :
- La première méthode consiste à faire une recherche sur Google avec le message d’erreur. Et trouver des propositions de solution.
- La seconde est de se rendre sur la page du module et de faire une recherche parmi les issues avec quelques mots du message d’erreur ou l’entièreté du message. Et trouver des propositions de solution.
- La dernière méthode consiste à faire un déboggage et apporter une solution si possible.
Comment corriger ?
Pour corriger un bug dans un projet Drupal installé avec composer, faudrait avoir installé les modules via composer. L’application du patch se fait dans le fichier composer.json. C’est l’idéal sinon le tripatouillage du module finira par être perdu en cas de mise à jour du module.
Supposons que vous ayez trouvé un patch correctif en ligne, l’application du patch se fait de la manière suivante :
Dans la clé “extra”, il y a une clé “patches”. Au sein de cette dernière, ajoutez une clé suivant ce pattern ci-dessous:
"drupal/nom_du_module": {
"<informations sur le patch>": "<chemin vers le patch>"
}Si vous ne voyez pas les clés « extra » et « patches », veuillez exécuter cette commande :
composer require cweagans/composer-patches
puis ajouter ces lignes au fichier composer.json
"extra": {
"enable-patching": true,
"patches": {
"drupal/nom_du_module": {
"<informations sur le patch>": "<chemin vers le patch>"
}
}
}Cas concret
Dans l’usage de bootstrap theme j’ai rencontré des erreurs de type warning “Warning: count(): Parameter must be an array or an object that implements Countable in bootstrap_table()”.
Après déboggage, le code qui provoquait cette erreur était dans le fichier templates/system/table.func.php situé dans le theme bootstrap. Après avoir appliqué les corrections dans ce fichier. Le problème était résolu. Mais comme j’avais hacké le thème, cette correction ne serait pas pérenne. Elle allait disparaitre après une mise à jour du module. En outre le repertoire des themes et modules contributeurs est ignoré par git, pour ceux qui utilise git. Il fallait donc créer un patch.
Pour ce faire j’ai fait un clone du projet https://git.drupalcode.org/project/bootstrap, qui est le dépôt officiel du thème bootstrap. J’ai repris les actions que j’avais menées dans le fichier templates/system/table.func.php, dans le projet bootstrap que j’ai cloné. Ensuite j’ai exécuté cette commande
git diff > patch_bootstrap.patchCette commande permet d’afficher la différence des lignes de code entre l’état du fichier au dernier commit et l’état actuel puis génère cette différence dans un fichier patch_bootstrap.patch. En outre j’ai retiré toutes mes actions de hack menées dans mon projet Drupal7 sur le fichier templates/system/table.func.php.
Puis j’ai testé le patch en local et je l’ai publié en ligne en me rendant à l’adresse de l’issue qui a été créée à cet effet. Ainsi les autres développeurs pourront utiliser le patch en l’appelant comme je l’ai fait ci-dessous. Regardez la clé drupal/bootstrap:
"extra": {
"installer-paths": {
"web/": ["type:drupal-core"],
"web/profiles/{$name}/": ["type:drupal-profile"],
"web/sites/all/drush/{$name}/": ["type:drupal-drush"],
"web/sites/all/libraries/{$name}/": ["type:drupal-library"],
"web/sites/all/modules/contrib/{$name}/": ["type:drupal-module"],
"web/sites/all/themes/contrib/{$name}/": ["type:drupal-theme"]
},
"patches": {
"cweagans/composer-patches": {
"Call the preserve paths hooks" : "https://github.com/SebCorbin/composer-patches/commit/1cb9bacba51f8bba0c5f3f322c3bb61e4ceae974.patch"
},
"drupal/bootstrap": {
"PHP 7.2.x compatibility - in the table template" : "https://www.drupal.org/files/issues/2019-10-19/php72-countable-warning.patch"
}
},
"preserve-paths": [
"web/sites"
]
},Le patch est accessible ici https://www.drupal.org/project/bootstrap/issues/2999011
Récapitulatif par une illustration

C’est le même procédé que Drupal 8. Merci de m’avoir lu. N’hésitez pas à m’écrire si vous avez besoin d’amples explications goure2@gmail.com
