Fonctionnement interne de Drupal.

Information importante

En raison d'un grand nombre d'inscriptions de spammers sur notre site, polluant sans relache notre forum, nous suspendons la création de compte via le formulaire de "sign up".

Il est néanmoins toujours possible de devenir adhérent•e en faisant la demande sur cette page, rubrique "Inscription" : https://www.drupal.fr/contact


De plus, le forum est désormais "interdit en écriture". Il n'est plus autorisé d'y écrire un sujet/billet/commentaire.

Pour contacter la communauté, merci de rejoindre le slack "drupalfrance".

Si vous voulez contacter le bureau de l'association, utilisez le formulaire disponible ici, ou envoyez-nous un DM sur twitter.

Bonjour,
Je cherche à savoir comment fonctionne Drupal. Je ne parle pas de son utilisation, mais plutôt de la communication entre ses différents composants.
Parexemple, comment fait il l'appel de ses modules, à l'aide de quels fichiers? Et ces fichiers comment communiquent ils entre eux?
Il est préférable d'avoir des informations en Français.
Je me perds actuellement dans différentes documentation en Anglais.
Merci d'avance.

Forum : 

Wow, c'est un peu vaste comme question... :)

Voici un premier élément de réponse : un des concepts clé de Drupal est le système de hooks. En gros, un hook est une fonction qui se trouve dans un module et qui respecte une certaine syntaxe. Ces 2 conditions étant remplies, le hook (la fonction) est appelé automatiquement par Drupal.

Prenons un exemple :

1) Tu crées un module personnalisé que tu appelles toto.module. Ce module est un fichier PHP que tu déposes dans le répertoire modules de ton site. Drupal le reconnaîtra automatiquement et tu pourras l'activer depuis admin > modules.

2) Dans le fichier toto.module, tu vas mettre des hooks, par exemple :

toto_menu() - permet d'ajouter des éléments au menu Drupal
toto_init() - permet d'exécuter des tâches d'initialisation
toto_form_alter() - permet de modifier un formulaire
...

La première fonction est une implémentation de hook_menu(), la 2e de hook_init(), la 3e de hook_form_alter()... Tous tes hooks commencent par "toto_" parce que ton module s'appelle "toto". La syntaxe à respecter pour chaque hook est décrite en détail sur http://api.drupal.org/.

3) Quand tu afficheras une page, les hooks de ton module seront exécutés aux moments opportuns (par exemple, hook_menu() sera exécuté au moment de la génération du menu). Bien entendu, tes hooks peuvent eux-même faire appel à d'autres fonctions de ton cru qui se trouveraient aussi dans ton module.

Est-ce que ça te paraît plus clair ?

En gros, quand Drupal va démarrer, il va rechercher toutes les fonctions portant le nom d'un module immédiatement suivi par _init. Il va exécuter chacune des fonctions qu'il va ainsi trouver.

Il en va de même pour _menu pour l'initialisation des menu, et _form_alter pour la modification de formulaire. Il s'agit d'une convention qui est la base de la modularité de Drupal.

Gazon
Merci beaucoup pour votre Réponse;
Mais je voudrais aller encore plus loin, si c'est possible.

Il s'agit d'une convention qui est la base de la modularité de Drupal.

C'est ce qui m'intrigue. ou réside, en fonction de code et fichiers, cette fonctionnalité de reconnaissance. plus clairement, comment se fait il que:
quand Drupal va démarrer, il va rechercher toutes les fonctions

C'est qui Gazon ? :-)

Une convention est une convention. C'est du même ordre de dire qu'une image JPEG est contenu dans un fichier qui porte l'extension .jpg.

Drupal fait un grand usage de la fonction module_invoke_all.

Par exemple : module_invoke_all('pmaction','getlist')

Mettons qu'on ait les modules taxonomy, cck et pathmenu.

module_invoke_all va chercher si un module ne définit pas le hook 'pmaction' (la liste des modules étant constituée lors des ajouts et suppressions de module depuis la page admin/module). Il va donc exécuter un function_exists de taxonomy_pmaction, cck_pmaction et pathmenu_pmaction (nom du module suivi de _pmaction). Dans ce cas, il se trouve que seul le module pathmenu définit une fonction pathmenu_pmaction. Les paramètres restant de module_invoke_all sont envoyés à pathmenu_pmaction.

Le noyau de Drupal est conçu de telle manière qu'il va chercher à déclencher différents hook à des moments clés de son fonctionnement. Chaque module peut également créer ses propres hooks afin que d'autres modules viennent étendre ses capacités (par exemple, il est possible d'ajouter de nouveaux types de champs dans CCK de cette façon).

Donc, pour récapépéter :

  • le noyau se charge,
  • il va charger en mémoire chaque module actif (fichiers .module) même si quelques-uns seulement seront utiles,
  • il va exécuter au fur et à mesure chaque hook.

Gazon

Merci beaucoup.
Ainsi, si j'ai bien compris, il charge les fonctions des modules et non les modules puis les fonctions.
Je veux dire, il ne se met pas dans le contexte d'un module pour executer ses fonctions, mais il cherche si la fonction existe dans les differents modules.
Est ce bien ça?
Et pour vous repndre a votre sourire, Gazon, cest quelqu'un qui pose beaucoup de question.. :D

Plus précisément, il effectue un include_once de chaque module actif. À ce stade, aucune fonction d'aucun module n'est exécutée. Les modules en eux-mêmes ne sont que des collections de fonctions PHP. Si tu cherches à exécuter un module PHP directement, ton navigateur te retournera une page blanche (ou le code source, tout dépend comment est configuré ton serveur Apache). Ainsi les fonctions se trouvent chargées en mémoire dans l'attente d'être activées par le système.

C'est un mode de fonctionnement plus proche de la programmation événementielle (comme quand tu développes une application client-serveur fenêtrée) que de la programmation procédurale (où le programme démarre d'un point A et finit son exécution à un point B). Tu vas donc placer ton code et la logique de ton application dans des fonctions et c'est le système qui va se charger de les appeler au bon moment.

C'est vrai que j'aurais pu être plus clair.

Un hook, c'est une fonction (PHP) qui doit respecter une certaine syntaxe, et qui de ce fait est exécutée automatiquement par Drupal.

Les hooks ont chacun un nom conceptuel qui permet de les identifier : hook_menu(), hook_init()... Mais dans la pratique, tu ne peux pas appeler tes hooks ainsi car il y aurait rapidement plusieurs fonctions qui portent le même nom (puisque chaque module est susceptible de contenir un hook_menu(), hook_init()...).

La règle est de remplacer "hook" par le nom de ton module : si ton module s'appelle "toto", les hooks qu'il contient s'appelleront toto_menu(), toto_init()... Ces fonctions sont des implémentations des hooks.

Voilà, j'espère que ça te paraît plus clair.

Gazon

Merci pour les réponses rapides.
Maintenant, je me suis penché sur la notion des noeuds. Comment se fait la construction. J'ai essayé de comprendre à partir d'un tutorial, mais j'ai trouvé, et avec toute franchise, très difficil.

En fait on parlait pas mal de 'moment opportun'. Prenons exemple sur le hook comment. Qui permet de notifier les autres modules des evenements liés aux commentaires (nouveau commentaire publié, modifié, supprimé etc...)

Le code est :

function comment_invoke_comment(&$comment, $op) {
  $return = array();
  foreach (module_implements('comment') as $name) {
    $function = $name .'_comment';
    $result = $function($comment, $op);
    if (isset($result) && is_array($result)) {
      $return = array_merge($return, $result);
    }
    else if (isset($result)) {
      $return[] = $result;
    }
  }
  return $return;
}

La en gros le module regard tous les autres modules qui ont implémenté le hook _comment et appelle la fonction NOM-DU-MODULE_comment....

A l'intérieur meme du module commentaire, à de nombreux endroit on fait appel à cette fonction en lui passant différents parametres :

// Allow modules to respond to the updating of a comment.
comment_invoke_comment($edit, 'update');

La lorsqu'un commentaire a été modifié....

// Tell the other modules a new comment has been submitted.
comment_invoke_comment($edit, 'insert');

La lorsqu'un commentaire vient d'etre crée.... etc...

Voila...
Maxime TOPOLOV / www.adyax.com