DRUPAL. Réalisez des développements professionnels avec PHP. Résumé. David OLMETA Rémi BENOIT. ENI Editions - All rigths reserved - Moha Anisa

Dimension: px
Commencer à balayer dès la page:

Download "DRUPAL. Réalisez des développements professionnels avec PHP. Résumé. David OLMETA Rémi BENOIT. ENI Editions - All rigths reserved - Moha Anisa"

Transcription

1 DRUPAL Réalisez des développements professionnels avec PHP David OLMETA Rémi BENOIT Résumé Ce livre sur le développement lié à Drupal présente les grands concepts du CMS Drupal et décrit comment le faire évoluer en installant de nouveaux modules mais aussi en développant des modules personnalisés. Il s adresse à un public de développeurs PHP mais aussi d intégrateurs ou de webmasters Drupal. Dans un premier temps, les auteurs expliquent le principe des CMS (Content Management System), leur utilité et les avantages à choisir et utiliser Drupal. Ils décrivent également son installation pas à pas ainsi que l'environnement de développement (WAMP, Netbeans). Après avoir détaillé l'architecture de la plate-forme et expliqué le mode de fonctionnement de ses différentes parties (les types de contenu, la recherche et l'indexation, les régions et les blocs, etc.), ce livre explique l'utilisation des éléments fondamentaux qui la composent (les nœuds, les vocabulaires, les termes, etc.). Ensuite, les auteurs expliquent comment étendre Drupal en installant et en activant de nouveaux modules (modules standards et modules additionnels). Les modules additionnels principaux sont présentés : CCK (Content Construction Kit), Views etimagecache. Ce livre traite ensuite du développement de modules (en PHP), en expliquant notamment l'utilisation des hooks, ainsi que le mode de fonctionnement des formulaires et ses types de composants. Drupal est fourni avec un ensemble de fonctions pratiques, telles que les fonctions de la couche d'abstraction de données. Ces fonctions sont décrites dans une partie spécifique avec des exemples pour chacune. Une partie de ce livre est également dédiée à l'utilisation et la création d'un thème, en expliquant au passage les différents hooks de thème (les fonctions de preprocessing). Les mécanismes de Drupal permettant de sécuriser les données sont présentés dans un chapitre spécifique. Une étude de cas permet de fixer toutes les notions vues tout au long du livre en réalisant un module de gestion de listes de courses (le code source de cette réalisation est en téléchargement sur le site Enfin, les auteurs présentent les astuces et bonnes pratiques, fruits de leur expérience, permettant de répondre à certaines problématiques récurrentes lors de la réalisation d'un site Drupal. Ils présentent par la même occasion la mise en place et l'utilisation de Subversion sur les projets Drupal. Les chapitres du livre : Avant-propos Introduction Drupal et son architecture Utiliser Drupal - Étendre Drupal - Développer un module Les fonctions pratiques de Drupal Créer un thème Sécuriser son site Étude de cas Les plus L'auteur Rémi BENOIT et David OLMETA sont tous les deux Consultants, Développeurs et Formateurs Drupal. Les deux auteurs possèdent une expérience significative sur les différentes phases de réalisation d'un projet autour de Drupal, de l'analyse des besoins à la mise en production. À ce titre, ils présentent au lecteur un livre réellement opérationnel sur le développement autour de ce CMS. Ce livre numérique a été conçu et est diffusé dans le respect des droits d auteur. Toutes les marques citées ont été déposées par leur éditeur respectif. La loi du 11 Mars 1957 n autorisant aux termes des alinéas 2 et 3 de l article 41, d une part, que les copies ou reproductions strictement réservées à l usage privé du copiste et non destinées à une utilisation collective, et, d autre part, que les analyses et les courtes citations dans un but d exemple et d illustration, toute représentation ou reproduction intégrale, ou partielle, faite sans le consentement de l auteur ou de ses ayants droit ou ayant cause, est illicite (alinéa 1er de l article 40). Cette représentation ou reproduction, par quelque procédé que ce soit, constituerait donc une contrefaçon sanctionnée par les articles 425 et suivants du Code Pénal. Copyright Editions ENI Ce livre numérique intègre plusieurs mesures de protection dont un marquage lié à votre identifiant visible sur les principales images

2 Avant propos Qui aurait pu imaginer que Drupal, ce moteur de gestion de contenu, a priori identique à tous les autres, deviendrait en quelques années la référence dans ce monde Open Source où chacun rivalise avec l autre pour proposer, promouvoir, développer son moteur, son outil, son logiciel et en faire un leader. Internet a ouvert à chacun la possibilité d écrire, de raconter, de discuter, d échanger et de commenter. Aujourd hui, ce sont des milliards de contenus qui sont proposés à tous et à tout instant. Hier, seuls quelques privilégiés pouvaient s enorgueillir d avoir publié un écrit. Aujourd hui, tout un chacun peut écrire un article, une histoire, son histoire. Si le support n est plus le même, l objectif reste inchangé : communiquer et transmettre. Ce formidable accès à l information, où chacun peut à la fois être lecteur et rédacteur, bouleverse les frontières et les avantages acquis, obligeant à la remise en cause, au renouvellement et à l évolution. Il faut alors se poser cette question : pourquoi Drupal est il aujourd hui majoritairement utilisé en France et dans le monde par les éditeurs de presse et les diffuseurs de contenus? Leur métier étant de diffuser de l information rapidement à leurs lecteurs, ils ont besoin aujourd hui des mêmes qualités de souplesse et d adaptabilité sur Internet que sur «le papier». Alors pourquoi des organismes gouvernementaux, des médias de télévision, des entreprises industrielles, ou des sites marchands font ils aussi confiance à Drupal? Drupal a une force extraordinaire : son extensibilité. Drupal, c est plus de 6000 modules gratuits qui couvrent un périmètre fonctionnel incroyable. Drupal, c est une architecture ouverte, une API qui permet réaliser ses propres modules. Drupal rassemble aussi une communauté d un demi million de membres et des références qui se comptent par centaines de milliers. La seule question qui reste encore aujourd hui en suspens avec Drupal n est pas de savoir s il est le moteur de gestion de contenu d aujourd hui et de demain, mais bien de savoir jusqu où Drupal sera capable de s adapter pour répondre aux besoins de demain. Voilà son futur challenge. Vous qui connaissez Drupal, ou qui allez le découvrir à travers ce livre, vous allez prendre conscience que Drupal s adaptera à votre besoin et qu il vous accompagnera au gré de votre apprentissage et de votre niveau technique, que ce soit pour réaliser un site vitrine, un blog, un forum, un site marchand, un réseau social, une vidéothèque, une audiothèque, un intranet, un extranet, une gestion documentaire et bien plus encore. Au delà des principaux concepts, vous découvrirez dans ces pages les clés pour utiliser puis étendre Drupal avec les modules existants, et développer ensuite de nouveaux modules. Après un chapitre sur la sécurité, une étude de cas complète vous permettra de mettre en valeur ce que vous aurez appris grâce à ce livre. Enfin, vous trouverez une foire aux questions et quelques astuces bien utiles pour paramétrer Drupal. Cet ouvrage, qui se veut pédagogique et accessible à tous, a été rédigé par David Olmeta et Rémi Benoît, deux passionnés, convaincus de la force de Drupal et qui, chaque jour conseillent, forment et développent sous Drupal. Je vous propose de les retrouver sur le site où vous pourrez échanger, poser vos questions, lire les dernières actus Drupal, pour aller plus loin ensemble. Bonne lecture à vous. Olivier Passerard Groupe Addvista Spécialiste Drupal - 1 -

3 Les systèmes de gestion de contenu CMS est un acronyme anglais pour Content Management System, traduit par système de gestion de contenu. Ces systèmes sont des outils permettant la création et la mise à jour simplifiée et dynamique de sites Web. La plupart de ces outils partagent des fonctionnalités de base communes. Plusieurs utilisateurs peuvent travailler en même temps. Il existe un flux de travail (workflow). La forme et le contenu sont séparés. Certains de ces systèmes proposent également la gestion des versions. C est le cas de Drupal. La séparation de la forme et du contenu est un des concepts de base des CMS. Le contenu est la plupart du temps stocké dans un système de gestion de base de données. Des gabarits (ou templates) gèrent ensuite la mise en page des contenus. Ces systèmes permettent donc de créer rapidement des sites web éditoriaux mais également de commerce électronique ou possédant d autres fonctionnalités avancées

4 Les avantages de Drupal Drupal est un outil Open Source développé en PHP. Cela lui permet d être installé sur presque tous les systèmes d exploitation disposant d un serveur Web pouvant exécuter du PHP. Il dispose également d une couche d abstraction de données permettant la connexion simplifiée à des serveurs de gestion de base de données tels que MySQL ou PostgreSQL (le support de SQL Server et d Oracle s améliore de jour en jour). Cette couche permet la gestion des requêtes SQL pour qu elles soient sécurisées et fonctionnelles quel que soit le système de gestion de base de données. La simplicité de mise en place d un site avec Drupal est son principal atout. On peut en quelques minutes déployer un site complet comprenant des flux rss, de multiples utilisateurs, un flux d actualités, des tags pour catégoriser les contenus, etc. La communauté, très active, apporte un soutien non négligeable à ceux qui souhaiteraient s aventurer un peu plus loin. Il est effectivement possible de trouver toutes sortes de thèmes ou de modules supplémentaires pour simplifier la gestion des images, des vidéos ou encore améliorer la gestion du workflow. Mais Drupal est un peu plus qu un simple CMS. Il propose également aux développeurs un framework (cadre de travail) complet et très bien documenté pour étendre les fonctionnalités d un site (toute la documentation est disponible en anglais à l adresse

5 - 2 -

6 Le fonctionnement de Drupal Drupal est avant tout composé d un cœ ur (core) minimaliste. Ce cœ ur fournit toutes les fonctionnalités de base. Ces fonctions permettront à toutes les autres parties du système de venir se greffer dessus. Ce cœ ur inclut le code qui permettra au système de s initialiser et de recevoir l ensemble des requêtes destinées à construire l ensemble des éléments de la page demandée. On appelle cela le bootstrap. Cette initialisation fera appel aux modules fournissant les fonctionnalités de base comme la gestion des utilisateurs, les modèles de pages (templates), etc. Une fois démarré, il ne nous reste plus qu à mettre en place notre site. L interface d administration est étroitement liée au reste du site. Elle utilise par défaut le même thème que le site. L administrateur, défini par l identifiant numéro 1 (on parle aussi de l "uid" 1) est le superutilisateur ayant un accès total sur le site. Il dispose notamment des droits de gestion du site et a la possibilité de visualiser des contenus non publiés. Quand vous vous connectez avec cet utilisateur, un lien d administration apparaît dans le menu Navigation. Un clic sur ce lien permet d accéder à l interface d administration du site Drupal. - 1-

7 L extrême modularité de Drupal permet d étendre ses fonctionnalités quasiment à l infini. Ces modules peuvent être activés ou désactivés à tout moment (certains cependant ne peuvent jamais l être). La communauté fournit à l heure actuelle plus de 6000 modules. Et ce livre va vous apprendre à en développer vous même pour répondre à des problématiques précises auxquelles les utilisateurs membres de la communauté n auraient pas forcément répondu. Vous pouvez donc faire fonctionner un site juste en déployant une version de Drupal standard mais également y ajouter une foule d extensions pour répondre à l ensemble de vos besoins. Les modèles de conception (aussi appelés Design Pattern) sont des solutions à des problématiques de conception récurrentes. Il en existe un grand nombre qu il est possible d utiliser dans la plupart des projets informatiques. Drupal utilise le design pattern inversion de contrôle qui permet au framework de faire appel aux fonctionnalités modulaires en temps voulu. Ce concept de fonctionnement s appelle un hook (nous reviendrons dessus dans le chapitre Développer un module). Ces hooks permettent simplement de greffer un module sur des fonctionnalités de base (par exemple : on souhaite enregistrer des informations supplémentaires sur un utilisateur dans une table spécifique pour cela on utilisera le hook hook_user()). La gestion du rendu visuel des contenus s effectue dans Drupal à l aide d un moteur de templates. Celui utilisé par défaut s appelle PHPTemplate mais n importe quel moteur peut être utilisé s il est installé dans le dossier themes/engine de votre installation Drupal. Avec ces moteurs de templates, Drupal permet simplement de modifier le rendu visuel d une page. Dans un premier temps, il est possible de modifier les fichiers CSS pour personnaliser l affichage, ou bien de modifier les fichiers de template eux mêmes qui ne sont que des fichiers HTML et PHP (ils portent l extension.tpl.php par défaut). Dans un second temps, il est possible, en déclarant des fonctions appropriées, de se substituer aux fonctions standard et de permettre une modification plus avancée des pages. Drupal utilisera alors ces fonctions plutôt que les siennes. Dans Drupal tout repose sur le concept de nœud (node) que l on peut facilement assimiler à un type de contenu. Un article est un type de contenu, une page est un autre type de contenu. La différence entre ces deux types est qu un article est voué par exemple à apparaître en home page dans un flux d actualités et qu une page peut être assimilée à un contenu statique dont la vocation n est pas de changer régulièrement. Les options de base dans Drupal permettent de différencier ces contenus facilement (affichage de l auteur et de la date de publication pour les articles). Pour aller plus loin, il est possible d utiliser la taxonomie qui permet de gérer la catégorisation des contenus. Cette fonction permet de définir des vocabulaires dans lesquels sont stockés des mots clés. Par exemple si l on souhaite catégoriser des articles on pourra définir un vocabulaire par thème dans lequel on mettra tous les termes associés à la catégorisation du site (actu, économie, sport...). Ensuite les articles pourront être marqués avec un ou plusieurs de ces - 2 -

8 mots clés

9 L environnement de développement Que vous utilisiez un environnement Windows, Linux ou Mac OS X, il est un trio dont on ne peut se passer : Apache, PHP, MySQL. Pour développer sur Drupal, il faut donc avant tout un serveur Web capable de faire fonctionner PHP. La couche d abstraction existante dans Drupal permet de le faire fonctionner avec PostgreSQL ou MySQL. L histoire de PHP veut que l on utilise MySQL. Il est également important de noter que certains modules ont été développés sans tenir compte de cette couche d abstraction et ne sont donc fonctionnels qu avec MySQL. Pour répondre à ces besoins, il existe des solutions tout en un sur chacune des plates formes citées : WAMP pour un environnement Windows (http://www.wampserver.com/) MAMP pour un environnement Mac OS X (http://www.mamp.info) XAMPP pour un environnement Linux (http://sourceforge.net/projects/xampp/) XAMPP est multiplate forme et peut donc également être utilisée dans un environnement Windows ou Mac OS X. Par exemple, une fois l outil WAMP installé, un accès à la page permet d obtenir la page suivante : Concernant l environnement de développement en lui même, chaque développeur possède ses habitudes. Cependant pour travailler facilement et simplement, rien ne vaut un bon EDI (Environnement de Développement Intégré) ou IDE (Integrated Development Environment en anglais). Netbeans (http://netbeans.org/) est un outil parfaitement adapté pour ce type de développement. Cet outil est Open Source, multiplate forme, extensible et gratuit. Les fonctionnalités de base dans un outil comme celui ci sont présentes : complétion de code, coloration syntaxique et sémantique, documentation dynamique, intégration d un debugger. La version qui supporte PHP supporte le framework Symfony, PHPUnit pour les tests unitaires, la version 5.3 de PHP et bien d autres choses. Au moment de l écriture de ces lignes, la version 6.9 est sur le point de sortir et apporte son lot de nouveautés comme le support du framework Zend par exemple

10 Cet outil permet de gérer des projets. Ceci implique de faire plus que de simplement lister les fichiers associés à un site Drupal. En effet, Netbeans est capable de lister l ensemble des fonctions d un fichier PHP ou bien tous les éléments d une classe CSS

11 Il est très simple de créer un projet dans Netbeans. La première étape consiste à cliquer sur Nouveau Projet dans le menu Fichier. Cette action affichera une fenêtre nous permettant de choisir le type de projet que l on souhaite créer

12 En général dans un projet Drupal nous disposons déjà de code source PHP. Il faut donc choisir la ligne PHP Application with Existing Sources. L étape suivante demandera l emplacement des sources existantes. Dans cette fenêtre, on saisit le chemin de notre projet, le nom qui sera affiché dans le gestionnaire de projet de Netbeans. Le choix est laissé de la version de PHP supportée. Ceci est très utile dans la mesure où l autocomplétion proposée par l outil est dépendante de la version de PHP. Enfin l encodage par défaut est UTF 8 et il est recommandé de ne pas toucher à ce paramétrage notamment concernant le développement d applications Drupal. La dernière étape de cette création de projet permet de spécifier à Netbeans la façon dont il pourra déployer le projet. Soit en lançant le serveur local, soit en copiant les fichiers via FTP, etc

13 - 5 -

14 L installation de Drupal L installation de Drupal se fait en quelques étapes. La première de ces étapes est le téléchargement de la dernière version de Drupal sur le site drupal.org (version 6.17 à l heure de l écriture de ce livre). Le fichier ainsi téléchargé est au format tar.gz qui est un format de compression. Pour l installer, il suffit de décompresser son contenu dans le dossier ad hoc de votre environnement de développement. Par exemple, sous la plate forme WAMP (plate forme utilisée dans ce livre), le répertoire par défaut sous Windows contenant l ensemble des sites web est le répertoire "C:/wamp/www". Le dossier qui est décompressé porte le nom de la version courante, il est tout à fait possible de le renommer pour lui donner le nom d un projet. Une fois que ce fichier a été décompressé, il faut y ajouter la traduction française. Celle ci est disponible sur le site officiel et accessible grâce au lien Translations sur la page d accueil. Les traductions sont des fichiers.po et après la décompression il suffit de copier l ensemble des fichiers et dossiers dans votre dossier Drupal

15 Sous Mac OS X, la copie d un dossier dans le finder écrase le contenu complet du dossier et pas seulement les fichiers qui diffèrent du dossier cible. L astuce consiste à passer par la ligne de commande pour réaliser la copie. Dès que les fichiers sont copiés, il est possible d accéder au processus d installation via le navigateur (http://localhost/drupal 6.17). Le processus d installation est très simple et complètement détaillé. La première étape consiste à choisir la langue d installation. Toutes les traductions copiées dans le dossier de Drupal sont prises en compte à ce moment là. Après ce choix des langues, l écran suivant nous avertit qu il faut effectuer la création du fichier de configuration. Cette création se fait très simplement en copiant le fichier qui se trouve dans le dossier sites/default et qui se nomme default.settings.php. La copie doit porter le nom settings.php : - 2 -

16 Après avoir copié et renommé le fichier de configuration, il faut cliquer sur le lien recommencez en bas de la page. La page suivante dans ce processus propose la configuration de la base de données qui va être associée à notre site Drupal. L installeur demande le nom de la base de données, le nom d utilisateur qui a les droits pour s y connecter ainsi que le mot de passe. Il y a également des options avancées qui autorisent la configuration du serveur qui héberge la base de données ainsi que la possibilité de préfixer les tables de notre installation pour éviter les confusions si plusieurs sites Drupal sont hébergés par le même serveur de base de données

17 La base de données dont on indique le nom lors de l installation doit être créée au préalable. Dès que tous les champs obligatoires sont remplis, il est possible de cliquer sur le bouton Sauvegarder et poursuivre. Le processus d installation crée les tables, importe les premières données dans ces tables notamment certaines traductions, la configuration de base des thèmes, etc. Dès que cette première phase de l installation est terminée, il reste la configuration de base à créer, en fournissant notamment l identifiant et l adresse e mail du superutilisateur, ainsi que le nom du site et l adresse principale de contact. Souvent, l identifiant du superutilisateur est un terme dérivé du mot "administrateur". Spécifier un terme différent permet d accroître la sécurité du site, la plupart des gens mal intentionnés essayent de se connecter avec des identifiants du type "admin" ou "administrateur"

18 Enfin il faut spécifier le fuseau horaire du site, régler la gestion de la réécriture d URL et des notifications de mise à jour

19 Pour que la réécriture d URL fonctionne, il faut configurer votre serveur Web pour activer cette possibilité. Dans un environnement WAMP, il suffit de cocher le module "mod_rewrite" dans le menu Modules Apache. Une fois toutes ces étapes passées, le site est installé et prêt à être utilisé

20 Les fichiers de langues, nécessaires à la traduction du cœur de Drupal, sont disponibles à l adresse suivante : À cette adresse se trouve l ensemble des fichiers.po disponibles pour toutes les versions de Drupal 6. Il suffit de télécharger le fichier correspondant à la version de Drupal 6 que l on souhaite installer. L installation de Drupal se déroule de la même façon mais se fait maintenant en anglais et la traduction se met en place une fois l installation terminée. Il suffit d activer le module Locale en cochant la case correspondante dans la gestion des modules. Puis de se rendre dans Site configuration et de cliquer sur Add language. Une fois la langue choisie dans le menu déroulant, il suffit de cliquer sur le bouton Add language et la langue est automatiquement importée des serveurs de Drupal. Après cette étape, les traductions sont importées mais le site est toujours en anglais. Pour activer le français par défaut, il faut se rendre sur la page listant les langues disponibles, pour y choisir la langue par défaut

21 - 8 -

22 Conclusion Ce chapitre a permis de comprendre l intérêt des systèmes de gestion de contenu en général et de Drupal en particulier. Il a permis de mieux comprendre comment mettre en place rapidement une première version de Drupal et comment la configurer. L environnement de développement est une chose essentielle et doit être mis en place pour pouvoir développer de nouveaux modules. Le chapitre suivant décrit plus en détail l architecture de Drupal et ses principaux concepts (les types de contenu, la taxonomie, etc.)

23 L arborescence des répertoires L arborescence de Drupal est beaucoup plus simple que celles que nous pouvons rencontrer avec d autres CMS. Elle se compose des répertoires principaux suivants : includes : contient tous les fichiers composant le cœur de Drupal. misc : contient tous les fichiers supplémentaires qu utilise Drupal pour construire ses pages, comme par exemple le fichier jquery.js de la bibliothèque AJAX JQuery. modules : contient les modules par défaut. sites : contient des répertoires spécifiques à chacun des sous sites, ainsi qu un répertoire, commun à l ensemble de ces sous sites. sites/all : correspond au répertoire commun de tous les sous sites de Drupal et contient toutes les informations relatives aux modules et aux thèmes disponibles. sites/all/modules : contient l ensemble des modules complémentaires devant être intégrés à la plate forme. sites/all/themes : contient l ensemble des thèmes complémentaires. sites/default : contient le fichier settings.php, fichier de configuration du site. sites/default/files : répertoire par défaut contenant tous les fichiers associés aux contenus. Ce répertoire peut être modifié dans la configuration du site. themes : contient les thèmes par défaut. Cette arborescence est illustrée ci dessous : Sans rentrer dans les détails pour le moment, on peut remarquer qu il n existe aucun fichier correspondant à des pages Web, mis à part certains fichiers nécessaires tels que les fichiers index.php et cron.php. C est l effet d un principe évoqué plus loin : toutes les pages sont générées dynamiquement par le système lors de leur affichage. Le fichier index.php permet de lancer tous les traitements

24 La création dynamique des pages Il n existe aucune page physique possédant du contenu : Drupal crée toutes les pages à la volée au moment de leur affichage. En effet, Drupal passe par un cycle de création des pages qui consiste à rapatrier toutes les informations nécessaires et à les compiler pour afficher la page. Le système réalise plusieurs accès à la base de données : au niveau du moteur, au niveau du module et aussi, au niveau du thème. Le schéma suivant décrit ce fonctionnement : - 1 -

25 Les structures de données : les types de contenu Drupal gère le stockage des informations dans des contenus (on appelle ces contenus des nœuds) qui respectent une modélisation particulière. Cette modélisation est définie par ce que l on appelle les types de contenu. Un type de contenu est similaire à une classe dans le monde orienté objet : il s agit d un élément permettant de définir la structure de données d un objet, en décrivant les informations (aussi appelées champs) qui seront stockées dans les nœuds en spécifiant pour chacune de ces informations le nom du champ et son type (texte, date, etc.). Par exemple, sur un site de presse, un type de contenu article peut être créé afin de permettre la saisie des articles. Chaque instance du type article (article1, article2 et article3) possède les attributs définis au sein du type de contenu : Au sein de la base de données, les types de contenu sont stockés dans la table node_type : Il est nécessaire de savoir où sont stockées les informations importantes pour trouver l origine d un problème. Les colonnes sont détaillées ci dessous : Nom de la colonne type name Description Le nom informatique du type. Ce nom ne doit pas contenir de caractères spéciaux ni d espaces. Le titre du type. Il s agit d un libellé, les caractères spéciaux et les espaces sont autorisés

26 module description help has_title title_label has_body body_label min_word_count Le nom du module à l origine du type. Par défaut, il s agit du module node. La description du type. Un texte d aide affiché en haut de la page de création d un nœud. Définit si un titre doit être saisi lors de la création d un nœud. Le libellé de la zone de saisie du titre lors de la création d un nœud. Définit si un corps doit être saisi lors de la création d un nœud. Le libellé de la zone de saisie du corps lors de la création d un nœud. Le nombre de mot minimum pour le corps. Drupal empêche l enregistrement de tout nœud qui ne comporte pas ce nombre minimum de mot. custom Définit si le type a été créé par un module (valeur 0) ou par un utilisateur (valeur 1). modified Définit si le type a été modifié par un administrateur. Le champ est à 1 si c est le cas, 0 sinon. locked orig_type Définit si l administrateur a le droit de changer le nom machine du type (valeur 0) ou non (valeur 1). Le nom d origine du type. Il peut être différent en fonction de la valeur de la colonne locked. Le champ custom n est plus utilisé par le système

27 Les contenus : les nœuds 1. Le principe des nœuds Les types de contenus ne serviraient à rien sans leurs instances. On appelle une instance d un type de contenu un nœud. Un nœud est un élément de Drupal permettant de stocker des informations correspondant à une même logique. Par exemple, un nœud peut stocker les informations relatives à un article tel que l auteur, la date, le titre, le chapeau, le contenu, une photo éventuelle. Un nœud représentant une photo pourra stocker la photo elle même, le nom du photographe, le copyright, le type de licence, etc. Ces différents champs que l on retrouve dans les nœuds sont définis par les types de contenu, d où l importance de la modélisation de départ : une fois que des nœuds ont été créés, on augmente le risque de perte d informations lors de la modification du type de leurs champs. Par défaut, un nœud possède un titre, un corps, un auteur et une date, ainsi que des champs de configuration. Il n est pas possible d ajouter des champs personnalisés sans passer par des modules supplémentaires. Pour plus d informations, cf. chapitre Étendre Drupal Les modules additionnels. Dans la base de données, on retrouve les nœuds dans la table node : Les colonnes sont détaillées dans le tableau ci dessous : Nom de la colonne Description nid vid type language title uid L identifiant du nœud. Ce champ est auto incrémenté et les valeurs qui s y trouvent sont par conséquent gérées par la base de données. L identifiant de la révision courante. Le nom informatique du type de contenu du nœud. Cette valeur ne doit pas comporter de caractères spéciaux ni d espaces. Le code ISO alpha 2 de la langue. Le titre. Il s agit d un libellé pouvant contenir des caractères spéciaux et des espaces. L identifiant de l utilisateur à l origine du nœud

28 status Définit si le nœud est publié (valeur 1) ou non (valeur 0). created changed comment Le timestamp correspondant à la date de création. Le timestamp correspondant à la date de dernière modification. Définit si les commentaires sont autorisés en lecture/écriture (valeur 2), autorisés en lecture seule (valeur 1) ou non autorisés (valeur 0) sur ce nœud. promote Définit si le nœud doit être affiché sur la page d accueil (valeur 1) ou non (valeur 0). moderate sticky tnid Définissait anciennement si le nœud était en cours de validation. Définit si le nœud doit être affiché en premier (valeur 1) ou non (valeur 0) dans les listes où il apparait. L identifiant du nœud de référence dans le cas d une traduction. translate Définit si la traduction a besoin d être mise à jour (valeur 1) ou non (valeur 0). Le champ "moderate" n est plus utilisé par le système. Dans cette table, on remarque que certaines informations correspondent à des informations du contenu (comme par exemple le titre) et d autres correspondent à des informations de configuration du nœud. En effet, il est possible de définir si un nœud est publié, c est à dire visible sur le site, si des commentaires peuvent y être rattachés, etc. Pour plus d informations sur la gestion des nœuds, cf. chapitre Utiliser Drupal La création d un nœud. Même si le nœud est non publié, c est à dire non affiché sur le site, il reste tout de même visible pour l administrateur. Par défaut, les contenus non publiés apparaissent avec une couleur de fond particulière pour les différencier. 2. Les révisions Dans la table des nœuds, on peut remarquer qu il n existe aucune colonne stockant le corps du contenu. Sous Drupal, chaque nœud est soumis à un système de gestion de versions qu on appelle les révisions. La révision d un nœud est une version particulière de son contenu. À la création d un nœud, une version par défaut est créée. Il est alors possible de créer de nouvelles révisions à partir de ce nœud, ce qui permet de garder une trace des modifications apportées. Une révision est donc rattachée à un nœud par son identifiant, ou nid, et possède un identifiant de version appelé vid. Par exemple, un nœud de numéro 5 peut posséder plusieurs révisions (N 5, 6 et 7), dont la révision courante peut être celle possédant le numéro 7 : - 2 -

29 Toutes les informations communes à l ensemble des révisions, excepté le titre qui correspond au titre de la révision courante, se trouvent dans le nœud. Chaque information spécifique à chaque nouvelle version se trouve à l intérieur de la révision correspondante. Le corps se trouve donc au niveau de la révision et non pas directement dans le nœud. Les révisions sont stockées dans la table node_revisions. Celle ci permet d enregistrer toutes les informations liées aux versions des nœuds. La structure de cette table est celle ci dessous : Les colonnes de la table sont détaillées ci dessous : Nom de la colonne Description nid vid uid title body teaser L identifiant du nœud. L identifiant de la révision. Ce champ est auto incrémenté et les valeurs qui s y trouvent sont par conséquent gérées par la base de données. L identifiant de l utilisateur à l origine de la création de la révision. Le titre du nœud de la révision. Le corps du nœud de la révision. Le résumé du nœud créé par Drupal à partir du corps

30 log timestamp format Le message saisi par l utilisateur lors de la création de la révision. La date à laquelle la révision a été faite. Le type de format utilisé par le corps du nœud. La colonne teaser correspond à un résumé créé automatiquement à partir du contenu du corps. Drupal génère ce résumé en prélevant un certain nombre de caractères à partir du début du contenu. Ce nombre de caractères, défini par défaut à 600, est configurable sur la page Administrer Gestion du contenu Paramètres de contribution. À la création du résumé, Drupal ne tient pas compte des caractères HTML inclus dans le corps. Par conséquent, il est possible qu il s arrête au milieu d une entité HTML. Un résumé peut alors se terminer par "&eac " ou encore "&eagr " correspondant respectivement aux entités HTML "é" (caractère "é") et "à" (caractère "à"). 3. Les traductions Drupal gère les traductions des nœuds dans différentes langues administrables au sein de la plate forme. Contrairement à ce que l on pourrait penser, un même nœud ne possède pas directement plusieurs traductions, mais une traduction correspond à un seul nœud : en réalité, à chaque nouvelle traduction, un nouveau nœud est créé et est directement rattaché au contenu initial par la colonne tnid de la table node. Par exemple, chacun des nœuds anglais, allemand et espagnol est rattaché au nœud français. Ainsi, lorsque Drupal souhaitera afficher la version anglaise du nœud, il accédera au nœud anglais (par exemple, de nid = 6) : - 4 -

31 La classification des données : la taxonomie 1. Les vocabulaires L un des intérêts de Drupal est de pouvoir classer (on dit aussi taguer) les nœ uds avec des termes. Ce système permet de croiser les informations. On peut imaginer par exemple une page affichant un article contenant un encart intitulé Sur le même sujet. Ce principe est appelé taxonomie sous Drupal. Les termes avec lesquels il est possible de taguer les nœ uds sont organisés dans des vocabulaires. Un vocabulaire permet de regrouper certains termes suivant une logique identique : catégorie de produit, thématique, catégorie de joueurs, etc. Un vocabulaire est rattaché à un ou plusieurs types de contenu. Sans cela, les nœ uds ne pourront pas se voir tagués avec l un des termes de ce vocabulaire. Par exemple, un vocabulaire rattaché à un type de contenu peut posséder 3 termes dont les termes 2 et 3 servent à taguer le nœud 1, et le terme 1 sert à taguer le nœud 2 : Les vocabulaires sont stockés dans la base de données dans la table vocabulary : Les colonnes sont détaillées dans le tableau suivant : Nom de la Description - 1-

32 colonne vid L identifiant du vocabulaire. Ce champ est auto incrémenté et les valeurs qui s y trouvent sont par conséquent gérées par la base de données. name Le nom du vocabulaire. description La description du vocabulaire. help Un texte d aide affiché au moment de la création d un nœ ud lors de l association des termes. relations Définit si les termes connexes disponibles doivent être des termes du même vocabulaire (valeur 1) ou non (valeur 0). hierarchy Le type de hiérarchie autorisé dans le vocabulaire : désactivé (valeur 0), la valeur unique (valeur 1) ou bien valeur multiple (valeur 2). multiple Définit si plusieurs termes peuvent être assignés à un nœ ud (valeur 1) ou non (valeur 0). required Définit si la valeur est obligatoire (valeur 1) ou non (valeur 0) tags Définit si les termes peuvent être saisis et créés au moment de la création d un nœ ud. module Le module à l origine de la création du vocabulaire. Si le vocabulaire a été créé via l administration du site, le module utilisé est taxonomy. weight Le poids du vocabulaire. 2. Le principe des termes a. Les termes Les termes sont des mots clés permettant de classifier des nœ uds. Par exemple, un article peut être rattaché à une thématique, un produit à une catégorie, etc. Par exemple, des nœuds dont les titres pourraient être "noeud1" et "noeud2" peuvent avoir pour termes communs les termes "terme1" et "terme2". Cette relation peut être utilisée dans des modules, notamment le module Views : - 2-

33 Les termes sont stockés en base de données dans la table term_data, dont la structure est présentée ci dessous : Les colonnes sont détaillées ci dessous : Nom de la colonne Description tid vid name description weight L identifiant du terme. Ce champ est auto incrémenté et les valeurs qui s y trouvent sont par conséquent gérées par la base de données. L identifiant du vocabulaire auquel est rattaché le terme. Le terme lui même. La description du terme. Le poids du terme dans les listes. Les associations entre termes et nœuds sont gérées dans la table term_node dont la structure est la suivante : Les colonnes sont détaillées dans le tableau suivant : - 3 -

34 Nom de la colonne Description nid vid tid L identifiant du nœud concerné. Le numéro de la révision du nœud. L identifiant du terme concerné. b. Les termes parents Sous Drupal, les termes peuvent être hiérarchisés en spécifiant pour certains d entre eux un terme parent. On peut ainsi créer un système de catégorisation permettant d organiser non seulement les termes, mais également les contenus qui y sont associés. Par exemple, des termes "Père" et "Mère" sont les termes parents du terme "Enfant" : Il est possible d associer plusieurs parents à un terme si nécessaire. Cette hiérarchie de terme est stockée dans la table term_hierarchy : Les colonnes sont détaillées ci dessous : Nom de la colonne Description tid parent L identifiant du terme enfant. L identifiant du terme parent. c. Les termes connexes - 4 -

35 Il est possible de définir des relations transversales entre des termes pour indiquer une possibilité de passer de l un à l autre. On parle alors de termes connexes. Il s agit de créer une simple relation entre termes qui pourra être utilisée par les modules activés sur la plate forme. Par exemple, les termes "Femme" et "Mère" sont des termes connexes : La table concernée par ces associations est la table term_relation et possède la structure suivante : Les colonnes sont détaillées dans le tableau ci dessous : Nom de la colonne Description trid tid1 tid2 L identifiant de la relation. Ce champ est auto incrémenté et les valeurs qui s y trouvent sont par conséquent gérées par la base de données. L identifiant du premier terme de la relation. L identifiant du second terme de la relation. d. Les synonymes Outre les différentes relations entre les termes, il est possible de générer plusieurs mots différents pour un même terme. On appelle cela des synonymes. Le principe de synonymie ne rejoint pas le principe des termes connexes ou parents : un nouveau terme n est pas créé pour chaque synonyme, il s agit juste de mots clés supplémentaires rattachés à un terme déjà existant. Ces mots clés peuvent être utilisés par les modules de la plate forme. Le schéma suivant présente le principe de synonymie appliqué à Drupal : - 5 -

36 En base, les synonymes sont stockés dans la table term_synonym : Les colonnes sont détaillées dans le tableau ci dessous : Nom de la colonne Description tsid tid name L identifiant du synonyme. Ce champ est auto incrémenté et les valeurs qui s y trouvent sont par conséquent gérées par la base de données. L identifiant du terme rattaché au synonyme. Le synonyme lui même

37 La gestion des utilisateurs et de leurs droits d accès Une des forces de Drupal est sa gestion poussée des droits utilisateurs. Il est en effet possible de créer des comptes utilisateurs et de leur donner des droits d accès spécifiques pour à peu près toutes les actions possibles de Drupal. 1. Les comptes utilisateurs Chaque compte utilisateur possède au minimum 3 informations importantes : Son identifiant Son adresse e mail Son mot de passe Il est possible de lui attribuer d autres champs spécifiques comme un nom, un prénom, une adresse, etc. via un module particulier nommé Profile. Pour plus de détail sur ce module, cf. chapitre Étendre Drupal Les modules standard. Les autres informations le concernant sont soit des informations automatiques (date de création du compte, etc.) soit des informations de paramétrage (activation/désactivation du compte, choix du thème, etc.). Les comptes utilisateurs sont stockés dans la table users dont la structure est présentée ci contre : Les colonnes sont détaillées dans le tableau ci dessous : Nom de la colonne uid Description Le numéro automatique attribué par Drupal à l utilisateur. - 1-

38 name pass mail mode sort threshold theme signature signature_format created access login L identifiant de l utilisateur. Le mot de passe de l utilisateur. L adresse e mail de l utilisateur. Le mode d affichage des commentaires utilisé par le module Comment. L ordre de tri des commentaires utilisé par le module Comment. Anciennement utilisé par le module Comment pour les préférences utilisateurs. Le thème par défaut de l utilisateur. La signature de l utilisateur. Le format utilisé pour la signature (autorisation de tous les caractères HTML ou non). Le timestamp de la date de création du compte. Le timestamp de la date de dernier accès de l utilisateur. Le timestamp de la date de dernière connexion de l utilisateur. status Définit si le compte est activé (valeur 1) ou non (valeur 0). timezone language picture init data Le fuseau horaire de l utilisateur. La langue par défaut. Chemin d accès à la vignette de l utilisateur. L adresse e mail utilisée au moment de la création du compte. Un tableau sérialisé contenant des informations concernant l utilisateur et chargées dans la variable $user. Le champ "threshold" n est plus utilisé par le système. 2. Les rôles Chaque utilisateur est associé à un ou plusieurs rôles. Un rôle est un groupe permettant de rassembler des utilisateurs sous une logique particulière : un rôle pour des abonnés à un magazine, un rôle pour les clients d une boutique, etc. Les rôles sont stockés dans la table role : Les colonnes sont détaillées ci dessous : Colonne Description rid Identifiant du rôle. Ce champ est auto incrémenté et les valeurs qui s y trouvent sont par conséquent gérées par la base de données

39 name Libellé du rôle. La table stockant l association entre les utilisateurs et les rôles est la table users_roles : Les colonnes sont détaillées dans le tableau ci dessous : uid rid Colonne Description Le numéro de l utilisateur. L identifiant du rôle. 3. Les droits d accès Les droits d accès permettent de définir les différents accès aux rôles du système. On appelle aussi ces droits d accès des permissions. Les droits d accès se définissent sur les rôles et non sur les utilisateurs. Les droits d accès correspondent à des mots clés qui servent à déterminer dans le code si une action peut être réalisée par l utilisateur connecté. Par exemple, on retrouve couramment les mots clés access content et administer nodes qui correspondent respectivement à l accès au contenu et à l administration des nœuds. Si un rôle se voit attribuer l un de ces accès, il aura le droit de réaliser les opérations correspondantes. Sous Drupal, c est la fonction user_access() qui permet de vérifier les permissions. Le prototype de la fonction est le suivant : function user_access($string, $account = NULL, $reset = FALSE) Les paramètres de la fonction sont les suivants : $string : le mot clé correspondant à la permission. $account : le compte utilisateur à vérifier. Par défaut, il s agit de l utilisateur connecté. $reset : si la valeur est TRUE, les permissions vont être rechargées. Cela peut être utile dans le cas d ajout dynamique de droits. La fonction retourne TRUE si l utilisateur possède la permission passée en paramètre, FALSE sinon. Par exemple, un module qui doit vérifier si l utilisateur courant possède le droit d accéder au contenu contient le code suivant : if(user_access( access content )) { // RECUPERATION ET AFFICHAGE DES DONNEES }//if() Les permissions sont stockées dans la base de données par la table permission : - 3 -

40 Les colonnes sont détaillées dans le tableau ci dessous : Colonne pid rid perm tid Description L identifiant de la permission. Ce champ est auto incrémenté et les valeurs qui s y trouvent sont par conséquent gérées par la base de données. L identifiant du rôle. Les clés correspondant aux permissions du rôle. Toutes les clés sont séparées par des virgules. À l origine, ce champ était destiné à utiliser des permissions basées sur la taxonomic. Le champ "tid" n a jamais été utilisé par le système

41 L organisation des pages 1. Les thèmes Pour rendre l affichage d une page, Drupal se base sur des thèmes pour connaître la structure de page à utiliser, les couleurs, le type de la police, etc. Pour faciliter le développement des thèmes, Drupal utilise un moteur de template (modèle) appelé phptemplate. Il est possible de changer ce moteur de template si le développeur a l habitude d en utiliser un autre (smarty, phptal, etc.). Un thème correspond à un ensemble d informations concernant l affichage des données (structure, mise en forme, etc.), modélisé par un ensemble de fichiers. Drupal, une fois les informations relatives à la page rapatriées, passe ces informations au thème pour qu il puisse les afficher. L exemple suivant illustre ce principe : 2. Les régions Pour plus de facilité dans l organisation des données, une page est structurée à l aide de zones dans lesquelles seront placées ces données. On appelle une de ces zones une région. Les régions sont souvent implémentées sous forme de balise <div>, affichées sous certaines conditions (par exemple, une région s affichera uniquement si elle contient des données), avec des styles particuliers (par exemple, la région de contenu peut s étendre si les colonnes latérales ne s affichent pas) et positionnées de façon à structurer la page. Chaque région est définie par une clé informatique (texte sans espaces ni caractères spéciaux) et un libellé. Le libellé est le texte affiché dans la partie d administration

42 Les régions sont déclarées dans la configuration du thème et correspondent, au niveau du code, à des variables suivant le principe d une variable par région. La variable du thème correspond à la clé informatique de la région. Chacune des variables contient toutes les informations à afficher dans la zone correspondante. Le schéma suivant explique ce principe : Dans cet exemple, une page définit 6 régions : "header", "menu", "left", "content", "right" et "footer". Les données s afficheront dans ces 6 zones. Chacune de ces zones pourra se voir attribuer une taille, une image de fond ou encore une police différente. Il n existe pas de table dans la base de données pour stocker les régions : elles sont uniquement définies dans le thème. 3. Les blocs Si les régions permettent de structurer une page, les blocs permettent d en structurer leur contenu. En effet, un bloc est une composante d une région, une petite zone particulière et réutilisable au sein du site. Un bloc est une entité qui peut : se voir attribuer une visibilité (le bloc peut être visible uniquement par certains groupes d utilisateurs) ; être affichée sur certaines pages (par exemple, le bloc peut être affiché uniquement sur la page d accueil). Un bloc possède un titre et un contenu, et possède couramment la structure suivante : - 2 -

43 Généralement, le titre est placé en haut et le contenu juste en dessous, mais cette organisation peut être modifiée grâce au template. Un bloc est placé dans une région pour être affiché à l endroit voulu. Un bloc ne peut être placé que dans une région à la fois (on ne peut pas mettre le même bloc à la fois dans une colonne de gauche et une colonne de droite). Dans l exemple suivant, 2 blocs ont été rajoutés dans la région "left" possédant respectivement les titres "Titre bloc 1" et "Titre bloc 2" ainsi que leur contenu : Dans une région, tous les blocs sont ordonnés : de cette façon, il est très facile de modifier l ordre d affichage des blocs en changeant leur poids dans la région. Drupal ne gère que 21 numéros d ordre par région. En clair, le poids d un bloc peut varier de 10 à 10. Si plus de 21 blocs sont positionnés dans une région, des problèmes de placement de bloc peuvent survenir. Les informations de configuration des blocs sont stockées par la base de données dans la table blocks : - 3 -

44 Les colonnes sont détaillées dans le tableau ci dessous : Colonnes Descriptions bid module delta theme L identifiant du bloc. Ce champ est auto incrémenté et les valeurs qui s y trouvent sont par conséquent gérées par la base de données. Le module à l origine de la création du bloc. Le delta permettant de distinguer les blocs créés par le même module. Ce delta est couramment un entier, mais il peut correspondre à une clé au format texte. Le nom du thème auquel s appliquent les éléments de configuration du bloc. status Définit si le bloc est activé (valeur 1) ou non (valeur 0). weight region custom Le poids du bloc au sein de la région. Ce poids définit l ordre d affichage des blocs. La clé correspondant à la région dans laquelle se trouve le bloc. Définit comment un utilisateur peut choisir la visibilité du bloc. Soit l utilisateur ne peut rien contrôler (valeur 0), soit le bloc est affiché par défaut, mais l utilisateur peut choisir de le masquer (valeur 1), soit le bloc est masqué par défaut, mais l utilisateur peut choisir de l afficher (valeur 2). throttle Définit si le bloc doit être supprimé lorsque le trafic du site devient important (valeur 1) ou non (valeur 2). visibility Définit la visibilité du bloc sur les pages : Affiché sur toutes les pages à l exception de celles listées (valeur 0). Affiché sur toutes les pages listées (valeur 1). L utilisateur utilise du code PHP pour déterminer la visibilité (valeur 2). pages title Les pages sur lesquelles le bloc doit s afficher ou non. Le titre du bloc. Si le titre n est pas rempli (chaine de caractère vide), le titre du bloc par défaut sera affiché. Si aucun titre ne doit être affiché, pas même le titre par défaut, il faut utiliser le mot clé <none>

45 cache Définit le mode de mise en cache du bloc. Chaque bloc peut être visible par un ou plusieurs groupes. Cette association est stockée par la base de données dans la table block_roles : Les colonnes sont détaillées dans le tableau ci dessous : Colonnes module delta rid Descriptions Le module d origine du bloc. Le delta du bloc au sein du module. L identifiant du rôle ayant accès au bloc

46 La gestion multisite 1. Le principe Il est possible d utiliser Drupal comme gestionnaire de plusieurs sites. Cela permet : De factoriser tout le cœur de Drupal ainsi que certains modules et thèmes. Ces éléments communs seront disponibles pour l ensemble des sous sites configurés. D avoir des données sécurisées. Bien que chaque sous site partage la même base de données, chacun d eux possède son propre jeu de table. Les données (types de contenu, nœuds, blocs, etc.) sont donc spécifiques à chaque site. Bien que la plupart des modules et des thèmes soient communs à l ensemble des sous sites, certains peuvent être spécifiques à un site en particulier. Le système de sous sites, sous Drupal, est défini par le schéma suivant : Chaque sous site possède sa propre configuration, ses propres fichiers associés aux nœuds et ses propres données. Seule la plate forme d installation est commune. 2. La pratique Pour créer un sous site, il suffit de créer un nouveau répertoire dans le répertoire sites. Le nom du répertoire doit correspondre au nom de domaine incluant le nom du sous site. Par exemple, l arborescence ci dessous indique qu il est possible d accéder au sous site "test1" avec l adresse "http://www.monsite.com/test1" : - 1 -

47 Une fois le répertoire créé, il faut y copier le fichier de configuration sites/default/default.settings.php en le renommant settings.php. Une fois l opération réalisée, il suffit d accéder au sous site par le navigateur et de suivre les étapes d installation. Au moment de la configuration de la base, il faut spécifier les mêmes paramètres de connexion, en pensant à bien préciser le préfixe qui servira au nommage des tables de la base. En effet, au sein de la base, on disposera de tables spécifiques pour le sous site qui, pour les différencier du site par défaut, doivent toutes commencer par un préfixe particulier (dans notre exemple, les tables pourraient être préfixées par le mot clé site1_. On disposerait alors des tables site1_node, site1_node_type, etc.). Pour créer un sous site local, il faut créer un virtual host (répertoire virtuel) au sein d Apache. Ce virtual host doit pointer vers le répertoire de Drupal et son nom dans le répertoire "sites" doit commencer par "localhost" sans contenir le nom du répertoire de Drupal. Par exemple, si le sous site est "test1", le nom du répertoire doit être "localhost.test1"

48 La recherche et l indexation Drupal propose en standard un module de recherche capable de retrouver un ou plusieurs mots clés saisis par l utilisateur. Ce module propose également une recherche avancée permettant d effectuer une recherche à l aide des critères plus complexes (recherche sur un type de contenu ou un vocabulaire particulier, etc.). Le module de recherche est fourni en standard avec Drupal mais n est pas activé par défaut. Il est important de comprendre le fonctionnement de cette recherche pour mieux comprendre comment les résultats (par exemple les nœuds) peuvent s afficher. Le module ne recherche pas directement en temps réel dans les contenus : le système passe par un moteur d indexation qui est utilisé directement lors de la recherche d un mot clé. Cette indexation est lancée par la tâche récurrente de Drupal, appelée cron. Tant que cette indexation n est pas exécutée, la recherche ne trouve pas de nouveaux résultats. Le schéma suivant présente ce mode de fonctionnement : le module d indexation trouve les contenus à indexer, recherche les mots clés pertinents (le module ne prend pas en compte certains mots comme "le", "un", etc.) et les stocke dans des tables utilisées lors de la recherche. Plusieurs tables sont impliquées dans ce système d indexation. Tout d abord, la table search_dataset permet de recenser les éléments (les nœuds par exemple) pris en compte dans la recherche. Cette table possède la structure suivante : - 1 -

49 Le détail des colonnes se trouve dans le tableau ci dessous : Colonnes Descriptions sid type data L identifiant de l élément recherché, par exemple le nid dans le cas d un nœud. Le type de l élément recherché, par exemple node pour les nœuds. La liste des mots clés séparés par des espaces, associés au contenu. reindex Permet de forcer la réindexation du contenu (valeur 1) ou non (valeur 0). La clé primaire de cette table est la composition des deux colonnes "sid" et "type". En effet, il est possible de trouver deux valeurs identiques pour la colonne "sid" uniquement dans le cas de types d éléments différents. Les mots clés des contenus référencés dans la table search_dataset sont stockés dans la table search_index dont la structure est présentée ci dessous : Les colonnes sont détaillées dans le tableau ci dessous : Colonnes Descriptions word sid type score Le mot clé concerné. L identifiant du contenu associé au mot clé. Il s agit de l identifiant de la table search_dataset. Le type du contenu associé au mot clé. Le score attribué par l indexeur au mot clé. Plus ce score est élevé, plus le mot clé est important. Les relations entre les éléments et les nœuds sont aussi utilisées et stockées par l indexeur. Ces liens sont recensés dans la table search_node_links dont la structure est celle ci : Les colonnes sont détaillées ci dessous : Colonnes Descriptions - 2 -

50 sid type nid caption L identifiant de l élément concerné. Le type de l élément concerné. Le nid du nœud de la relation. Le texte utilisé pour le lien. La dernière table impliquée dans le système d indexation de Drupal est la table search_totals. Elle permet de stocker, pour chacun des mots référencés, leur nombre total trouvé par l indexeur en utilisant la loi de Zipf. Cette table est présentée ci dessous : Les colonnes sont détaillées ci dessous : Colonnes Descriptions word count Le mot clé. Il s agit de la clé primaire (valeur unique). Le nombre de fois où le mot a été trouvé en utilisant la loi de Zipf

51 Conclusion Ce chapitre a détaillé les principaux concepts sur lesquels est basée la plate forme Drupal : les types de contenu, les nœuds, les thèmes, les utilisateurs, la taxonomie et la recherche. Certaines de ces notions sont simples à comprendre, d autres plus compliquées. L expérience et la pratique permettent au final de concevoir des sites rapidement et simplement. Trouver quels sont les types de contenu et vocabulaires à créer, pourquoi choisir un terme plutôt qu un champ à associer à un type sont des problématiques auxquelles il est facile de répondre une fois ces concepts assimilés. Ce chapitre a permis également de mettre en avant les différentes tables utilisées par ces concepts. Savoir où sont stockées les informations est toujours important dans la mesure où cela donne les moyens d émettre des suppositions quant à l origine d un problème. L idée n étant pas de connaître le schéma de la base de données par cœur, mais bien de localiser une donnée précise. Ce chapitre, bien que théorique, est la base des suivants et facilite la compréhension des éléments techniques

52 La zone d administration La zone d administration représente le cœur de Drupal. Elle permet de gérer toutes les informations visibles ou non de la plate forme au travers de cinq parties : Construction du site Cette partie permet de gérer les informations structurant l affichage des données du site : les menus, les blocs, etc. Cette partie se divise en cinq autres : Le menu Blocs permet de gérer l organisation des blocs en définissant leur région d appartenance et leur position au sein de cette région, et permet d en créer de nouveaux. Le menu Menus permet de gérer les blocs de menu existants, d en créer de nouveaux et de gérer les différentes entrées qui les composent. Le menu Modules permet de gérer les différents modules du système en les activant, en les désactivant, en les installant et désinstallant. Le menu Thèmes permet de gérer les thèmes activés ou non du site et permet de les configurer. Le menu Traduction de l interface permet de gérer les traductions des textes du site dans les langues activées. Gestion du contenu Cette partie permet de gérer les informations structurant les données du système telles que les types de contenus ou les nœuds eux mêmes. Cette partie est divisée en six autres : Le menu Commentaires permet de gérer les différents commentaires des internautes, notamment leur approbation et leur liste. Le menu Contenu permet de lister l ensemble des nœuds qui ont été créés sur le site. Le menu Paramètres de contribution permet de configurer certains aspects des contributions. C est dans cette partie qu il est possible de reconstruire les droits d accès. En effet il est possible que des changements sur les droits d accès ou la désactivation de modules puissent engendrer des problèmes : mauvaises prises en compte des droits, impossibilité pour certains utilisateurs d accéder à du contenu, etc

53 Le menu Publication RSS permet de configurer la génération de flux RSS. Le menu Taxonomie permet de gérer les vocabulaires et les termes qui les composent. Le menu Types de contenu permet de créer les différents types de contenu, base de la création des nœuds sur Drupal. Configuration du site Cette partie permet de gérer le paramétrage de Drupal. Cette partie est divisée en quinze autres : Le menu Actions permet de gérer les différentes actions qui peuvent être utilisées par le moteur. Les actions sont des opérations exécutées à certains moments précis, en fonction d un événement particulier. Le menu Boîte à outils image permet de gérer la qualité des images utilisées. Le menu Date et heure permet de gérer le fuseau horaire et de personnaliser le format des dates. Le menu Formats d entrée permet de configurer le type des données saisies par l utilisateur (autorisation de code HTML ou non). Le menu Informations permet de modifier les informations de base du site. Le menu Journalisation et alertes permet de configurer certains aspects de la traçabilité des informations, comme par exemple la journalisation en base de données. Le menu Maintenance du site permet de rendre le site accessible ou inaccessible en affichant une page de maintenance. Le menu Paramètres de recherche permet de configurer certains aspects de la recherche, et permet notamment de réindexer les contenus. Le menu Performance permet de paramétrer la mise en cache des informations. C est cette option qui permet de vider le cache. Cette action est très importante puisqu elle est nécessaire lors du rajout d un hook ou d une fonction de thème. Le menu Rapports d erreur permet de définir les pages devant s afficher si l utilisateur n a pas les droits d accès à une zone du site ou si la page demandée n a pas été trouvée. Le menu Système de fichiers permet de définir le chemin d accès au répertoire de stockage des fichiers. Le menu Thème de l administration permet de définir, comme son nom l indique, le thème de l administration

54 Le menu Toutes les langues permet de gérer les langues disponibles sur le site. Cette partie permet d en ajouter de nouvelles ou d en désactiver. Le menu Transferts de fichiers permet de paramétrer le transfert des fichiers en définissant par exemple leur poids maximal ou encore la taille maximale des images. Le menu URLs simplifiées permet d activer ou de désactiver la réécriture des URL du site. Gestion des utilisateurs Cette partie permet de gérer tout ce qui concerne les comptes utilisateurs et notamment les utilisateurs eux mêmes, les groupes d utilisateurs et les droits d accès : Le menu Droits d accès permet de donner ou non des accès sur certaines actions du site aux différents groupes d utilisateurs. Le menu Paramètres des utilisateurs permet de configurer les informations concernant les comptes utilisateurs, notamment des paramètres de connexion ou de création de compte. Le menu Règles d accès permet de gérer ses propres règles d acceptation ou de refus de création d un compte utilisateur. Le menu Rôles permet de gérer les groupes d utilisateurs. Le menu Utilisateurs permet de gérer les comptes utilisateurs. Rapports Cette partie permet d obtenir quelques informations importantes pour une bonne gestion du site : Le menu Entrées récentes du journal permet de visualiser toutes les informations tracées en base de données. Le menu Phrases les plus recherchées permet de visualiser les mots les plus utilisés par les internautes dans la recherche. Le menu Principales erreurs de type accès refusé permet de visualiser rapidement les différents accès refusés en ayant un maximum d information sur chaque tentative. Ces informations peuvent aider l administrateur à rajouter des règles d accès spécifiques. Le menu Principales erreurs de type page non trouvée permet d obtenir rapidement la liste des pages que les utilisateurs ont tenté d afficher mais qui n existent pas dans le système. Le menu Tableau de bord permet de visualiser rapidement des informations de configuration du serveur ou bien des informations critiques comme des mises à jour importantes ou l absence de fonctionnement du cron par exemple

55 Cette organisation peut être différente en fonction des différents modules qu il est possible d ajouter à la plate forme

56 Les types de contenu et les nœuds 1. La création d un type de contenu a. Les interfaces Les types de contenu se gèrent via la page Gestion du contenu Types de contenu : La page d accueil permet grâce aux onglets situés en haut de lister les types existants et d en créer de nouveaux. Par défaut, les deux types que fournit Drupal sont : Article : le type Article permet de créer des contenus voués à être affichés à la fois sous forme de liste (un résumé de l article seulement est alors affiché) ou alors en pleine page (l article est affiché dans son intégralité). Page : le type Page permet de créer des contenus dont le but principal est d être uniquement affiché en pleine page bien que, tout comme les articles, il soit possible d afficher les pages sous forme de liste. Pour ajouter un nouveau type de contenu, il suffit de cliquer sur le bouton Ajouter. Le formulaire de création suivant s affiche : - 1-

57 Le formulaire est divisé en plusieurs parties. La première, et la plus importante, permet de saisir les informations principales sur le type dont : Son nom : il s agit d un libellé. Son type : il s agit du nom machine. C est ce nom informatique qui sera repris partout dans le code pour récupérer des nœ uds correspondant à ce nouveau type de contenu. Sa description : il s agit d une description somme toute classique mais néanmoins importante dans la mesure où celle ci s affiche sur la page listant les différents types de contenu. En effet, le libellé ou le nom machine peut ne pas être en relation avec la représentation de ce type de contenu. Par exemple, il est possible de voir un type de contenu dont le nom machine est prod_e_i représentant des écrans informatiques disponibles à la vente (produit). Dans ce cas, la description est importante car elle permet de spécifier en langage clair l objectif du type de contenu correspondant. Bien qu il paraisse logique de nommer ses types de contenus correctement, il n est pas rare de tomber sur l exemple ci dessus. Les raisons sont diverses et variées : des stagiaires ayant travaillé sur la base du site, des personnes non rigoureuses, ou tout bêtement une convention de nommage à respecter. La deuxième partie du formulaire de création d un type de contenu consiste à spécifier les informations supplémentaires qui s appliqueront plus tard à la création des nœ uds. En standard, ces informations sont au nombre de trois : Paramètres du formulaire de contribution - 2-

58 Cette partie du formulaire permet de spécifier les libellés des champs de saisie du titre et du corps. En effet, étant donné que l on retrouve ces deux informations dans tous les nœuds, il peut être plus pratique de voir apparaître Nom de l auteur et Biographie si l on est en train de créer un contenu de type Auteur. Il est possible aussi de définir le nombre minimal de mots à la création du nœud ainsi que d afficher des indications à l utilisateur au moment de la saisie. Procédures de publication - 3 -

59 Cette partie du formulaire permet de définir des informations liées à la publication des nœuds, comme par exemple la publication par défaut d un nœud ou sa promotion en page d accueil. Il ne s agit là que du paramétrage par défaut. Lorsqu un nœud sera par la suite créé, il possédera cette configuration, mais il sera possible lors de la procédure de création de modifier ce paramétrage. Paramètres des commentaires Cette partie du formulaire permet d indiquer à Drupal comment doit se comporter le système des commentaires sur les nœuds de ce type de contenu. C est dans cette partie qu il est possible notamment d activer ou de désactiver la gestion des commentaires. b. Un cas pratique : le type Document Pour illustrer les interfaces précédentes et les exemples des parties suivantes, il s agit de créer un type de contenu nommé Document qui possédera un titre, une description, les commentaires seront activés (comportement par défaut), les nœuds par défaut seront publiés, et non promus en page d accueil. Le formulaire est rempli avec ces informations : - 4 -

60 - 5 -

61 Une fois le type créé, il apparaît dans la liste des types de contenu : 2. La création d un nœud a. Les interfaces Un nœud, aussi appelé contenu, est un élément unitaire qui stocke des informations. Le formulaire de création des nœuds n est pas accessible dans la partie d administration mais est disponible sur la page Créer un contenu : Cette page liste les types de contenu existants et permet à l utilisateur de choisir le type de contenu sur lequel le nœud sera basé. Le formulaire de création d un nœud est présenté par la copie d écran suivante : - 6 -

62 Ce formulaire permet de saisir le titre du nœud, son corps (le contenu même du nœud), un format d entrée (autoriser certaines balises HTML). Ce formulaire permet également de modifier les paramètres par défaut définis au sein du type de contenu : paramétrer le fonctionnement du système de commentaires sur ce nœud, définir si le nœud est publié ou non, etc. b. Un cas pratique : un document Il s agit maintenant de créer un nœud de type Document. Pour créer ce nœud, il suffit tout d abord d aller sur la page Créer un contenu et de cliquer sur le lien Document : Le formulaire de création du nœud apparaît alors. Le nœud doit être paramétré pour ne pas être publié, et ne pas autoriser les commentaires. Le contenu pourra contenir tout type de balise HTML : - 7 -

63 Une fois le nœud enregistré, il s affiche en mode pleine page : - 8 -

64 Le nœud est également disponible dans la page Administrer Gestion du contenu Contenu : - 9 -

65 La taxonomie ou classification 1. La création d un vocabulaire a. Les interfaces Pour créer un nouveau vocabulaire, il suffit de se rendre sur la page Administrer Gestion du contenu Taxonomie. Une liste de vocabulaire s affiche alors : Deux onglets situés en haut permettent de lister les vocabulaires existants (la page par défaut, affichée ici) et d en ajouter de nouveaux. Plus bas se trouve la liste des vocabulaires, vide si aucun vocabulaire n a encore été créé. Le formulaire de création d un vocabulaire est composé de trois parties : Identification - 1 -

66 Cette partie du formulaire permet de saisir les informations importantes comme le libellé, la description et le texte d aide donnant des indications à l utilisateur lors de la saisie des termes. Types de contenu Cette partie du formulaire permet d indiquer à Drupal à quels types de contenu le vocabulaire doit s appliquer. En effet, chaque vocabulaire doit être associé à un ou plusieurs types de contenu pour qu à la création d un nœud, l utilisateur puisse taguer le nœud avec l un des termes de ce vocabulaire. Paramètres - 2 -

67 Cette partie permet de paramétrer le vocabulaire en indiquant : Si l utilisateur peut saisir de nouveaux mots clés à la création d un nœud (il s agira d une saisie libre avec de l autocomplétion). Si l utilisateur peut associer plus d un terme au nœud. Si le choix d un terme de ce vocabulaire est obligatoire lors de la création d un nœud. b. Un cas pratique : les types de support et les matières Il s agit ici de créer deux vocabulaires s appliquant au type de contenu Document : l un nommé Type de support et l autre nommé Matière. Pour créer le premier, il suffit de se rendre sur la page Administrer Gestion du contenu Taxonomie puis de cliquer sur l onglet Ajouter un vocabulaire situé en haut. Les informations à saisir pour le premier vocabulaire sont les suivantes : - 3 -

68 Pour le second, les informations sont très similaires, mis à part le fait que plusieurs matières peuvent être associées à un même document : - 4 -

69 Si tout s est bien passé, ces deux vocabulaires sont maintenant disponibles dans la page Administrer Gestion du contenu Taxonomie : 2. L ajout de termes a. Les interfaces Un terme étant un élément unitaire d un vocabulaire, pour créer un nouveau terme il est nécessaire de passer par la page Administrer Gestion du contenu Taxonomie puis de cliquer sur le lien ajouter des termes de la ligne correspondant au vocabulaire concerné. Le formulaire suivant s affiche : - 5 -

70 Le formulaire propose de saisir le libellé du terme et une description. Des options avancées permettent de paramétrer d autres éléments concernant le terme : Cette partie supplémentaire du formulaire permet de définir des liens particuliers entre les termes d un même vocabulaire : Les termes parents permettent de créer une arborescence de terme au sein du vocabulaire

71 Les termes connexes permettent de créer des liens forts entre deux termes. Les termes synonymes permettent de spécifier des mots clés correspondant à des synonymes du terme courant. Pour plus d information sur le système de taxonomie, cf. chapitre Drupal et son architecture La classification des données : la taxonomie. b. Un cas pratique : les termes des vocabulaires Il s agit ici de créer un ensemble de termes dans les différents vocabulaires créés précédemment. L arborescence sera celle présentée ci dessous : Vocabulaire Type de support : Cours Exercices Slides (synonyme : PowerPoint) Corrections Vocabulaire Matière : Informatique Technologies du Web HTML / CSS / JavaScript (terme connexe : Technologies du Web) Java Comptabilité Les copies d écran ci dessous ne présentent qu une partie de la création de cette arborescence. Pour créer le terme Slides avec son synonyme par exemple, il suffit de se rendre sur la page Administrer Gestion du contenu Taxonomie, de cliquer sur le lien ajouter des termes de la ligne correspondant au vocabulaire Type de support puis de remplir le formulaire comme suit : - 7 -

72 Pour ajouter le terme Java et spécifier le terme Informatique en tant que terme parent, il suffit d abord de créer le terme Informatique puis à la création du terme Java, de remplir le formulaire comme suit : - 8 -

73 Cette hiérarchie peut être visualisée en cliquant sur le bouton Liste situé en haut : On distingue clairement que le terme Java est indenté par rapport au terme Informatique. De la même façon, pour définir que le terme Technologies du Web est un terme connexe à HTML / CSS / JavaScript, il faut d abord créer le premier puis à la création du second, remplir le formulaire comme suit : - 9 -

74 Une fois créée, la relation entre des termes connexes n est pas visible sur la liste des termes, comme l est la relation de parenté. Il s agit d une information qui peut être utilisée par des modules pour la récupération de nœud ou l affichage

75 Les blocs 1. Les interfaces Les blocs composant les pages de Drupal sont administrables dans la page Administrer Construction du site Blocs. Cette page affiche la liste des blocs disponibles en les positionnant dans leur région d appartenance ou dans une zone nommée Désactivé : Cette page propose de placer chacun des blocs dans une région grâce aux listes déroulantes situées sur chaque ligne. Il est possible également de déplacer un bloc en faisant glisser la flèche se trouvant à gauche de chaque ligne et en déposant le bloc dans la région désirée. Chacun des blocs peut être paramétré en cliquant sur le lien configurer de la ligne du bloc concerné. Le formulaire de configuration est divisé en quatre parties principales : Paramètres spécifiques du bloc En standard, il n y a que le titre à saisir dans cette zone mais il est possible que certains modules y rajoutent des informations

76 Si aucun titre ne doit apparaître à l affichage du bloc, il est nécessaire de saisir la valeur <none>. Paramètres de visibilité spécifiques à l utilisateur Cette partie permet de spécifier si l utilisateur possède le droit d afficher ou de masquer le bloc. S il a ce droit, l utilisateur pourra dans son compte cocher ou décocher une case correspondant au bloc pour respectivement afficher ou masquer celui ci. Paramètres de visibilité spécifiques aux rôles Cette partie est l une des plus importantes car elle permet de définir le niveau de visibilité du bloc en fonction du rôle de l utilisateur. Pour autoriser un groupe d utilisateurs à voir le bloc, il suffit de cocher les cases correspondantes. Paramètres de visibilité spécifiques à la page Cette partie permet de définir sur quelles pages le bloc doit s afficher ou non. On peut grâce à cela spécifier à Drupal qu un bloc sera visible sur la page d accueil, mais pas sur les autres pages, ou bien qu il s affichera sur toutes les pages sauf sur la page de connexion, etc

77 Drupal autorise aussi à placer du code PHP pour spécifier une condition particulière pour la visibilité du bloc. Ce genre de solution peut résoudre certaines problématiques d affichage, mais est tout de même à proscrire si d autres solutions peuvent être envisagées. Cette structure de formulaire est la structure générale et commune à l ensemble des blocs. Il s agit surtout de la structure minimale adoptée par les blocs créés dynamiquement par les modules installés et activés. Il existe également un autre type de bloc, créé par l utilisateur et dont le contenu est administrable. Ce genre de bloc peut être créé en cliquant sur le bouton Ajouter un bloc situé en haut de la page. Comme expliqué, le formulaire est le même mis à part la zone Paramètres spécifiques du bloc qui contient deux zones de saisie supplémentaires correspondant à la description du bloc et à son contenu : 2. Un cas pratique : la liste des documents Il s agit ici de créer un bloc via l interface d administration, dont le contenu comporte un lien vers le nœud de type Document créé précédemment. Pour faire un lien sur Drupal, il faut se baser sur le numéro du nœud vers lequel le lien doit pointer. Ici le numéro du nœud de type Document est le 7. Ce numéro est visible dans l URL (par exemple ainsi que dans la table node de la base de données. Le bloc ne sera également affiché que sur la page d accueil, sur la page de connexion et sur toutes les pages du compte utilisateur, et sera présent dans la région Barre de gauche. Pour cela, il suffit d aller sur la page Administrer Construction du site Blocs et de cliquer sur le bouton Ajouter un bloc. Les informations à saisir sont les suivantes : - 3 -

78 Il faut aussi spécifier les pages sur lesquelles le bloc doit être visible : On peut remarquer trois spécificités dans la notation des pages : Il n y a aucune URL. Seul le chemin relatif des pages est saisi. La page d accueil est une page particulière car elle peut changer à tout moment. C est pour cela qu il est préférable d utiliser le mot clé <front> pour la désigner. Le caractère * est un caractère spécial permettant de définir que tous les chemins de page commençant par user seront concernés. Une fois le bloc créé, il est rendu disponible par Drupal dans la zone Désactivé. Pour le déplacer, il suffit de sélectionner la région Barre de gauche dans la liste déroulante puis de cliquer sur le bouton Enregistrer les blocs en bas pour sauvegarder les modifications : - 4 -

79 - 5 -

80 Les utilisateurs et les droits 1. La création d un rôle Les rôles, ou groupes, se gèrent avec Drupal sur la page Administrer Gestion des utilisateurs Rôles : Par défaut, il existe deux rôles utilisateurs : utilisateur anonyme : il s agit des visiteurs non connectés qui accèdent au site. utilisateur identifié : il s agit de tout utilisateur connecté. Ces deux groupes étant nécessaires au fonctionnement de Drupal, ils ne peuvent pas être supprimés, d où l apparition du mot clé "verrouillé" présent sur chacune des lignes. Pour chaque rôle listé, il est possible de gérer les droits d accès via le lien correspondant de la ligne. Pour ajouter un nouveau rôle, il suffit de saisir le nom du groupe dans la zone de saisie et cliquer sur le bouton Ajouter un rôle. Par exemple, il s agit ici de créer un rôle Enseignant : - 1 -

81 2. L attribution des droits d accès a. Les interfaces Un rôle permet de regrouper des utilisateurs sous une logique particulière afin de leur attribuer des droits d accès sur le site. En effet, il n est pas possible d autoriser l accès du site à un utilisateur en particulier. Les droits d accès sont utilisés par Drupal dans toutes les zones de la plate forme pour vérifier si l utilisateur est autorisé à réaliser l opération courante : création d un nœud, ajout d un commentaire ou même affichage d une page ou d un bloc. Pour plus d information sur le principe des droits d accès, cf. chapitre Drupal et son architecture La gestion des utilisateurs et de leurs droits d accès. Les droits d accès se configurent sur la page Administrer Gestion des utilisateurs Droits d accès. Cette page affiche une longue liste des droits d accès disponibles et pour chacun d eux, des cases à cocher correspondant aux différents rôles. Une case cochée signifie que le rôle possède ce droit : Le terme "droits d accès" est ambigu car il ne désigne pas des droits d accès à des pages de contenu, mais bien des droits d exécution sur un ensemble d opérations. b. Un cas pratique : les droits d accès du rôle Enseignant Il s agit ici de donner des droits d accès au rôle Enseignant précédemment créé. Ce groupe d utilisateur aura le droit d accéder au contenu et d effectuer tout type d opération sur les contenus de type Document : - 2 -

82 Les droits ci dessus ne sont pas tous traduits. Cela s explique par le fait que les traductions, notamment française, peuvent être incomplètes. Les traductions sont en effet continuellement en cours de travaux et toute personne peut en devenir contributeur. 3. La création d un utilisateur a. Les interfaces Un compte utilisateur est un élément permettant à un utilisateur d enregistrer ses informations sur le site, et au site de s en servir. En standard, le compte utilisateur ne comporte que très peu d informations, mais il est possible d en rajouter via des modules standard ou supplémentaires

83 Pour plus d information sur le concept de compte utilisateur, cf. chapitre Drupal et son architecture La gestion des utilisateurs et de leurs droits d accès. Les utilisateurs sont gérés sur la page Administrer Gestion des utilisateurs Utilisateurs. Cette page permet de lister les utilisateurs du site : Les utilisateurs du système peuvent être nombreux et cette page propose un ensemble d options de filtrage pour retrouver les utilisateurs plus facilement. Il existe également dans la zone Options de mise à jour un ensemble d options permettant de réaliser des opérations en masse sur les utilisateurs cochés. Un système d onglet placé en haut de la page permet de lister les utilisateurs ou d en ajouter un nouveau via le bouton Ajouter un utilisateur. Le formulaire qui s affiche alors est composé de deux parties : Informations du compte - 4 -

84 Il s agit des informations générales du compte utilisateur telles que l identifiant de l utilisateur, le mot de passe, l adresse e mail, etc. Paramètres des langues Cette partie de formulaire permet de choisir la langue par défaut de l utilisateur. b. Un cas pratique : l utilisateur jdupont Il s agit ici de créer un utilisateur dont l identifiant est jdupont, l adresse e mail et le mot de passe JduponT2010. Pour créer ce compte, il suffit d aller sur la page Administrer Gestion des utilisateurs Utilisateurs puis de cliquer sur Ajouter un utilisateur en haut de la page. Les informations saisies dans le formulaire doivent correspondre à la copie d écran suivante : - 5 -

85 On pourra remarquer dans cette copie d écran que l utilisateur est noté comme actif, c est à dire qu il sera autorisé à se connecter. La case correspondant au rôle Enseignant est également cochée, ce qui signifie qu il possédera les droits d accès attribués à ce groupe. Enfin, à la création d un utilisateur, et plus précisément à la saisie d un mot de passe, Drupal indique si le mot de passe est assez sécurisé ou non (mot de passe complexe) et si la confirmation de mot de passe correspond au mot de passe lui même

86 Conclusion Si le chapitre précédent présentait les éléments théoriques, celui ci a permis de montrer l utilisation de la plate forme Drupal en termes de gestion de contenu, de gestion des utilisateurs et de structuration des pages. Ce chapitre a décrit les différents processus de modélisation (création de types de contenu, création de vocabulaire), d insertion de contenu (création de nœud, création de terme) et de définition d accès (création d utilisateurs, de rôles et de droits d accès). Bien que moins technique, cette partie a été essentielle pour expliquer les principaux points d utilisation qu il est nécessaire d assimiler pour la mise en place de la plate forme et la bonne configuration des éléments structurants

87 L importance des modules Ce qui rend les CMS souples et puissants, c est la possibilité de rajouter autant de fonctionnalités que l on souhaite sans altérer le code interne de l outil. Ces rajouts se font par le biais de plugins, parties de code qui viennent se "brancher" sur l outil existant et qui permettent de modifier son comportement. On appelle cela des modules. Les modules sont des briques qui se greffent sur la plate forme Drupal, permettant ainsi d accroître le nombre de fonctionnalités et d augmenter l attrait du site. Sans conteste, le maître mot des modules est "évolution". Les modules se distinguent en deux catégories : les modules standard et les modules supplémentaires. Les modules standard sont fournis avec Drupal et permettent d ajouter des fonctionnalités classiques telles qu un forum, un système de blog ou encore des sondages. Les modules supplémentaires, quant à eux, ont été réalisés par d autres équipes que celles de Drupal, souvent même par des contributeurs isolés. Le schéma suivant présente le mode de fonctionnement des modules : Il ne s agit pas seulement de réutiliser les modules existants (on essaie toujours de ne pas réinventer la roue), même si dans de nombreux cas il est préférable de le faire. Il s agit également de développer soi même avec les modules des fonctionnalités spécifiques au projet concerné : la modification de formulaires et la création de nouveaux menus ou blocs font partie intégrante des développements d un projet Drupal. Les modules détiennent une place toute particulière au sein de la plate forme car ce sont eux qui en composent le moteur. En effet, ils s occupent de la création de la majorité des blocs et des menus, gèrent l utilisation des fonctions de thème ou l utilisation des fichiers de template. Ce sont eux également qui gèrent la structure des formulaires et leur modification éventuelle. Bref, sans les modules, Drupal serait une plate forme figée, incapable d évoluer et de répondre aux besoins des projets

88 La gestion des modules 1. L installation, la désinstallation et la mise à jour a. L installation Pour utiliser un module, il est nécessaire tout d abord d indiquer au système que le module existe et est utilisable. Cette phase de référencement du module au sein du moteur est réalisée par son installation. Installer un module sous Drupal consiste tout d abord à copier son répertoire dans le dossier du site prévu à cet effet. Pour respecter le principe de surcharge des fonctions, et pour ne pas modifier directement le code interne de la plate forme, il est nécessaire de créer le répertoire sites/all/modules. Tous les nouveaux modules qui doivent être installés doivent être copiés dans ce répertoire. Le répertoire "sites/all/modules" est commun à l ensemble du site et de ses sous sites. Il est également possible de mettre en place des modules spécifiques pour un sous site donné en créant le répertoire adéquat. Au contraire, les modules standard, donc installés par défaut avec Drupal, sont présents dans le répertoire modules : Techniquement, une fois le répertoire copié, Drupal note que le module est disponible et peut être activé. Cette opération est réalisée lors de l affichage de la page Administrer Construction du site Modules : Drupal liste à ce moment l ensemble des modules présents sur le site et les propose à l activation ou à la désactivation. Cela étant, si le module possède des directives de création d un schéma (un ensemble de tables SQL supplémentaires), alors ces directives ne seront réellement prises en compte qu à la première activation (ce que l on appelle l installation). Les modules installés sont disponibles dans la page Administrer Construction du site Modules, dont un échantillon est présenté par la capture suivante : - 1-

89 La page liste les modules disponibles en mettant en valeur leurs dépendances. Si des dépendances ne sont pas satisfaites mais que les modules concernés sont disponibles sur la plateforme (mais inactifs), Drupal propose automatiquement d activer ces dépendances. b. La désinstallation Sur la page Administrer Construction du site Modules, un onglet est disponible en haut de la page, permettant d accéder à la page de désinstallation des modules : Un clic sur le bouton Désinstaller permet d accéder à la page de désinstallation des modules : - 2 -

90 N apparaissent dans la liste que les modules qui ont précédemment été installés mais qui sont actuellement désactivés. Cette fonctionnalité est surtout utilisée pour supprimer un schéma de la base de données créé par un module particulier. c. La mise à jour Comme vu précédemment, un module est susceptible de créer un schéma de base de données particulier lors de son installation. Les modules étant voués à évoluer, il est possible que ce schéma évolue dans le même temps : ajout de nouvelles colonnes ou de nouvelles tables sont choses courantes. Or, le schéma étant créé lors de la première activation du module, lorsqu une mise à jour est effectuée sur ce module, lors du remplacement de l ancien répertoire du module concerné par le nouveau, Drupal ne met pas à jour directement son schéma. Pour réaliser cette opération, il est nécessaire de se rendre sur la page Administrer Construction du site Modules et dans le texte préliminaire se trouve un lien pointant sur le fichier update.php situé à la racine du site : - 3 -

91 Un clic sur le lien update.php affiche une page précisant qu une sauvegarde de la base de données est tout à fait indiquée avant la mise à jour des modules : En cliquant sur le bouton Continue, une page vous propose de sélectionner la ou les versions des modules que vous voulez mettre à jour. Par défaut, Drupal trouve les versions qui ne sont pas installées : - 4 -

92 2. L activation et la désactivation Drupal propose un système simple pour la gestion des modules dont la liste est affichée sur la page Administrer Construction du site Modules. Pour activer ou désactiver un module, il suffit respectivement de cocher ou décocher les cases correspondantes. Par exemple, la copie d écran suivante montre trois modules Token, Token actions et TokenSTARTER dont seul le premier est activé : Cet exemple montre en réalité plusieurs aspects intéressants de la liste des modules

93 D abord, Drupal met en avant les différentes dépendances, respectées ou non, en indiquant pour chaque module : Les modules requis pour activer le module concerné (ligne "Dépend de "). Les modules dont dépend le module concerné (ligne "Requis par "). Chacune de ces dépendances est notée enabled ou disabled pour indiquer si cette dépendance est respectée (le module est installé) ou non. Une dépendance peut également être notée missing si jamais le module concerné ne se trouve pas sur la plate forme. Ensuite, les modules sont organisés sous forme de package (groupe de modules). Dans l exemple ci dessus, le package se nomme Autre. Il s agit du titre de la zone. En effet, les modules doivent être regroupés selon une logique particulière pour une meilleure maintenance du site

94 Les modules standard Les modules standard sont les modules fournis par Drupal. Certains peuvent être désactivés, d autres non. On parlera notamment de modules facultatifs et de modules obligatoires. Il existe en effet des modules standard qui n ont pas la possibilité d être désactivés puisque nécessaires au bon fonctionnement du système. Ces modules sont disponibles dans le package Core obligatoire. Ces modules sont : Block : permet d intégrer un système de bloc. Filter : permet de filtrer les données avant qu elles ne soient affichées. Node : permet d intégrer un système de nœuds. System : permet d administrer Drupal. User : permet d intégrer un système de comptes utilisateurs. D autres sont désactivés par défaut, mais peuvent être activés en fonction des besoins du projet. Certains sont même activés à l installation de la plate forme. Ces modules sont disponibles dans le package Core facultatif : Ces modules sont détaillés ci dessous : Aggregator : permet d agréger du contenu syndiqué (Flux RSS par exemple)

95 Blog : fournit des outils permettant de mettre en place une plate forme de blog. Blog API : permet de poster des articles de blog via XML RPC. Book : permet de structurer les contenus de manière hiérarchique. Color : permet de modifier le schéma de couleur pour les thèmes. Comment : permet d intégrer un système de commentaires. Contact : permet d ajouter un formulaire de contact. Content translation : permet aux contenus d être traduits. Database logging : stocke les informations sur les événements dans la base de données. Forum : fournit les outils permettant de mettre en place un forum. Help : gère l affichage de l aide en ligne. Locale : ajoute des outils de traduction et permet de traduire l interface utilisateur. Menu : permet d intégrer un système de menu. OpenID : permet d intégrer le système OpenID sur la plate forme. Path : permet à l utilisateur de gérer les chemins d accès aux contenus. PHP filter : permet à du code PHP d être utilisé dans certaines parties du site dont les contenus. Ping : permet d alerter d autres sites si des modifications surviennent. Poll : permet d intégrer un système de sondage. Profile : permet d intégrer un système de champs de profil pour les utilisateurs. Search : permet d intégrer un système de recherche. Statistics : enregistre des informations à des fins statistiques. Syslog : stocke les informations sur les événements dans le syslog. Taxonomy : permet d intégrer un système de taxonomie. Throttle : permet d intégrer un système de contrôle de l encombrement du site. Tracker : permet le suivi des contributions des utilisateurs. Trigger : permet à des actions d être lancées à la suite d événements particuliers. Update status : permet de vérifier si des mises à jour de Drupal sont disponibles. Upload : permet au contenu d intégrer un champ spécifique pour le transfert de fichier

96 Les modules additionnels 1. Introduction Comme expliqué plus haut, les modules supplémentaires sont à copier dans le répertoire sites/all/modules pour qu ils puissent être référencés par Drupal. Ces modules doivent également être activés pour être utilisés, tout comme les modules standard. Ces modules additionnels sont de toutes sortes : modification de la structure des données, apport de nouvelles fonctionnalités de recherche ou encore simplification de la récupération des données et de leur affichage sont des exemples très courants. Il existe une grande quantité de modules sur le site de Drupal qui peuvent être téléchargés à l adresse suivante : La page de téléchargement liste l ensemble des modules en indiquant pour chacun un descriptif de sa fonction, et des liens pour le télécharger en fonction des différentes versions de Drupal proposées. Par exemple, le module Devel, module utilitaire pour les développeurs et intégrateurs, est disponible dans la liste avec la présentation suivante : Généralement, pour chaque téléchargement est indiqué : Si le téléchargement est en version stable (il n est indiqué que le numéro de version), de couleur verte. Si le téléchargement est en version beta (le mot clé beta est spécifié dans le numéro de version), de couleur jaune. Si le téléchargement est en version de développement (le mot clé dev est spécifié dans le numéro de version), de couleur rouge. 2. Un cas pratique Il s agit ici de prendre pour exemple l installation d un module additionnel et de le rajouter à un site basé sur la plate forme Drupal. Le module concerné sera le module nommé Administration menu, permettant de rajouter dans les pages une barre de menu d administration. Cette barre reprend toutes les parties disponibles dans la zone d administration mais permet des accès plus rapides à ces parties. Pour l installer, il suffit de suivre les étapes suivantes : Télécharger le module sur la page puis lancer une recherche sur les mots Administration menu. Le module apparaît dans la liste : - 1-

97 Cliquer sur le lien Download de la ligne correspondant à la version 6.X 1.5, puis enregistrer le fichier sur la machine locale. Décompresser l archive dans sites/all/modules/admin_menu : le répertoire sites/all/modules de manière à obtenir le répertoire Le module apparaît alors dans la liste des modules de la page Administrer Construction du site Modules : Cocher la case correspondant au module et cliquer sur le bouton Enregistrer la configuration situé en bas de la page. Le module apporte un nouveau menu situé en haut de la page : - 2- Le module apporte son lot de paramètres disponibles dans la page Administrer Configuration du site Administration menu.

98 3. L extension des types de contenu avec CCK a. Le principe Drupal permet de créer des types structurants appelés types de contenu permettant de regrouper des informations selon une certaine logique. Malgré cela, le système reste assez figé car restreint aux seules données fournies par Drupal : un titre et un corps. Il existe un module permettant de rajouter des champs aux types de contenu pour qu ils puissent correspondre parfaitement à la conception du projet : un champ image pour un type photo ou encore un champ éditeur pour un type livre. Il s agit du module CCK (Content Construction Kit). Ce module est primordial pour la réalisation d un site et contribue à la souplesse du système. Le module CCK est si important qu il a été intégré à la version 7 de Drupal. Ce module est disponible en téléchargement sur Il n y a pas besoin de lancer une recherche car il apparaît dans les premiers modules de la page. Une fois copié sur le site, le module apparaît dans la liste des modules : - 3-

99 En réalité, CCK est livré avec plusieurs modules qui en dépendent, lesquels sont décrits ci dessous : Content : il s agit du module principal, permettant de rajouter de nouveaux champs aux types de contenu. Content Copy : permet d importer et d exporter la définition des champs rajoutés à un type. Ce module est utile en cours de développement : les champs ajoutés sur la machine locale peuvent facilement être répercutés en ligne via cet export. Content Permissions : permet de définir des droits d accès sur les champs eux mêmes et non plus seulement sur les types de contenu. Fieldgroup : permet de regrouper les champs (par exemple, tous les champs correspondant à une adresse ou à un profil utilisateur). Node Reference : permet d ajouter un type de champ établissant une relation entre deux ou plusieurs contenus de même type. Number : permet d ajouter un type de champ correspondant à une valeur numérique. Option Widgets : permet de définir des composants pour certains types de champs (par exemple, pour une zone de saisie, il est possible de choisir entre une zone de saisie simple, une zone de saisie sur plusieurs lignes, etc.). Text : permet d ajouter un type de champ correspondant à une zone de saisie. User Reference : permet d ajouter un type de champ établissant une relation entre un nœud et un ou plusieurs utilisateurs. Le module CCK rajoute des fonctionnalités au sein du formulaire des types de contenu. Pour gérer les champs, il suffit d aller sur la page Administrer Gestion du contenu Types de contenu : - 4 -

100 Cette page est maintenant agrémentée de plusieurs onglets supplémentaires permettant notamment d importer et d exporter des champs. Il existe également pour chaque type de contenu un nouveau lien nommé gérer les champs permettant d accéder à la gestion des champs du type. Cette page est divisée en deux parties : La liste des champs existants : Cette liste recense les champs existants, et au départ, tous les champs que Drupal propose par défaut. Ceux qui ne sont pas gérés par CCK ne sont pas administrables sur cette page et ne peuvent pas être supprimés

101 On remarque notamment les champs Titre du document, Description, etc. Bien que certains champs ne puissent pas être supprimés ou modifiés, tous peuvent être réorganisés. Le formulaire d ajout de champ : Ce formulaire permet de créer soit un nouveau champ en spécifiant son type et éventuellement son composant (widget), soit de créer un nouveau groupe. Pour chacun de ces deux éléments, il est nécessaire de saisir un libellé (étiquette) et un nom (nom machine). Le module est prévu pour réutiliser les champs créés dans d autres types de contenu. Si CCK en détecte, il les proposera dans le formulaire d ajout de champ en rajoutant une nouvelle zone dans le formulaire : Cette nouvelle zone permet de sélectionner un champ existant dans la liste, et de spécifier son libellé à l intérieur du type de contenu courant. Si le libellé d un champ peut être différent pour chaque type de contenu, son nom machine ainsi que ses paramètres de configuration sont forcément communs. b. Le type de champ Text Un des champs les plus simples à utiliser, mais aussi le plus courant, est le type de champ Text. Ce type de champ est utilisé pour diverses choses : Zone de saisie sur une ligne. Zone de saisie sur plusieurs lignes. Liste déroulante. Boutons radio. Case à cocher. Pour cet exemple, il s agit de reprendre le type de contenu Document créé dans le chapitre précédent et d y ajouter - 6 -

102 un champ Copyright, zone de saisie du copyright, et un champ Catégorie, liste déroulante contenant les valeurs Papier et Électronique. Pour cela il suffit d aller sur la page Administrer Gestion du contenu Types de contenu puis de cliquer sur le bouton gérer les champs de la ligne correspondant au type Document. Le formulaire doit être rempli de la sorte : Après avoir cliqué sur le bouton Enregistrer, une page de configuration du champ s affiche. CCK permet à l utilisateur de paramétrer chaque champ ajouté. De façon générale, cette page est divisée en deux parties : Paramètres de letypedecontenu (où letypedecontenu est remplacé par le nom du type concerné) : Pour un champ de type Text, il est possible de configurer la taille de la zone. Par défaut, la valeur est de 60 caractères. Drupal permet également de saisir un texte d aide à la saisie qui orientera l utilisateur lors de la création d un nœud. Paramètres globaux : - 7 -

103 Cette partie permet de définir si le champ est obligatoire, le nombre de valeurs maximum et si la saisie est un texte simple ou filtré (autorisation ou non des caractères HTML). Une fois enregistré, le champ apparaît dans la liste : Contrairement aux champs par défaut, il est possible de supprimer le champ Copyright qui vient d être ajouté. Pour ajouter le champ Catégorie, il suffit de renseigner le formulaire d ajout de la sorte : Dans la page de configuration, la partie importante est la saisie des valeurs disponibles (on parle de valeurs autorisées) : - 8 -

104 Les valeurs peuvent être saisies de deux façons différentes : soit les valeurs sont directement saisies dans la zone, avec à la fin de chaque valeur un retour à la ligne, soit les valeurs sont précédées par un mot clé ou un entier (le mot clé ou entier et la valeur doivent être séparés par le caractère " "). Dans le premier cas, quand l utilisateur choisira une option dans la liste déroulante, c est la valeur elle même qui sera soumise avec le formulaire, dans le second il s agira du mot clé ou de l entier. c. Le type de champ Node Reference Il est souvent utile de faire référence à un autre nœ ud lorsqu on en crée un. En effet, on pourrait prendre l exemple d un produit d un site marchand qui présente sur sa fiche produit différents produits associés. Cette relation peut être réalisée avec un champ de type Node Reference. Toujours dans le cas du type de contenu Document, un champ va être rajouté pour permettre d associer à ce contenu un ou plusieurs autres documents. Ce champ se nomme Documents associés. Pour rajouter ce champ, il suffit de remplir le formulaire d ajout de la façon suivante : Ici, le composant permettant de choisir le contenu référencé à la création du nœ ud est de type Champ texte à autocomplètement, ce qui signifie que l utilisateur disposera d une zone de saisie dans laquelle il suffira de saisir une partie du titre du document recherché pour que Drupal le propose à la sélection. Le paramétrage de ce champ requiert quelques informations spécifiques comme le type de l autocomplétion, pour définir si le titre doit commencer par la saisie de l utilisateur ou s il doit simplement contenir cette saisie : Drupal demande également quels sont les types de contenu des nœ uds pouvant être référencés par ce champ : - 9-

105 d. Le type de champ File Comme il a été vu précédemment, CCK ne propose pas de solution pour ajouter un champ pouvant servir à transférer un fichier (on parle aussi de l upload de fichier). Heureusement, il existe des modules permettant de rajouter des types de champs (fichier, date, image, etc.), faisant ainsi évoluer le module CCK et Drupal. C est le module FileField qui permet de gérer les fichiers dans les types de contenus. Une fois installé et activé, un nouveau type de champ et un nouveau composant sont disponibles dans le formulaire d ajout de champ. Il est alors facile de rajouter un champ Fichier au sein du type de contenu Document. La saisie du formulaire pourrait être la suivante : Le formulaire de configuration du champ est par contre beaucoup plus complet car il permet de préciser des aspects importants du transfert des fichiers, tant sur l ergonomie que sur la sécurité. En effet, il permet dans un premier temps de spécifier les extensions autorisées, les tailles physiques (poids) minimale et maximale des fichiers ainsi que le chemin d accès au répertoire stockant les fichiers transférés :

106 Dans un deuxième temps, il est possible de définir si le champ est visible lorsque le nœud est affiché sous forme de liste et si l utilisateur, au moment du transfert, peut renseigner une description : e. Le regroupement de champs Pour plus de facilité lors de la création des nœuds, il est plus pratique de regrouper certains champs en fonction de leur utilité. Dans l exemple du type de contenu Document, un groupe Informations pourrait être créé et tous les champs placés à l intérieur. Pour créer le groupe informations, il suffit de remplir le formulaire de la façon suivante :

107 Une fois le groupe créé, il apparaît comme l un des champs, dans la liste au dessus : Pour placer les champs à l intérieur, il suffit d utiliser les flèches situées à gauche de chaque champ pour les déplacer à l intérieur du groupe : Les champs qui ont été déplacés sont marqués d une étoile orange. Pour indiquer que les champs sont placés à l intérieur d un groupe, les flèches des composants qui s y trouvent sont indentées par rapport à la flèche du groupe. Tout comme les composants, les groupes peuvent être déplacés dans la liste pour apparaître à une place bien spécifique. Au final, les champs du type Document s organisent de la façon suivante :

108 f. La création d un nœud de type Document Maintenant que le type de contenu Document est complet, il s agit de créer un nœud en définissant des valeurs pour chacun des champs rajoutés à l aide de CCK. Pour créer un tel nœud, il suffit d aller sur la page Créer un contenu puis de cliquer sur le nom du type. Le formulaire est d abord composé du titre et du corps : Puis, cette partie est suivie par le groupe Informations, créé précédemment :

109 Chacun des nœuds apparaît en fonction des paramètres de configuration définis pour chacun d entre eux. 4. La gestion de l affichage avec Views a. Le principe Le seul mécanisme, sous Drupal, permettant de lister un ensemble de contenu, est de cocher la case Promu en page d accueil lors de l édition des contenus en question. Cette fonctionnalité est pourtant bien utile pour les projets. Par exemple, un site de presse possède nécessairement une page listant les archives du site par rapport à une date donnée, ou bien une page listant les articles d une catégorie particulière. Pour réaliser de telles pages sans programmation, il est nécessaire d installer un module supplémentaire. Ce module se nomme Views. En effet, Views est un module capable de générer une requête SQL et d injecter le résultat à travers un ensemble de fichiers de template afin de composer la page finale. Une vue se compose d un ensemble d affichages, chacun d un type particulier, qui sont des éléments structurants : une page, un bloc, etc. Chacun de ces éléments est basé sur des fichiers de template pour l affichage des données. Certains de ces fichiers sont communs à l ensemble des types d affichages, certains sont communs à l ensemble des vues, et d autres sont spécifiques à chaque affichage voire même à chaque élément rapatrié par la vue. Le schéma suivant présente cette architecture :

110 Le schéma ci dessus présente deux vues : dans la première, les affichages 1 et 2 se partagent le template 1 alors que le numéro 3 partage le même template que le numéro 1 de la deuxième vue. Dans cette dernière, l affichage 2 possède son propre template alors que les champs "titre" et "corps" de l affichage 3 ont chacun leur propre template. De la même façon que le module CCK, le module Views est disponible en téléchargement à l adresse Là encore, il n est pas nécessaire de lancer une recherche sur le nom du module, ce dernier apparaissant directement sur la première page. Une fois copié sur la plate forme, le module est disponible dans la liste des modules : Views fournit en réalité plusieurs modules : Views : il s agit du module principal permettant de rapatrier les données. Views exporter : permet d exporter des vues. Cette fonctionnalité est bien pratique lors du développement du projet. En effet, les vues peuvent être développées sur un poste local et être exportées au moment de la mise en intégration

111 Views UI : fournit une interface graphique pour créer les différentes requêtes et la mise en forme des données. Une fois les modules activés, la page Administrer Construction du site Views est disponible. Cette page permet de lister les vues existantes : Il existe par défaut un ensemble de vues correspondant aux fonctionnalités classiques d un site : liste d archives, liste de commentaires, etc. Ces vues par défaut sont désactivées. Un clic sur le bouton Activer correspondant à la vue permet de l initialiser. Un système d onglets situé en haut de la page permet de créer une nouvelle vue, d en importer une existante ainsi que de paramétrer l outil. b. Les principaux types de vues Lors de la création d une vue, Drupal demande de choisir le type de vue. Ce type correspond au type des informations qui seront récupérées par la vue. Il existe par défaut sept possibilités : Node : les résultats renvoyés sont des nœ uds. Commentaire : les résultats renvoyés sont des commentaires. Fichier : les résultats renvoyés sont des fichiers gérés par Drupal ou par des modules spécifiques Locale source : les résultats renvoyés sont des chaînes de caractères de traduction. Il s agit des chaînes sources. Pour plus d information sur le système de traduction, cf. chapitre Les fonctions pratiques de Drupal La manipulation de chaînes de caractères.

112 Révision du nœud : les résultats renvoyés sont des révisions. Terme : les résultats renvoyés sont des termes. Utilisateur : les résultats renvoyés sont des informations relatives aux comptes utilisateurs. Pour créer une vue, il suffit d aller sur la page Administrer Construction du site Views puis de cliquer sur le bouton Ajouter situé en haut de la page : Drupal demande de saisir plusieurs informations : Nom de la vue : il s agit du nom machine de la vue (caractères spéciaux interdits). Description de la vue : il s agit plus ou moins du libellé de la vue. Cette description vise à expliquer les différents types d affichages qui y sont contenus. Étiquette de la vue : cette étiquette permet de retrouver plus facilement la vue dans la liste. Le type de vue : il s agit du type de résultat à récupérer. Une fois ces informations de base déterminées, le formulaire de configuration s affiche :

113 Le formulaire de création de vue se décompose en trois zones principales : Le choix de l affichage : il s agit de la barre d onglet sur la gauche. La configuration de la vue : il s agit de la zone centrale. La visualisation : il s agit de la zone située en bas de page correspondant à la prévisualisation de la vue. c. Les principaux types d affichage À l intérieur d une vue se trouvent plusieurs affichages qui peuvent être de types différents : liste de résultats sous forme de page, liste de résultats sous forme de bloc, etc. Ces types d affichages correspondent à des éléments structurants de Drupal. Ces éléments seront disponibles sur le site d une manière ou d une autre : une page sera disponible via son chemin d accès, un bloc sera disponible dans la liste des blocs, etc. Les types d affichages par défaut sont au nombre de quatre : Page : les résultats obtenus sont affichés dans une page complète. Bloc : les résultats obtenus sont affichés dans un bloc. Flux : les résultats obtenus sont destinés à être utilisés dans un flux RSS. Fichier attaché : les résultats obtenus sont des fichiers qui peuvent être utilisés par d autres affichages.

114 Les affichages correspondent dans la vue à une série d onglets, chaque onglet correspondant à un élément structurant. Par défaut, il existe un onglet nommé Paramètres par défaut correspondant aux paramètres communs à l ensemble des onglets. Pour ajouter un nouvel affichage, il suffit de sélectionner son type dans la liste déroulante puis de cliquer sur le bouton Nouvel affichage. Un nouvel onglet est ainsi ajouté : Le bouton Analyser permet de vérifier la cohérence de la vue et les oublis éventuels, comme par exemple le fait de ne définir aucun contrôle d accès ou aucun champ à afficher. d. La configuration La zone principale correspond à la configuration de la vue. Une vue est en réalité une simple requête SQL et cette configuration permet de définir les propriétés de la requête : colonnes à afficher (champs), critères de sélection (filtres), jointures (relations), etc

115 Cette zone est divisée en huit parties : Paramètres de base : il s agit de définir la configuration générale de l affichage, comme par exemple le titre du bloc ou de la page, définir s il doit y avoir une pagination et si elle doit utiliser Ajax, le style d affichage (en tableau, en liste), etc. Paramètres de la page : il peut s agir également des paramètres du bloc si le type d affichage correspond. Il s agit d informations supplémentaires comme par exemple l URL de la page. Relations : il s agit des liens que peut avoir le nœud avec d autres entités de Drupal (nœuds, utilisateurs, etc.). Arguments : il s agit d arguments spécifiques sur lesquels la vue se base pour rapatrier les données. Les arguments permettent de dynamiser les vues. Si les arguments fonctionnent correctement avec les pages, ils ne peuvent pas être utilisés avec des affichages de type "Bloc". Champs : il s agit des champs à afficher. Il est possible de définir si les nœuds sont rapatriés dans leur intégralité, auquel cas aucun champ n est à spécifier. Critères de tri : il s agit du tri qui doit être appliqué sur le résultat final. Filtres : il s agit de la sélection qui doit être appliquée sur les nœuds. Zone de paramétrage : il s agit du paramétrage de chaque élément à configurer. En effet, à chaque ajout de champs, relation ou filtre, une zone s affiche pour sélectionner les éléments de paramétrage :

116 e. La visualisation Au cours de la création d une vue, il n est pas nécessaire de l enregistrer et d accéder à la page affichant les données pour la tester. Il existe en effet une zone située en bas nommée Prévisualisation en direct permettant d afficher un aperçu de l affichage : Cette zone permet dans un premier temps de choisir l affichage à tester avec les éventuels arguments, et affiche dans un second temps un aperçu du résultat. En dessous se trouve la requête SQL qui a été générée par le module Views et quelques statistiques comme la

117 durée d exécution de la requête. f. La création d une page de nœuds Il s agit ici de créer une vue de type Node contenant un affichage de type Page permettant de lister les différents nœuds de type Document. La création de cette vue commence par la sélection du type de vue : Dans le formulaire de configuration, un affichage de type Page doit être sélectionné : Les informations de base de cet affichage doivent être saisies de la sorte :

118 Au cours de la configuration d un affichage différent des paramètres par défaut, Views propose un bouton Supplanter (ou Remplacer selon les traductions). Ce bouton est utilisé pour indiquer à Views que les paramètres courants sont spécifiques à l affichage. Sans cela, ce sont les paramètres par défaut qui sont modifiés. Les paramètres de la page sont des plus simples : Les champs à récupérer sont la catégorie, le copyright, le fichier du document et le titre : Il est tout de même plus commode de voir le titre en premier. Il est possible de réorganiser les champs en cliquant sur le bouton possédant deux petites flèches allant vers le haut et vers le bas : Pour déplacer les champs, il suffit de déplacer les flèches situées sur la gauche des lignes :

119 La vue doit retourner des nœuds de type Document publiés. Pour cela les filtres suivants doivent être rajoutés : Une fois la vue enregistrée, la page est disponible à l adresse documents/list : g. La création d un bloc de termes Il s agit maintenant de créer un bloc de termes issus du vocabulaire Type de support. La création de cette vue commence par le choix du type, à savoir Terme :

120 Dans la page de configuration de la vue, il est nécessaire de rajouter un affichage de type Bloc : Les paramètres de base doivent être définis comme le montre la copie d écran suivante :

121 Cette fois ci, rien de particulier n est à configurer dans la rubrique Paramètres des blocs. Le vocabulaire des termes récupérés sera le vocabulaire Type de support : Enfin, le seul champ qui est affiché par le bloc est le terme lui même : Une fois la vue enregistrée, le bloc est disponible dans la liste des blocs sur la page Administrer Construction du site Blocs : Les blocs créés par des vues voient leur nom précédé par le nom machine de la vue, suivi du nom du bloc lui même. Une fois mis en place dans une région, le bloc affiche les termes du vocabulaire défini : 5. La gestion du traitement des images avec ImageCache a. Le module ImageField Comme vu précédemment, il est possible d associer un fichier à un contenu. Dans la majeure partie des sites, il est nécessaire d y associer des images : bannière, vignette ou encore photo. Comme pour les champs de type Fichier, il existe un module capable de rajouter un type de champ, ou plus précisément un composant, permettant de spécifier à Drupal que le fichier tranféré est une image. Par conséquent,

122 Drupal saura en voyant un tel champ qu il faudra afficher le fichier et non en permettre le téléchargement. Le module qui permet de rajouter un composant Image se nomme ImageField et est téléchargeable à l adresse Une fois copié, le module apparaît dans la rubrique CCK : L installation et l activation du module permet, pour un champ de type Fichier, d obtenir un nouveau composant nommé Image. Un champ nommé Vignette est ajouté au type de contenu Document et permettra d afficher l image sur la fiche d un document. Pour cela, il suffit d aller sur la page Administrer Gestion du contenu Type de contenu puis de cliquer sur le bouton gérer les champs. Dans le formulaire d ajout de champ, les informations suivantes sont à saisir : La configuration du champ est la même qu un champ de type Fichier. Une fois ajouté, un champ Vignette est disponible dans le formulaire d édition d un nœ ud de type Document :

123 Une fois enregistrée, l image est affichée sur la page du nœud : La taille de l image n est pas administrable. Il est en effet impossible en l état de redimensionner une image avec une taille particulière. b. Les modules ImageAPI et ImageCache Le module ImageCache est un module permettant de réaliser à la volée des traitements sur les images. Il permet notamment de créer des vignettes en redimensionnant une image ou en modifiant son échelle par exemple, mais pas seulement. En effet, ImageCache possède plusieurs opérations supplémentaires telles que la rotation, la modification des niveaux de gris, la découpe d une partie de l image, etc. En réalité, ces différentes opérations ne s appliquent pas directement sur une image. L image est envoyée dans une sorte de filtre appelé profil, permettant d appliquer un certain nombre de traitements sur cette image. En effet, ImageCache permet de créer des profils d images sur lesquels s applique un ensemble d opérations. Lorsqu une image doit être redimensionnée, elle passe par l un de ces profils et toutes les opérations qui y sont rattachées sont appliquées sur celle ci pour en créer une nouvelle. L image d origine n est pas modifiée. Une copie de l image est réalisée avant les traitements et ceux ci s appliquent sur cette copie. Le schéma suivant présente ce principe :

124 Il est possible de combiner les opérations. ImageCache s appuie sur un autre module nommé ImageAPI qui permet de travailler sur les images. Ce module est la base de beaucoup d autres et est essentiel au même titre que le module CCK sur la plate forme Drupal. Ces deux modules peuvent être téléchargés à l adresse et se trouvent tous deux dans une rubrique, nommée ImageCache, une fois copiés : Les modules fournis avec ImageAPI et ImageCache sont les suivants : ImageAPI : contient toute l API de traitement sur les images. ImageAPI GD2 : permet d utiliser la bibliothèque GD2 lors des traitements. ImageAPI ImageMagick : permet d utiliser la bibliothèque ImageMagick lors des traitements. ImageCache : permet de réaliser des traitements à la volée sur les images, via des profils

125 ImageCache UI : fournit une interface graphique de création des profils pour la manipulation des images. c. La création de profils Pour créer un nouveau profil, il suffit de se rendre sur la page Administrer Construction du site ImageCache. La page affiche les profils existants : L onglet Ajouter un nouveau profil permet d afficher le formulaire très simple de création d un profil, permettant de saisir uniquement le nom du profil : À la création d un profil, un répertoire est automatiquement créé dans le répertoire sites/default/files/imagecache dont le nom correspond au nom du profil. Toutes les images générées à travers ce profil seront stockées dans celui ci. Une fois le profil créé, il est nécessaire de définir les actions à associer à ce profil :

126 La page affiche les différentes opérations disponibles à appliquer au profil. Ces différentes opérations sont : Ajouter Crop : découpe une portion de l image. Ajouter Deprecated Scale : cette action est dépréciée. Elle n est donc plus à utiliser. Ajouter Desaturate : transforme l image en nuance de gris. Ajouter Resize : redimensionne l image sans tenir compte du ratio. Ajouter Rotate : effectue une rotation sur l image. Ajouter Scale : redimensionne l image en tenant compte du ratio. Par exemple, si une image est au format paysage, elle garderait cet aspect, même redimensionnée. Ajouter Scale And Crop : redimensionne l image en gardant le ratio et découpe l image finale. Ajouter Sharpen : modifie la netteté de l image. Dans le cadre de l exemple du type de contenu Document, une action de type Scale est ajoutée au profil document_vignette. Pour ajouter cette action, il suffit de cliquer sur le lien Ajouter Scale et de remplir le formulaire de configuration de l action comme suit :

127 Si le répertoire du profil n existe pas, Drupal le crée automatiquement. Il est possible de configurer ici la taille finale de l image une fois redimensionnée (largeur et hauteur), et d indiquer si l image peut être agrandie. Une fois l action créée, la liste des actions s affiche de nouveau en présentant le résultat final sur le logo Drupal, situé en bas de la page : ImageCache est un module qui peut être utilisé conjointement avec d autres modules tels que Views. Il s agit maintenant d utiliser ce profil document_vignette dans la vue documents créée précédemment qui permet de lister les documents. Le champ Vignette est rajouté à la liste des champs récupérés. Drupal propose de choisir le format d affichage de

128 l image : Dans la liste déroulante, le profil ImageCache document_vignette doit être sélectionné. Lors de l affichage de la page, les images, si elles existent, sont affichées redimensionnées :

129 Conclusion Ce chapitre a permis d aborder le concept le plus important avec Drupal : l évolutivité. Sans cela, Drupal ne serait pas l un des CMS les plus utilisés du marché. Cette évolutivité passe par l utilisation de modules qu il est possible de rajouter à la plate forme. Le grand nombre de modules communautaires disponibles accroît le nombre de fonctionnalités utilisables. Les modules CCK et Views sont les deux modules incontournables dans le processus de développement d un site Web. Ils permettent respectivement de structurer les types de contenu en y rajoutant autant de champs que la modélisation l impose, et de créer un ensemble d affichages permettant de faire ressortir les contenus sous des formes diverses et variées. Imagecache est également l un des modules de Drupal les plus utilisés pour la génération de vignettes et plus généralement le traitement des images. S intégrant parfaitement à CCK et Views, le succès de ce module se comprend aisément. Maintenant que l ensemble des bases de l utilisation de Drupal a été assimilé, les prochains chapitres seront plus axés sur la technique et le développement des modules et des thèmes

130 La structure d un module Un module correspond à un répertoire contenant des fichiers bien particuliers : Un fichier d extension.info : ce fichier contient tout le paramétrage du module (nom, description, package, etc.). Un fichier d extension.module : ce fichier contient tout le code du module. Dans le répertoire d un module, il est possible de mettre des fichiers spécifiques à Drupal (comme le fichier extension.install) et d autres non spécifiques (comme les fichiers CSS, JavaScript, etc.). 1. Le fichier.info Le fichier.info est le fichier de configuration du module. Il s agit d un fichier texte contenant un ensemble de lignes sous forme de paires "clé / valeur". Le nom de ce fichier doit correspondre au nom du module, donc au nom du répertoire parent. Cet aspect est important, car Drupal charge toutes les informations du fichier nommé nomdumodule.info. Par exemple, un module nommé "exemple" doit être composé d un fichier nommé "exemple.info". Les clés principales sont détaillées dans le tableau suivant : Clé Description name description package version core datestamp dependencies Le nom du module. La description du module. Le package dans lequel se trouve le module. La version du module. La version de Drupal avec laquelle le module est compatible. La date de dernière modification du module sous forme de timestamp. Les dépendances nécessaires à l exécution du module. Exemple de fichier ".info" : name = Exemple de module description = Ceci est un module d exemple pour le livre Drupal 6 package = Addvista version = 1.0 core = 6.x 2. Le fichier.module Le fichier.module est le cœur du module : c est le fichier qui contient tout le code PHP du module et qui définit toutes les opérations à réaliser. Bien que son extension ne l exprime pas, il s agit d un fichier PHP. Le fichier.module contient un ensemble de fonctions utilitaires permettant d agir sur le système. On appelle cela des hooks ("crochets" en français). Le système des hooks est décrit plus loin dans ce chapitre. Chaque module doit comporter un fichier.module, dont le nom doit être rigoureusement identique au nom du module concerné, de la même façon que le fichier.info. Par exemple, un module nommé "exemple" doit être composé d un fichier nommé "exemple.module"

131 Exemple de fichier ".module" : <?php function exemple_block($op = list, $delta = 0, $edit = array()){ // CONTENU DE LA FONCTION exemple_block() }//exemple_block() function exemple_search($op = search, $keys = array()) { // CONTENU DE LA FONCTION exemple_search() }//exemple_search() function exemple_menu() { // CONTENU DE LA FONCTION exemple_menu() }//exemple_menu() Toutes les fonctions des modules activés étant chargées au moment de l affichage d une page, il est possible qu il y ait des conflits entre les noms des fonctions utilisées. Pour parer à cela, il est d usage de faire précéder les noms des fonctions par le nom du module dans lequel elles se trouvent. 3. Le fichier.install Le fichier d extension.install est un fichier PHP qui permet de définir les actions à réaliser à l installation du module. Ce fichier doit respecter la norme de nommage de Drupal, à savoir que son nom doit correspondre au nom du module avec l extension.install. En règle générale, ce fichier contient au minimum trois fonctions : Le hook hook_install() Le hook hook_uninstall() Le hook hook_schema() Ces fonctions permettent entre autres de générer un schéma de base supplémentaire (en clair, de nouvelles tables) spécifique au module. Par exemple, pour un module nommé "exemple", le fichier "exemple.install" pourrait ressembler au code suivant : <?php function exemple_install() { // CODE A EXECUTER A L INSTALLATION DU MODULE. }//exemple_install() function exemple_uninstall() { // CODE A EXECUTER A LA DESINSTALLATION DU MODULE. }//exemple_uninstall() function exemple_schema() { // CODE PERMETTANT DE DEFINIR LA STRUCTURE DES TABLES A CREER

132 }//exemple_schema() - 3 -

133 Les hooks 1. Le principe de surcharge De façon générale, on parle du principe de surcharge pour décrire le fait de modifier le comportement d une fonctionnalité (souvent modélisée par une fonction) sans en modifier son code source d origine. Dans les langages orientés objet, par exemple, la surcharge est utilisée dans le cas de méthodes polymorphes (qui peuvent prendre plusieurs formes). Ce principe s applique dans beaucoup de CMS, notamment Drupal. L utilisation de ce procédé sur la plate forme Drupal est née du besoin de pouvoir rajouter un ensemble d instructions au moment de l exécution de certaines fonctionnalités intégrées au moteur (enregistrement ou affichage d un nœud, affichage de blocs, etc.) sans modifier le code interne du CMS. En effet, ce type d amélioration empêcherait toute montée en version du système sans perte des modifications apportées. L utilisation de ce procédé sur la plate forme Drupal passe donc par l utilisation de hook (crochet en français). Un hook est une fonction dont la notation spécifique prend la forme nomdumoduleoudutheme_nomduhook(), et qui sera appelée automatiquement par Drupal au moment opportun. Par exemple, pour effectuer un ensemble d instructions à l enregistrement d un nœud, il suffit de créer un module nommé test et d écrire dans le fichier test.module la fonction test_nodeapi(), le hook hook_nodeapi() étant celui permettant de gérer les opérations sur les nœuds, dont notamment leur enregistrement. Toutes les instructions placées à l intérieur de cette fonction seront par conséquent exécutées. 2. Le fonctionnement En réalité, pour chaque hook exécuté sur la plate forme, Drupal exécute ce même hook sur tous les modules installés et activés. Au cours de la génération d une page, le hook du module standard de Drupal est exécuté et fait appel à son tour à tous les hooks, ici le hook_nodeapi(), sur l ensemble des modules activés. Par exemple, au cours du cycle de création d une page, au moment où le hook hook_nodeapi() est appelé pour rendre l affichage d un nœud, Drupal appelle automatiquement tous les hooks hook_nodeapi() des autres modules actifs. Cet exemple est illustré par le schéma suivant : - 1 -

134 3. L extension du système de hook Il est possible lors du développement d un module, de le rendre évolutif en proposant de nouveaux hooks qui seront appelés au moment de l exécution des fonctionnalités de ce module. Drupal utilise la fonction suivante au sein de ses modules pour parvenir à cela : function module_invoke_all( nom_du_hook, suite, des, paramètres ); En effet, Drupal et ses modules standard, à certains moments clés, exécutent la fonction module_invoke_all() en lui passant comme premier paramètre le nom du hook à exécuter. Tous les autres paramètres seront automatiquement passés au hook appelé. Il est possible d utiliser cette fonction au sein d un module pour créer de nouveaux hooks spécifiques au module courant. Par exemple, nous considérons un module permettant de gérer un ensemble de citations. Une citation peut être exportée dans un format échangeable tel que le format CSV. La fonction suivante est un exemple de fonction du module "exemple" permettant l implémentation du système de hooks : function exemple_export($node) { // INSTRUCTIONS D EXPORT AU FORMAT CSV.. module_invoke_all( export, $node); }//exemple_export() Dans cet exemple, la fonction demande à Drupal de parcourir tous les modules activés et d exécuter une fonction portant le nom du module suivi du mot clé "export". À chacune des fonctions exécutées sera passé un paramètre correspondant au nœud de la citation (ici, la variable $node)

135 Exemple de module faisant appel au hook hook_export(). On considère ici un module nommé "test" : function test_export($node) { // INSTRUCTIONS }//test_export() Dans cet exemple très simple, toutes les instructions présentent dans cette fonction seront exécutées après que l export soit réalisé. 4. Les hooks disponibles Drupal propose un certain nombre de hooks pour modifier le comportement des fonctionnalités. On peut les regrouper en plusieurs catégories : a. Les hooks du système hook_boot() : permet d effectuer un certain nombre de tâches avant le traitement de la requête. Voir aussi le hook hook_init(). Ce hook est exécuté avant que l ensemble des modules soit chargé en mémoire. hook_init() : permet d effectuer un certain nombre de tâches avant le traitement de la requête. Voir aussi le hook hook_boot(). Ce hook est exécuté après que l ensemble des modules est chargé en mémoire. hook_disable() : permet d exécuter un ensemble d instructions juste avant la désactivation d un module. hook_enable() : permet de réaliser un ensemble d instructions après l activation d un module. hook_ping() : permet de réaliser un ping sur un autre serveur. hook_watchdog() : permet de tracer un message lié à un événement. hook_xmlrpc() : permet d enregistrer sur la plate forme un appel XML RPC. hook_flush_caches() : permet d ajouter une liste de table au cache de Drupal. hook_requirements() : permet de réaliser la vérification des pré requis et de réaliser un rapport. hook_system_info_alter() : permet de modifier les informations récupérées dans les fichiers.info du module et du thème. hook_theme_registry_alter() : permet de modifier les informations du registre de thème retournées par le hook hook_theme(). hook_exit() : permet d exécuter des tâches à la fin du traitement de la requête. b. Les hooks de contenu hook_delete() : permet de gérer la suppression d un nœud. hook_insert() : permet de réaliser un ensemble d instructions à l insertion d un nœud. hook_load() : permet de charger des informations spécifiques à un type de nœud. hook_nodeapi() : permet d agir sur les nœuds. hook_node_access_records() : permet de définir les permissions pour un nœud. hook_node_grants() : permet d indiquer au système d accès aux nœuds quelles sont les permissions que l utilisateur possède. hook_node_info() : permet de définir de nouveaux types de contenu. hook_node_operations() : permet d ajouter des opérations en masse sur les nœuds. hook_node_type() : permet d exécuter un ensemble d instructions à la modification d un type de contenu. hook_prepare() : permet d exécuter un ensemble d instructions après qu un nœud a été chargé, mais avant son affichage. hook_update() : permet d exécuter un ensemble d instructions à la modification d un nœud

136 hook_view() : permet d afficher un nœud. hook_filter() : permet de définir des filtres de contenu. hook_filter_tips() : permet de fournir des astuces correspondant à l utilisation des filtres. hook_taxonomy() : permet d agir sur la taxonomie. hook_term_path() : permet aux modules de fournir un chemin secondaire pour les termes qu ils gèrent. c. Les hooks de structure hook_form() : permet d afficher un formulaire d édition d un nœud. hook_forms() : permet de créer un ensemble de formulaires via une fabrique. hook_form_alter() : permet de modifier l affichage d un formulaire. hook_form_form_id_alter() : permet de modifier le formulaire spécifique correspondant à la clé FORM_ID. hook_validate() : permet de vérifier si les données saisies dans le formulaire d un nœud sont cohérentes et valides. hook_menu() : permet de définir les éléments de menu et les appels de page (aussi appelé callbacks). hook_menu_alter() : permet de modifier les données de menu stockées dans la table menu_router après que le hook menu a été invoqué. hook_menu_link_alter() : permet de modifier les données de menu stockées dans la table menu_links après que le hook menu a été invoqué. hook_block() : permet de gérer les blocs. hook_footer() : permet d insérer un ensemble de balises juste avant la balise de fin de page </body>. hook_comment() : permet d implémenter le système de commentaires. hook_theme() : permet de gérer l implémentation du thème du module. hook_elements() : permet au module de déclarer ses propres types d éléments de formulaire, en spécifiant leur valeur par défaut. d. Les hooks utilitaires hook_mail() : permet de préparer un mail en fonction des paramètres passés. Cette fonction est appelée par la fonction drupal_mail(). hook_mail_alter() : permet de modifier le rendu d un mail envoyé par Drupal. Ce hook peut être utilisé pour ajouter un pied de page, un en tête, etc. hook_link() : permet de définir des liens internes. hook_link_alter() : permet de modifier des liens internes avant le rendu d un nœud. hook_translated_menu_link_alter() : permet de modifier un lien après qu il a été traduit mais avant qu il soit affiché. hook_translation_link_alter() : permet d exécuter des instructions au moment de la traduction d un lien. hook_locale() : permet aux modules de définir les différents groupes de textes qui pourront être traduits. hook_help() : permet de fournir une aide en ligne à l utilisateur. hook_file_download() : permet de gérer les accès aux téléchargements des fichiers privés. e. Les hooks de sécurité hook_access() : permet de définir si l utilisateur a le droit d accéder à une opération particulière sur un type de contenu. hook_db_rewrite_sql() : permet de réécrire les requêtes SQL, notamment pour gérer les droits d accès. hook_perm() : permet de définir les permissions utilisateurs. f. Les hooks de module - 4 -

137 hook_install() : permet d installer le schéma de base de données du module et d exécuter un ensemble de tâches. hook_uninstall() : permet de supprimer des tables ou des variables au moment de la désinstallation d un module. hook_update_last_removed() : permet de spécifier un numéro de version qui ne sera plus pris par Drupal à la mise à jour du module. hook_update_n() : permet de réaliser une mise à jour du module. La clé N correspond au numéro de version. hook_update_projects_alter() : permet de modifier la liste des projets avant d insérer les données et de comparer les versions. hook_update_status_alter() : permet de modifier les informations relatives aux mises à jour disponibles pour le module. hook_schema() : permet de définir le schéma de base de données du module. hook_schema_alter() : permet de modifier le schéma de base de données. g. Les hooks de tâche hook_cron() : permet d exécuter des tâches planifiées. hook_actions_delete() : permet d exécuter des instructions après qu une action a été supprimée. hook_action_info() : permet de déclarer les informations liées à une ou plusieurs actions. hook_action_info_alter() : permet de modifier le comportement d une action. hook_hook_info() : permet de définir un ensemble d événements qu il sera possible d assigner à des actions dans l administration du site. hook_profile_alter() : permet de modifier des éléments de profil utilisateur avant qu ils soient affichés. h. Les hooks de recherche hook_search() : permet de définir une recherche personnalisée. hook_search_preprocess() : permet de traiter le texte pour l indexation. hook_update_index() : permet de mettre à jour l index de Drupal. i. Les hooks utilisateur hook_user() : permet de gérer les actions liées aux comptes utilisateurs. hook_user_operations() : permet d ajouter des opérations en masse sur les utilisateurs

138 Quelques hooks en détail 1. Le hook hook_perm() Le hook hook_perm() permet au module qui l implémente de définir des droits d accès spécifiques administrables par l utilisateur. Ces accès seront accordés à certains groupes par l administrateur. Cette fonction retourne un tableau contenant les libellés des droits d accès. Ces droits seront disponibles sur la page d administration Gestion des utilisateurs Droits d accès. Exemple d utilisation de hook_perm() au sein du module "exemple" : Cet exemple permet de rajouter trois droits d accès aux modules : Administrer, Ajouter et Visualiser. function exemple_perm() { return array( Administrer les exemples, Ajouter des exemples, Voir les exemples ); } 2. Le hook hook_block() Le hook hook_block() permet de déclarer et de définir un ensemble de blocs rattachés au module. Tous les blocs définis par ce hook seront disponibles dans la page d administration Administrer Construction du site Blocs. Attention toutefois : les blocs ne seront disponibles que si le module dans lequel ils sont définis est activé. Le prototype de la fonction est la suivante : function hook_block($op = list, $delta = 0, $edit = array()) Les paramètres sont détaillés ci dessous : $op : il s agit du type d opération à réaliser à l exécution du hook. Les différentes valeurs possibles sont : list : consiste à déclarer les blocs rendus disponibles par le module. configure : permet de définir les formulaires de configuration des blocs déclarés par l opération list. save : cette opération est réalisée à l enregistrement de la configuration des blocs. view : permet de définir le rendu à l affichage des blocs dans les régions. $delta : il s agit d une valeur (de type entier ou chaîne de caractères) permettant d identifier de façon unique un bloc. Ce paramètre peut être utilisé à l exécution de chacune des opérations excepté l opération list. $edit : il s agit des données saisies par l utilisateur lors de la configuration du bloc. Ce paramètre n est utilisé que lors de l opération save. La valeur de retour dépend du type d opération réalisée : Opération list : le hook retourne un tableau associatif pouvant contenir les clés suivantes : info : permet de définir le nom du bloc. Cette information est obligatoire. cache : permet de définir la manière dont va être mis en cache le bloc concerné. weight : définit le poids du bloc. - 1-

139 status : définit le statut du module (1 : activé, 0 : désactivé). region : définit la région d affichage par défaut du bloc. Si la région n existe pas, c est la première trouvée par Drupal qui sera utilisée par défaut. visibility : définit la visibilité du bloc sur les pages spécifiées par la clé pages (TRUE : visible, FALSE : invisible). pages : définit les pages sur lesquelles le bloc sera ou non affiché. Opération configure : le hook retourne un tableau correspondant au formulaire. Opération save : aucune valeur de retour. Opération view : le hook retourne un tableau associé à la variable $delta, contenant les clés subject et content correspondant respectivement au titre du bloc et à son contenu. Exemple de création d un bloc configurable : Cet exemple montre comment créer un bloc permettant d afficher une citation, dont le texte et l auteur sont configurables. Dans le cas où l opération est "list", le hook déclare un nouveau bloc dont le titre affiché dans la liste est "Exemple de bloc" ; dans le cas où l opération est "configure", le hook ajoute deux zones de saisies au formulaire ; dans le cas où l opération est "save", le hook enregistre la saisie de l utilisateur dans deux variables et enfin, dans le cas où l opération est "view", le hook récupère les données des variables et affiche le titre du bloc et les informations en tant que contenu. function exemple_block($op = list, $delta = 0, $edit = array()) { switch($op) { case list : $blocks[0][ info ] = t( Exemple de bloc ); return $blocks; case configure : $form[ citation ] = array( #type => textfield, #title => t( Citation ), #default_value => variable_get( exemple_bloc_citation, ), #description => t( Saisissez la citation ) ); $form[ auteur ] = array( #type => textfield, #title => t( Auteur ), #default_value => variable_get( exemple_bloc_auteur, ), #description => t( Saisissez l\ auteur de la citation ) ); return $form; case save : variable_set( exemple_bloc_citation, $edit[ citation ]); variable_set( exemple_bloc_auteur, $edit[ auteur ]); break; case view : $citation = variable_get( exemple_bloc_citation, Aucune citation aujourd\ hui ); $auteur = variable_get( exemple_bloc_auteur, Anonyme ); $block = array( subject => t( La citation du jour ), content => $citation. <br/><i>.$auteur. </i> ); - 2 -

140 return $block; }//switch() }//exemple_block() 3. Le hook de recherche hook_search() Il existe sous Drupal un module standard dédié à la recherche de mots clés se trouvant dans les contenus. Cette recherche peut être modifiée en utilisant notamment le hook hook_search(). Le hook hook_search() permet de prendre en compte dans la recherche, des données définies par le module : par exemple, les informations d un type de contenu créé par le module. Le prototype de la fonction est le suivant : function hook_search($op = search, $keys = NULL) Les paramètres sont détaillés ci dessous : $op : Il s agit du type d opération que doit réaliser le hook. Il existe plusieurs types d opérations pour le hook hook_search() : admin : permet de paramétrer le formulaire de configuration de la recherche. name : permet de connaître le type d information recherché par le module (utilisateur, contenu, etc.). Il s agit du titre de l onglet qui sera présent sur la page de recherche. reset : permet de réaliser un ensemble d instructions à la réinitialisation de l index. search : permet de lancer une recherche avec les termes contenus dans la variable $keys. status : permet de récupérer un ensemble d information à la mise à jour de l index. $keys : Il s agit des mots clés de la recherche. La valeur de retour de la fonction dépend du type d opération : Opération admin : le hook retourne un tableau de formulaire contenant les champs de configuration. Opération name : le hook retourne le type d information concerné par la recherche. Il s agit d un terme traduit (par exemple, Content sera renvoyé en tant que Contenu). Opération reset : le hook ne renvoie rien. Opération search : le hook contient le tableau de résultats. Il s agit d un tableau associatif contenant les clés suivantes : link : lien vers le contenu trouvé. Cette clé est obligatoire. type : type de l élément. title : titre de l élément. Cette clé est obligatoire. user : l auteur de l élément. date : la date de dernière modification de l élément. extra : information supplémentaire concernant l élément. snippet : un résumé de l élément trouvé

141 Opération status : le hook retourne un tableau associatif, dans le cas d une mise à jour de l index, contenant les clés remaining correspondant au nombre d éléments restant à indexer, et total correspondant au nombre d éléments à indexer. Exemple de l ajout d une recherche dans un type de contenu photo : Cet exemple montre comment rechercher un mot clé dans les contenus de type photo. Dans le cas de l opération "name", le hook retourne uniquement un libellé indiquant le type d information concerné par cette recherche. Dans le cas de l opération "search", le hook définit dans un premier temps le nombre d éléments maximum à récupérer et lance ensuite la recherche grâce à la fonction do_search(). Il parcourt enfin le résultat et renvoie le tout. function exemple_search($op = search, $keys = array()) { switch($op){ case name : return Photos ; case search : $find = do_search($keys, node, INNER JOIN {node} n ON n.nid = i.sid, n.type = "photo", array(), i.relevance AS score,, array(), ORDER BY score DESC ); $results = array(); foreach ($find as $item) { // Construction du noeud : $node = node_load($item->sid); $node->build_mode = NODE_BUILD_SEARCH_RESULT; $node = node_build_content($node, FALSE, FALSE); $node->body = drupal_render($node->content); $extra = node_invoke_nodeapi($node, search result ); $results[] = array( link => node/. $item->sid, type => $node->type, title => $node->title, user =>, date => $node->changed, node => $node, extra => $extra, score =>, snippet => search_excerpt($keys, $node->body), ); }//foreach() return $results; }//switch() }//exemple_search() On peut remarquer l utilisation de la fonction do_search(). Cette fonction permet de lancer une recherche sur des mots clés. La recherche se décompose en deux phases, mais dans la plupart des cas, la seconde n est pas utilisée. La première étape de la recherche consiste à retrouver tous les résultats concordants selon les critères ET ou OU. La seconde étape consiste à appliquer des critères avancés sur ce résultat. La signature de cette fonction est la suivante : function do_search($keywords, $type, $join1 =, $where1 = 1 = 1, $arguments1 = array(), $columns2 = i.relevance AS score, $join2 =, $arguments2 = array(), $sort_parameters = ORDER BY score DESC ) Les paramètres sont détaillés ci dessous : - 4 -

142 $keywords : les mots clés sur lesquels se base la recherche pour retrouver des contenus. $type : le module utilisé pour la recherche. $join1 : la chaîne à insérer dans la clause JOIN de la requête de la première étape de la recherche. Par exemple : INNER JOIN {node} n ON n.nid = i.sid. $where1 : la chaîne à insérer dans la clause WHERE de la requête de la première étape de la recherche. Par exemple : n.type = "photo". $arguments1 : un ensemble d arguments placé à la fin de la première requête. $columns2 : la chaîne à insérer dans la clause SELECT de la seconde requête. Cette chaîne doit contenir une colonne nommée "score". Par défaut, la valeur est i.relevance AS score. $join2 : la chaîne à insérer dans la clause JOIN de la seconde requête. Par exemple : INNER JOIN {node_comment_statistics} n ON n.nid = i.sid. $arguments2 : un ensemble d arguments placé à la fin de la seconde requête. $sort_parameters : la chaîne à rajouter pour trier le résultat final. Par défaut, ORDER BY score DESC. Le retour de la fonction est un tableau d identifiants de recherche (appelés SID) correspondant aux résultats de recherche. 4. Les hooks de menu Un menu n est pas considéré seulement comme un simple élément de menu. On parle de façon générale de menu lorsqu il s agit d URL (chemin d accès). Ces URL peuvent correspondre à des éléments de menu, des pages ou encore des URL fonctionnelles utilisées pour réaliser des traitements particuliers. Les menus peuvent être utilisés en tant que callback. On appelle callback une fonction exécutée au chargement d une page. Ce principe est souvent mis en œuvre lors de l utilisation d AJAX pour renvoyer un texte dynamique. a. Le hook hook_menu() Le hook hook_menu() est rarement appelé par Drupal, par exemple au rafraîchissement du cache, pour définir les différents chemins d accès disponibles au sein de la plate forme. Cette fonction construit un tableau dont chacune des cases correspond à un chemin d accès, avec tous ses paramètres, et renvoie ce tableau comme valeur de retour. Chaque entrée du tableau contient un ensemble de clés permettant de paramétrer le menu. Les différentes clés disponibles sont listées ci dessous : title : le titre non traduit du menu. La fonction de traduction t() ne doit pas être utilisée ici. En effet, Drupal fait appel automatiquement à cette fonction. Cette clé est obligatoire. title callback : la fonction que Drupal doit appeler lorsqu il voudra afficher le titre. Par défaut, il s agit de la fonction de traduction t(). title arguments : les paramètres à passer à la fonction définie par la clé title callback. description : la description du menu. page callback : la fonction appelée lors de l affichage du menu. page arguments : les paramètres à passer à la fonction définie par la clé page callback. Si l un des paramètres est un entier, Drupal le remplacera par le paramètre correspondant de l URL. access callback : la fonction qui définit si l utilisateur a le droit d accéder à ce menu ou non. Par défaut, Drupal - 5 -

143 exécute la fonction user_access(). access arguments : les paramètres à passer à la fonction définie par la clé access callback. Si l un des paramètres est un entier, Drupal le remplacera par le paramètre correspondant de l URL. file : fichier contenant les différentes fonctions utilisées par les callbacks. Il doit s agir du nom relatif d un fichier se trouvant dans le répertoire du module. Dans le cas contraire, il est nécessaire de spécifier son chemin d accès à l aide de la clé file path. file path : chemin d accès au fichier spécifié à la clé file. Par défaut, il s agit du chemin d accès au module courant. weight : le poids du menu permettant de définir sa position dans la liste des éléments. menu_name : zone de menu dans laquelle doit être placé le menu courant. type : le type de menu utilisé. Cette clé peut prendre les valeurs suivantes : MENU_NORMAL_ITEM : élément de menu classique s affichant dans l arborescence des menus et pouvant être géré dans l administration du site. Cette valeur est la valeur par défaut si rien n est spécifié pour la clé type. MENU_CALLBACK : les callbacks sont de simples fonctions correspondant à des URL. Ces fonctions sont exécutées lorsque ces URL sont appelées. MENU_LOCAL_TASK : les tâches locales sont affichées comme des onglets par défaut. MENU_DEFAULT_LOCAL_TASK : tâche locale appelée par défaut. Par exemple, le code suivant permet de définir une nouvelle page dont l URL d accès est "chemin/de/la/page" et dont le titre est "Ceci est une page" : function exemple_menu() { $items = array(); $items[ chemin/de/la/page ] = array( title => Ceci est une page, description => Page d\ exemple, page callback => exemple_page, access arguments => array( access content ), type => MENU_NORMAL_ITEM, ); return $items; }//exemple_menu() Il est possible également de passer des paramètres au callback appelé. Ces paramètres sont spécifiés via la clé #page arguments sous forme de tableau. Chaque élément du tableau spécifié pour cette clé sera passé dans l ordre au callback. Par exemple, le code ajoute un menu permettant de lister les articles relatifs à un pays donné : $items[ exemple/article ] = array( title => Liste des articles français, description => Cette page permet d\afficher la liste des articles français, page callback => exemple_article_liste, page arguments => array( france ), access arguments => array( access content ), type => MENU_NORMAL_ITEM ); Dans cet exemple, un appel à l URL "exemple/articles" exécute la fonction exemple_article_liste() prenant en paramètre la valeur "france". On considère ici que la fonction retourne la liste des articles correspondant à ce pays

144 Cette manière de faire n est pas tout à fait dynamique : la valeur du paramètre est définie dans le code source et l utilisateur n y a pas accès. Drupal propose une solution pour laisser la possibilité à l utilisateur de passer une valeur à ce paramètre. En effet, il s agit de définir un champ spécial dans l URL en indiquant que ce champ, au moment de l écriture du code source, est indéfini. La valeur de cet argument sera donnée au moment de l appel à l URL. Le code suivant reprend l exemple précédent en laissant l attribution de cette valeur, à l utilisateur : $items[ exemple/article/% ] = array( title => Liste des articles d\ un pays donné, description => Cette page permet d\ afficher la liste des articles du pays passé en paramètre, page callback => exemple_article_liste, page arguments => array(2), access arguments => array( access content ), type => MENU_NORMAL_ITEM ); Dans cet exemple, le paramètre est donné à la fin de l URL (par exemple exemple/article/france) et repassé à la fonction grâce à la clé page arguments. Cette clé spécifie qu il s agit du paramètre placé en indice 2 sur la requête. Les différents indices sont définis ainsi pour l URL exemple/article/france : exemple/ article/ france La fonction appelée par l URL ci dessus récupère tous les nœuds de type story correspondant aux articles, et tagués avec le terme passé en paramètre, situé au sein du vocabulaire pays : function exemple_article_liste($pays = france ) { $nodes = array(); $nodes_query = db_query("select {node}.nid FROM {node} INNER JOIN {term_node} ON {node}.nid = {term_node}.nid INNER JOIN {term_data} ON {term_node}.tid = {term_data}.tid INNER JOIN {vocabulary} ON {term_data}.vid = {vocabulary}.vid WHERE {vocabulary}.name = pays AND {node}.type = story AND {term_data}.name = %s ", $pays); while($node = db_fetch_object($nodes_query)) { $node = node_load($node->nid); $nodes[] = l($node->title, node/. $node->nid); }//while() return theme_node_list($nodes); }//exemple_article_liste() b. Le hook hook_menu_alter() Tous les menus de Drupal peuvent être modifiés. Il suffit qu un module implémente le hook hook_alter() pour qu il puisse altérer le chemin d accès d une URL ou encore la fonction appelée lors de l accès à un menu. Ce hook est appelé après l appel de tous les hooks hook_menu(). La signature de cette fonction est la suivante : function hook_menu_alter(&$items) Le paramètre est détaillé ci dessous : $items : il s agit des différents éléments de menu qu il est possible de modifier. Étant donné que ce paramètre est passé par référence, toute modification apportée sur ce paramètre impliquera une modification du menu lui même

145 Le hook ne renvoie aucune valeur. Par exemple, pour autoriser l accès à tout utilisateur pour un menu dont l URL est "chemin/de/la/page", il est possible d écrire le code suivant : function exemple_menu_alter(&$items) { $items[ chemin/de/la/page ][ access callback ] = TRUE; }//exemple_menu_alter() 5. Le hook hook_nodeapi() Le hook hook_nodeapi() est la fonction qui est appelée à chaque opération sur les nœuds. Grâce à elle, il est possible d effectuer diverses opérations à certains moments clés du processus de gestion des nœuds : à l enregistrement, au chargement, etc. Cette fonction possède la signature suivante : function hook_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) Les paramètres de cette fonction sont détaillés ci dessous : $node : le nœud considéré. $op : le type d opération à réaliser. Ce paramètre peut prendre les valeurs suivantes : alter : le contenu du nœud présent dans l attribut $node->content a été rendu pour l affichage (le corps ou le résumé du nœud a été filtré et le contenu contient des caractères HTML). Cette opération ne devrait être utilisée que pour du traitement de chaînes. delete : le nœud est en cours de suppression. delete revision : la révision du nœud est en cours de suppression. insert : le nœud est en cours de création. load : le nœud est en cours de chargement. Il est possible à ce niveau de rajouter des informations dans le nœud pour une utilisation ultérieure. prepare : le nœud est sur le point d être affiché dans le formulaire de création / modification. prepare translation : le nœud est en cours de copie pour la création de sa traduction. search result : le nœud est affiché en tant que résultat d une recherche. Si certaines informations doivent être affichées avec les résultats, elles doivent être renvoyées en retour de la fonction. print : le nœud est sur le point d être imprimé. presave : le nœud a passé toutes les validations et est sur le point d être enregistré. Cette action peut être utilisée pour effectuer des changements sur le nœud avant qu il soit sauvegardé. rss item : un flux RSS a été généré. Il est possible de renvoyer des propriétés qui seront ajoutées à l élément. La variable $node peut aussi être modifiée pour ajouter ou supprimer des informations qui seront présentes ou non dans le flux RSS. update : le nœud est sur le point d être mis à jour. update index : le nœud est cours d indexation. Si certaines informations, qui ne sont pas visibles d ordinaire avec le nœud, doivent être incluses dans la recherche, elles doivent être renvoyées en retour de la fonction

146 validate : l utilisateur a terminé la saisie des informations du nœ ud et veut prévisualiser ou enregistrer le nœ ud. Ce hook permet de réaliser une vérification des données du nœ ud. Toutes les erreurs doivent être reportées à travers la fonction form_set_error(). Pour plus d informations sur cette fonction, cf. chapitre Les fonctions pratiques de Drupal Les autres fonctions. view : le nœ ud est sur le point d être affiché. Il est possible de modifier le contenu se trouvant dans l attribut $node->body. Cette opération est appelée après l exécution du hook hook_view() et le module peut donc considérer que le corps du nœ ud possède un texte filtré, contenant des caractères HTML. $a3 : ce paramètre correspond à des valeurs différentes en fonction du paramètre $op : Opération view : le paramètre $a3 correspond au résumé du nœ ud. Opération validate : le paramètre $a3 correspond au formulaire contenant la saisie de l utilisateur. $a4 : dans le cas où la valeur du paramètre $op est view, ce paramètre correspond au contenu de la page. La valeur de retour de cette fonction varie selon le type d opération à réaliser : Opérations presave, insert, update, delete, print et view : il n y a aucune valeur de retour. Opération load : la fonction retourne un tableau de paires de clé/valeur à rajouter au nœ ud. Ci dessous se trouve un exemple d utilisation du hook hook_nodeapi(). Dans cet exemple, le module vérifie que le champ copyright d un nœud de type photo commence bien par un caractère avant son enregistrement et rajoute la date du jour dans le nœud à son chargement : function exemple_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) { switch($op) { case validate : if($node->type == photo ) if(strpos($node->copyright, === FALSE strpos($node->copyright, > 0) form_set_error( erreur_copyright, t( The copyright field is not well formed )); break; case load : if($node->type == photo ) $node->today = date( Ymd ); break; }//switch() }//exemple_nodeapi() 6. Le hook hook_user() Dans un module, il est possible de réaliser des actions au déclenchement de certains événements concernant les utilisateurs : l enregistrement, le chargement ou encore l affichage d un utilisateur pour sa modification. Le hook hook_user() permet de gérer tous ces événements. La signature de cette fonction est la suivante : function hook_user($op, &$edit, &$account, $category = NULL) Les paramètres sont détaillés ci dessous : $op : il s agit du type d opération (événement) qui est en train de se réaliser. Les opérations possibles sont : after update : le compte utilisateur vient d être mis à jour. categories : les différentes catégories d information utilisateur sont demandées. - 9-

147 delete : le compte utilisateur est en cours de suppression. Si le module a rajouté des informations supplémentaires au compte utilisateur, il doit supprimer ces informations grâce à cette fonction. form : le formulaire de modification du compte utilisateur est sur le point d être affiché. Le module peut rajouter des éléments de formulaire. insert : le compte utilisateur est en cours de création. Si le module doit intégrer des informations supplémentaires au compte, il doit les enregistrer en base de données et définir les champs correspondants de la variable $edit à NULL. load : le compte utilisateur est en cours de chargement. Si le module a rajouté des informations supplémentaires au compte, il doit les ajouter également à l objet utilisateur. login : l utilisateur vient de se connecter. logout : l utilisateur vient de se déconnecter. register : le formulaire d enregistrement est sur le point d être affiché. Le module doit rajouter ses propres champs de formulaire s il souhaite enregistrer des informations supplémentaires. submit : permet de modifier le compte utilisateur avant qu il soit enregistré. update : le compte utilisateur est en cours de modification. Si le module doit rajouter des informations supplémentaires au compte, il doit les enregistrer en base de données et définir les champs correspondant de la variable $edit à NULL. validate : le compte utilisateur est sur le point d être modifié. Le module doit valider ses propres champs et lever certaines erreurs si nécessaire. view : le compte utilisateur est en cours d affichage. Le module doit formater et rajouter ses propres champs dans l attribut $account->content. $edit : un tableau contenant les différentes valeurs saisies par l utilisateur lors de l ajout ou de la modification d un utilisateur. $account : l objet correspondant au compte utilisateur considéré. $category : la catégorie des informations que l utilisateur courant est en train de saisir. La valeur de retour dépend du type d opération à réaliser : Opérations categories : un tableau contenant d autres tableaux associatifs contenant chacun : name : le nom informatique de la catégorie title : le libellé de la catégorie. weight : un numéro permettant de définir l ordre de traitement des catégories. Opérations form, register : un tableau de formulaire contenant tous les composants de formulaire à afficher. Opérations delete, insert, load, login, logout, submit, update, validate, view : aucune valeur de retour. Par exemple, il est possible de rajouter des informations supplémentaires au moment de la création du compte utilisateur, telles que le nom de la société dans laquelle travaille l utilisateur ainsi que sa date d entrée

148 Bien qu expliqué ici dans un but didactique, il n est pas nécessaire de rajouter de telles informations via un nouveau module. Effectivement, il existe un module supplémentaire, fourni en standard avec Drupal, qui permet de gérer différents champs de profil supplémentaires. Ce module est expliqué plus loin dans ce livre. Dans l exemple ci dessous, le module rajoute les deux informations (société et date d entrée) sur les pages de création et modification du compte, vérifie que la date est au bon format si elle est saisie (le format considéré est jj/mm/aaaa), enregistre les informations dans une table nommée "user_infos" et affiche ces informations dans la page du compte : function exemple_user($op, &$edit, &$account, $category = NULL) { global $user; switch($op) { case register : case form : $form[ company_name ] = array( #type => textfield, #title => t( Company name ), #description => t( Enter your current company name ), #size => 25, #default_value => $edit[ company_name ], #required => FALSE ); $form[ hire_date ] = array( #type => date, #title => t( Hire date ), #description => t( Enter your hire date ), #default_value => $edit[ hire_date ], #required => FALSE ); return $form; case validate : if(!empty($edit[ hire_date ]) && preg_match( /^\d{2}\/\d{2}\/\d{4}$/, $edit[ hire_date ]) == 1) form_set_error( error_hire_date, t( The hire date you entered is not well formed. )); break; case insert : db_query("insert INTO {user_infos}(uid, company_name, hire_date) VALUES (%d, %s, %s)", $user->uid, $edit[ company_name ], $edit[ hire_date ]); break; case update : db_query("update {user_infos} SET company_name = %s, hire_date = %s WHERE uid = %d", $edit[ company_name ], $edit[ hire_date ], $user->uid); break; case view : $user_infos_query = db_query("select * from {user_infos} WHERE uid = %d", $user->uid); $user_infos = db_fetch_object($user_infos_query); $account->company_name = $user_infos->company_name; $account->hire_date = $user_infos->hire_date; break; }//switch() }//exemple_user() Les informations rajoutées dans la variable $account dans le cas de l opération view ne sont par défaut pas affichées. Il est nécessaire de modifier le template de la page du compte pour que ces informations soient visibles. 7. Le hook hook_theme() Il est courant, et notamment dans le cas de l affichage du contenu d un bloc, que le module renvoie ou affiche du contenu HTML

149 Deux possibilités s offrent alors : Soit le développeur insère du code HTML dans le code PHP. Soit le développeur insère du code PHP dans le code HTML. Dans le cas de la première solution, il serait possible de retrouver le code suivant. Ce code correspond à une fonction permettant d afficher le contenu d un nœud de type livre : function exemple_get_content($node) { $content = <div class="exemple-content"> ; $content.= <div class="title">.$node->title. </div> ; $content.= <div class="author">.$node->auteur. </div> ; $content.= <div class="content">.$node->body. </div> ; $content.= </div> ; return $content; }//exemple_get_content() L exemple précédent permet de retourner un bloc contenant le titre du nœud, l auteur du livre ainsi que son contenu. Cet exemple montre qu il n est pas pratique d écrire du code HTML directement dans le code PHP (tout est mélangé et sans visibilité réelle des ouvertures/fermetures des différentes balises) et la fonction n est manifestement pas normalisée. Drupal permet de recenser l ensemble des éléments permettant de gérer les thèmes, fonctions et template, dans une seule et même fonction : le hook hook_theme(). Ce hook permet de regrouper la définition de l ensemble des éléments qui peuvent être mis en forme via un thème particulier. La signature de cette fonction est la suivante : function hook_theme($existing, $type, $theme, $path) Sans trop entrer dans les détails des paramètres de cette fonction pour le moment, ses arguments sont introduits cidessous : $existing : les différentes implémentations précédentes, que les thèmes ou les modules peuvent consulter avant de réaliser un traitement sur l affichage. $type : le type de ce qui est en train d être implémenté. $theme : le nom du thème en cours de validation. $path : le chemin d accès au module ou au thème. Le principe de cette fonction étant de regrouper les éléments visant à être mis en forme, elle retourne un tableau composé de ces éléments paramétrés. Il s agit d un tableau associatif dont les clés correspondent à des mots clés représentant les éléments à mettre en forme. Par exemple, le code suivant permet de définir deux éléments de mise en forme livre et livre_list : function exemple_theme() { return array( livre =>..., livre_list =>... ); }//exemple_theme() Chacune de ces clés correspond à un autre tableau associatif permettant de paramétrer l élément de thème. Ce tableau associatif peut prendre les valeurs suivantes : arguments : un tableau d arguments correspondant aux paramètres passés à la fonction de thème. Ce tableau est un nouveau tableau associatif dont les clés correspondent au nom des paramètres et les valeurs à leur valeur par défaut

150 Les valeurs par défaut sont obligatoires. Si elles ne sont pas définies, l élément ne sera pas utilisé par Drupal. file : le fichier contenant la fonction de thème. Cette clé est utile pour séparer la déclaration de l implémentation : on déclare toutes les informations dans le fichier.module et on place leur implémentation dans un fichier spécifique. path : le chemin d accès au fichier contenant la fonction de thème (définit par la clé file). Par défaut, ce fichier sera recherché dans le répertoire du module ou du thème, mais s il est placé dans un répertoire plus spécifique, il est possible de l indiquer via cette clé. Le chemin doit être un chemin relatif à partir de la racine de Drupal. function : le nom de la fonction de thème. Ainsi, Drupal essaiera de l exécuter au sein du module. Si cette clé n est pas spécifiée, Drupal tentera d exécuter une fonction portant le nom theme_lenomdelelement(). Par exemple, dans le cas précédent de l élément de thème livre, si la clé function n est pas spécifiée, Drupal exécutera la fonction theme_livre() sur le module exemple. template : le fichier de template correspondant à cet élément de thème. Cette clé permet de ne pas intégrer du code HTML directement dans le code PHP. Si la clé path est spécifiée, le fichier de template doit se trouver dans ce répertoire. Le fichier de template doit être indiqué sans son extension. Par exemple, le code ci dessous définit deux éléments de thème : "livre" et "livre_list". Le premier élément est mis en forme grâce à un fichier de template, le second est mis en forme via une fonction de thème. Enfin, l appel à l élément de thème "livre" est réalisé au sein du hook hook_block() : function exemple_theme() { return array( livre => array( arguments => array( title => NULL, author => NULL), template => livre ), livre_list => array( arguments => array( livres => NULL) ), ); }//exemple_theme() function theme_livre_list($livres) { return MISE EN FORME DE LA LISTE DES LIVRES ; }//theme_livre_list() function exemple_block($op = list, $delta = 0, $edit = array()) { switch($op) { case view : $block = array( subject => t( Utilisation du hook hook_theme() ), content => theme( livre, Ceci est le titre du livre, Jean DUPONT ) ); return $block; }//switch() }//exemple_block()

151 Les formulaires 1. L API de formulaire a. Le principe de fonctionnement Les formulaires ont un mode de fonctionnement très spécifique mais très simple. En effet, l utilisation directe de la balise HTML <form> dans les modules ou plus généralement dans les fichiers de template est bannie. À la place, Drupal propose de créer un tableau associatif contenant tous les composants du formulaire : zone de saisie, liste déroulante ou encore bouton de validation. C est Drupal qui, à travers une fonction spéciale, permet de parcourir ce tableau de formulaire et de transformer tous ces éléments en composants HTML. Le schéma suivant présente un parallèle entre l affichage d une page classique et une page Drupal possédant toutes les deux un formulaire de recherche : Chacune des cases du tableau permet de configurer un composant du formulaire ou bien le formulaire lui même : le nom du composant, la taille d une zone de saisie ou encore les attributs JavaScript de la balise. Le schéma suivant montre la structure d un tableau éventuel d un formulaire de connexion : - 1-

152 Dans l exemple qui suit, un formulaire contenant une zone de saisie pour l identifiant, une zone de saisie pour le mot de passe et un bouton de validation sont définis : function exemple_exemple_formulaire(){ $form = array(); $form[ identifiant ] = array( #type => textfield, #title => t( Identifant ), #description => t( Saisissez votre identifiant de connexion ) ); $form[ mot_de_passe ] = array( #type => password, #title => t( Mot de passe ), #description => t( Saisissez votre mot de passe de connexion ) ); $form[ valider ] = array( #type => submit, #title => t( Valider ), #description => t( Cliquez pour valider ) ); return $form; }//exemple_exemple_formulaire() b. Les types de composant Drupal propose un certain nombre de composants permettant d ajouter les composants HTML standard dans un formulaire. Chacun des composants doit être ajouté au tableau en spécifiant une clé arbitraire, définie par le développeur. C est dans la case définie par cette clé que tous les paramètres du composant doivent être spécifiés. Chacun de ces paramètres correspond à d autres clés, spécifiques cette fois ci à la plate forme Drupal. Pour les reconnaître, ces clés sont préfixées par le caractère #. Pour plus d information sur l utilisation de ces clés, la page suivante contient toute la documentation nécessaire à la création d un formulaire : topics forms_api_reference.html Néanmoins, il reste nécessaire de détailler certaines de ces clés, utilisées par la plupart des composants. La première clé, probablement la plus importante permet de définir le type du composant. Il s agit de la clé #type. Ci dessous se trouve la liste des valeurs correspondant aux types de composant disponibles et leur concordance avec le code HTML standard : - 2 -

153 button : Cette valeur permet de générer un bouton (code HTML <button>). Au clic sur le bouton, le formulaire est validé et rechargé, mais la fonction qui gère sa soumission n est pas exécutée. Par exemple, le code suivant rajoute au formulaire un bouton dont le texte est "Cliquez sur moi" : $form[ bouton ] = array( #type => button, #title => t( Cliquez sur moi ), #description => t( Ceci est la description du bouton ) ); checkbox : Cette valeur permet de générer une case à cocher (code HTML <checkbox>). Par exemple, le code suivant rajoute au formulaire une case à cocher "S inscrire à la newsletter" : $form[ inscription_newsletter ] = array( #type => checkbox, #title => t( S\ inscrire à la newsletter ), #description => t( Cochez cette cas si vous souhaitez recevoir la newsletter ) ); checkboxes : Cette valeur permet de générer un ensemble de cases à cocher (code HTML <checkbox>). La différence avec la valeur checkbox est qu il est possible ici de définir l ensemble des options liées aux cases à cocher en spécifiant pour chacune leur valeur (valeurs envoyées lors de la soumission du formulaire) et leur libellé (le texte affiché à côté de la case) sous forme de tableau. Il est possible également de définir une valeur par défaut pour définir quelle est la case cochée par défaut. Par exemple, le code suivant rajoute un ensemble de cases à cocher correspondant aux différents choix de loisirs : $form[ loisirs ] = array( #type => checkboxes, #title => t( Vos loisirs ), #description => t( Cochez les cases correspondant à vos loisirs ), #options => array( CINEMA => t( Cinéma ), PROGRAMMING => t( Programmation ), MUSIC =>vt( Musique ) ), #default_value => PROGRAMMING ); date : Cette valeur permet de générer un composant de choix d une date. Il n existe pas de correspondance HTML pour ce composant. La valeur par défaut de ce composant, si aucune n est spécifiée, est la date courante. La valeur par défaut doit être spécifiée en indiquant l année, le mois et l année sous la forme d un tableau de valeur. Par exemple : array( year => 2010, month => 5, day => 20) Le code suivant ajoute au formulaire une zone de saisie d une date de naissance, en mettant la date par défaut au 01/01/1980 : - 3 -

154 $form[ date_naissance ] = array( #type => date, #title => t( Votre date de naissance ), #description => t( Saisissez votre date de naissance ), #default_value => array( year => 1980, month => 1, day => 1) ); fieldset : Cette valeur permet de générer un composant de regroupement d un ensemble de composants (code HTML <fieldset>). Il est possible ici de spécifier si cette zone peut être réduite ou non grâce à l attribut #collapsible et si cette zone est réduite ou non par défaut grâce à l attribut #collapsed. Chaque élément devant être ajouté à cette zone doit, au moment de l ajout au formulaire, comporter une clé correspondant au composant fieldset. Par exemple : $form[ le_fieldset ][ le_bouton ] = array( #type => button,... ); Le code suivant présente l ajout d un fieldset au formulaire qui est par défaut réduit, mais qui peut déplier si besoin. Ce fieldset contient le bouton "Cliquez sur moi" : $form[ la_zone ] = array( #type => fieldset, #title => t( Le groupe de composant ), #collapsible => TRUE, #collapsed => TRUE ); $form[ la_zone ][ bouton ] = array( #type => button, #title => t( Cliquez sur moi ), #description => t( Ceci est la description du bouton ) ); file : Cette valeur permet de générer un composant d upload de fichier (code HTML <file>). Ce composant affiche un bouton parcourir permettant à l utilisateur de choisir un fichier à envoyer sur le serveur. Par exemple, le code suivant permet d ajouter un champ permettant à l utilisateur d envoyer une photo : $form[ fichier_photo ] = array( #type => file, #title => t( Votre photo ), #description => t( Sélectionnez votre photo ) ); hidden : Cette valeur permet de générer un champ caché à l intérieur du formulaire (code HTML <hidden>). Ce champ est particulièrement utile pour transmettre des informations que l utilisateur n a pas à voir. L attribut important pour ce composant est l attribut #value permettant de définir la valeur qui sera envoyée. Par exemple, le code suivant permet d ajouter au formulaire un champ caché contenant l identifiant de l utilisateur connecté : $form[ identifiant_utilisateur ] = array( #type => hidden, - 4 -

155 #value => $user->uid ); image_button : Cette valeur permet d ajouter une image cliquable (code HTML <input type="image">). Lorsque l utilisateur clique sur ce composant, le formulaire est soumis, de la même façon qu avec un bouton de type submit, c est à dire que toutes les informations contenues dans le formulaire sont envoyées. Pour ce composant, il est nécessaire d utiliser la clé #src pour spécifier le lien vers l image du bouton. Le code suivant permet d ajouter au formulaire une image cliquable nommée "button.png" et située dans le répertoire "images" du module : $form[ bouton_image ] = array( #type => image_button, #title => t( Cliquez pour valider ), #description => t( Cliquez pour valider ), #src => drupal_get_path( module, exemple ). /images/button.png ); item : Cette valeur permet d ajouter un texte simple au sein du formulaire. Il ne s agit pas d un élément de saisie mais bien d un élément d affichage. Le code suivant ajoute au formulaire le texte simple non éditable "Compte actif" : $form[ etiquette ] = array( #type => item, #title => t( Compte actif? ), #value => t( Compte actif ) ); markup : Cette valeur permet d ajouter du contenu à baliser à l intérieur d un formulaire. Il s agit du type de composant par défaut, il n est donc pas obligatoire de définir la clé #type pour ce composant. Elle sert essentiellement à ajouter du texte non éditable de la même façon que la clé #item. Le code ci dessous ajoute le même texte "Compte actif" que pour l élément "item" : $form[ etiquette2 ] = array( #title => t( Compte actif? ), #value => t( Compte actif ) ); password : Cette valeur permet de générer une zone de saisie d un password (code HTML <input type="password">). Le texte qui est saisi par l utilisateur dans ce composant est masqué. Le code suivant permet d ajouter une zone pour un mot de passe : $form[ mot_de_passe ] = array( #type => password, #title => t( Mot de passe ), #description => t( Saisissez votre mot de passe ) ); password_confirm : - 5 -

156 Cette valeur permet de générer une paire de composants de type #password. Une vérification sera faite entre les deux valeurs saisies et le formulaire ne pourra être soumis que si les valeurs concordent. Ce composant est très utile dans le cas d un formulaire d enregistrement. Le code suivant présente ce composant : $form[ mot_de_passe_confirmation ] = array( #type => password_confirm, #title => t( Mot de passe ), #description => t( Saisissez votre mot de passe de connexion ) ); radio : Cette valeur permet de générer un bouton radio (code HTML <input type="radio">). Les boutons radios sont généralement utilisés pour effectuer un choix parmi plusieurs. Dans le cas de cette clé, un seul bouton radio est généré, ce qui implique que son mode de fonctionnement rejoint plus celui d une case à cocher. Le code suivant explique son utilisation : $form[ choix_activation ] = array( #type => radio, #title => t( Activer cette option ), #description => t( Cochez ce bouton pour activer l\ option ) ); radios : Contrairement au type #radio, cette valeur permet de générer une liste de boutons radio. Un seul bouton de la liste pourra être coché à la fois. Tout comme le type #checkboxes, il est possible de définir une valeur par défaut grâce à la clé #default_value et les différentes options grâce à la clé #options, sous forme de tableau. Le code ci dessous permet à l utilisateur de choisir sa civilité (Madame, Mademoiselle ou Monsieur) : $form[ choix_civilite ] = array( #type => radio, #title => t( Votre civilité ), #description => t( Choisissez votre civilité ), #options => array( MLLE => ( Mademoiselle ), MME => t( Madame ), M => t( Monsieur ) ), #default_value => MLLE ); select : Cette valeur permet d ajouter au formulaire une liste déroulante (code HTML <select> combiné avec des balises <option>). Tout comme avec le type #checkboxes, il est possible de définir une valeur par défaut grâce à la clé #default_value et les différentes options grâce à la clé #options sous forme de tableau. Le code ci dessous permet à l utilisateur de choisir la ville dans laquelle il réside : $form[ choix_ville ] = array( #type => radios, #title => t( Votre ville ), #description => t( Choisissez votre ville ), #options => array( PARIS => ( Paris ), TOULOUSE => t( Toulouse ), REIMS => t( Reims ) - 6 -

157 ), #default_value => PARIS ); submit : Cette valeur permet d ajouter un bouton de validation au sein du formulaire (code HTML <input type="submit">). Lors d un clic sur un composant de ce type, toutes les données du formulaire sont envoyées, à l image d un composant de type #image_button. Le code suivant montre comment rajouter un bouton de ce type : $form[ bouton_validation ] = array( #type => submit, #title => t( Envoyer vos informations ), #description => t( Cliquez pour envoyer vos informations ) ); textarea : Cette valeur permet de rajouter dans le formulaire une zone de saisie multiligne (code HTML <textarea>). Ce composant est très utile pour la saisie d informations longues. Il existe deux clés permettant de paramétrer une telle zone de saisie : la clé #cols définit le nombre de caractères affichables sur la largeur de la zone, la clé #rows définit le nombre de lignes affichables de la zone. Le code suivant permet de rajouter un champ de commentaire : $form[ zone_commentaire ] = array( #type => textarea, #title => t( Commentaires ), #description => t( Saisissez votre commentaire ), #cols => 25, #rows => 5 ); textfield : Cette valeur permet d ajouter une zone de saisie dans le fomulaire (code HTML <input type="text">). Le code suivant permet de rajouter un champ pour l identifiant de l utilisateur : $form[ identifiant ] = array( #type => textfield, #title => t( Identifant ), #description => t( Saisissez votre identifiant de connexion ) ); value : Cette valeur permet de spécifier des valeurs internes au formulaire qui ne sont jamais affichées. Le code suivant permet de rajouter au sein du formulaire un identifiant généré aléatoirement : $form[ identifiant_interne ] = array( #type => user_password(7) ); Il existe bien d autres clés permettant de paramétrer de façon plus détaillée les composants. Parmi elles, les plus importantes sont : #attributes : permet de rajouter des attributs à la balise générée (par exemple, les attributs JavaScript - 7 -

158 onclick, onmouseover, etc.). #title : permet de définir le titre du composant (affiché sous forme d info bulle). #description : permet de définir une petite description du composant qui pourrait être affichée à l écran si nécessaire. #default_value : permet de définir la valeur par défaut à l affichage du formulaire. #size : permet de définir la taille visible du composant (nombre de caractères visibles). #required : permet de définir si le composant est obligatoire ou non (valeur TRUE ou FALSE). #prefix : permet de spécifier du code inséré juste avant l affichage du composant. #suffix : permet de spécifier du code inséré juste après l affichage du composant. Les clés #prefix et #suffix sont utilisées notamment pour encadrer un composant comme une zone de saisie par un élément <div>. c. L attribut #autocomplete_path Drupal propose en complément des zones de saisies une option permettant d en faire des listes déroulantes autocomplétées. L autocomplétion est le système permettant de proposer une liste des choix possibles au moment de la saisie d une chaîne. Le système d autocomplétion fonctionne comme un filtre : ce que saisit l utilisateur dans la zone doit être inclus dans le texte des options affichées. Par exemple, la saisie du texte AT pourrait faire apparaître les mots ATMOSPHERE ou encore CHAT. Ce système est très utile lorsqu il y a un grand nombre d options dans la liste et que l utilisateur souhaite les filtrer. Le schéma suivant présente le mode de fonctionnement de l autocomplétion. On admet qu une liste de pays en présente un grand nombre dans la base de données et que l utilisateur souhaite tous les pays commençant par la lettre "F" : À la saisie de la lettre "F", une requête est envoyée au serveur pour récupérer tous les pays commençant par cette lettre (1). Cette liste est traitée par la page pour afficher les valeurs sous forme de liste déroulante (2)

159 L option que propose Drupal pour implémenter ce système est de rajouter un élément de paramétrage sur les composants de type textfield. Il s agit d une nouvelle clé nommée #autocomplete_path qui doit contenir le chemin d accès à une URL retournant des informations au format JavaScript. Par exemple, le code suivant permet d avoir une zone de saisie autocomplétée affichant une liste de pays : $form[ liste_pays ] = array( #type => textfield, #title => t( Votre pays ), #description => t( Sélectionnez votre pays ), #autocomplete_path => addvista/livre-eni/pays/list, #required => FALSE, #prefix => <div class="liste-pays">, #suffix => </div>, ); Ce composant implique qu il doit exister un élément de menu au sein du module contenant cette URL. Le hook hook_menu() doit alors comporter le code suivant : $items[ addvista/livre-eni/pays/list/% ] = array( title => Addvista - Autocomplete, page callback => exemple_pays_autocomplete, page arguments => array(4), access callback => true, file => autocomplete.inc.php, ); Le hook doit spécifier en guise de callback la fonction retournant le contenu au format JavaScript, indiquer qu un paramètre doit être passé à la fonction (ce paramètre correspond à la saisie de l utilisateur) et que cette fonction se trouve dans un fichier différent du module (ici, le fichier "autocomplete.inc.php"). Cette fonction doit renvoyer la liste des pays correspondant à la saisie de l utilisateur. Dans l exemple suivant, on considère que les pays sont des nœuds de type pays et que le nom du pays correspond au titre du nœud : function exemple_pays_autocomplete($search = ){ $matches = array(); if ($search) { $artistes_query = db_query_range("select nid, title FROM {node} WHERE LOWER(title) LIKE LOWER( %s% ) AND type = pays AND status = 1", $search, 0, 10); while ($artiste = db_fetch_object($artistes_query)) $matches[$artiste->title] = $artiste->title; }//if() print drupal_to_js($matches); exit(0); }//exemple_pays_autocomplete() Cette fonction exécute une requête SQL pour récupérer les nœuds correspondants (ici, les 10 premiers trouvés), les ajoute dans un tableau et renvoie ce tableau au format JavaScript. d. L attribut #ahah AJAX (Asynchronous JavaScript And XML) est un ensemble de technologies (JavaScript et XML) permettant, entre autres, de faire dialoguer une page située côté client (page HTML) avec un script situé côté serveur (page PHP par exemple). L objectif de l utilisation d AJAX dans une page est de réduire la taille des informations transitant sur le réseau. En effet, la quantité de données, souvent conséquente, circulant entre un client et un serveur contribue à l allongement du temps de rafraîchissement d une page : à chaque affichage de page, toutes les données qui y sont incluses sont renvoyées à la page côté client pour être affichées

160 Le schéma UML suivant montre le fonctionnement de ces échanges : Cette communication s effectue via un format d échange standard tel que le langage XML. L inconvénient de ce genre d échange est qu il nécessite un traitement côté client pour décoder la réponse du script serveur (cette réponse peut par exemple contenir un bout de code HTML) et modifier, dans le cas d un remplacement de texte, un élément de la page. Ce type d échange est modélisé par le schéma suivant : Dans ce schéma, la page est composée de plusieurs régions : "header", "menu", "content top" et "content bottom". Chaque région possède son propre contenu (par exemple, la région "header" contient le logo du site). La région "content top" contient un bouton "refresh" qui, lorsque l utilisateur clique dessus, permet d exécuter un script serveur ne rafraîchissant uniquement que cette région. AHAH (Asynchronous HTML And HTTP) n est qu un sous ensemble d AJAX permettant de remplacer ou d insérer rapidement du contenu dans une page sans traitement préalable de ces informations. En effet, pourquoi traiter une information qui vise à être affichée à la place d une autre?

161 Les données reçues par la page HTML sont directement au format HTML. JavaScript n a plus qu à récupérer ces données et à les placer dans l élément souhaité de la page. Il n y a donc plus de traitement XML ou JSON. Pour définir une action AJAX en AHAH sur un composant Drupal, il suffit de rajouter la clé de paramétrage #ahah. Cette clé peut être définie sur la plupart des composants graphiques (button, textfield, checkbox, etc.) et représente un tableau contenant toutes les informations nécessaires à l exécution du code JavaScript. Ce tableau de paramétrage est un tableau associatif dont les clés disponibles sont les suivantes : effect Cette clé permet de spécifier l effet d insertion du contenu. Les effets disponibles sont : none (aucun effet, valeur par défaut), fade (effet de fondu) et slide (effet de glissement). Il est possible de rajouter d autres effets rendus disponibles par une bibliothèque nommée Interface Elements fournie par le framework JQuery (téléchargeable à l adresse Si cette bibliothèque est installée, des effets supplémentaires pourront être utilisés. event Cette clé permet de spécifier l événement responsable de l exécution de script AHAH. Il s agit de n importe quel événement JQuery tel que change ou blur. Bien qu utile, il n est pas obligatoire de spécifier cette clé. En effet chaque composant possède un événement par défaut qui sera utilisé automatiquement si cette clé n est pas précisée. Par exemple, l événement par défaut d un composant de type button est change, l événement par défaut d un composant de type textfield est blur, etc. Pour plus d information sur les valeurs par défaut des différents composants, il suffit de se reporter à la documentation de Drupal présente sur le site officiel à l adresse topics forms_api_reference.html. method Cette clé permet de spécifier la méthode d insertion, à l intérieur de la page, du contenu renvoyé par le script côté serveur. Par défaut, le contenu remplace l un des éléments de la page HTML mais il est possible de modifier ce comportement. Les différentes valeurs possibles sont : replace (valeur par défaut) : remplace un élément de la page par le contenu. after : insère le contenu après un élément de la page. append : insère le contenu à l intérieur d un élément de la page, à la fin du contenu déjà existant de cet élément. before : insère le contenu avant un élément de la page. prepend : insère le contenu à l intérieur d un élément de la page, au début du contenu déjà existant de cet élément. path Cette clé permet de spécifier un menu Drupal (chemin d accès) retournant la portion de code HTML souhaitée. progress Cette clé permet de définir le type de l élément graphique affiché lors de l appel au script serveur. Il ne faut pas oublier qu un tel appel s exécute de façon asynchrone et qu il est nécessaire d informer l utilisateur, ou tout du moins lui montrer, que le système réalise une opération (dans ce cas, le chargement de données). Il s agit de définir ici ce type de progression via un tableau associatif. Ce dernier peut être composé des clés suivantes : type : le type de l élément graphique. Les valeurs possibles sont throbber (valeur par défaut) et bar. message : le message affiché pendant le chargement. url : le chemin d accès vers un callback permettant de définir comment la barre de chargement doit s afficher. Cette clé n est utile qu avec la valeur bar pour la clé type. interval : l intervalle utilisé pour mettre à jour la barre de chargement. Cette clé n est utile qu avec la valeur bar pour la clé type et une valeur définie pour la clé url. wrapper Cette clé permet de spécifier l id de l élément HTML devant recevoir le contenu HTML retourné par le script serveur

162 Souvent, cet élément HTML est un élément <div> pour plus de flexibilité dans son positionnement dans la page. L exemple ci dessous montre comment utiliser la clé #ahah au sein d un formulaire. On considère dans cet exemple une zone permettant de saisir un commentaire. Lorsque l utilisateur sort de cette zone, le commentaire est automatiquement rajouté à la liste des commentaires située plus bas. Il s agit tout d abord de définir les champs de formulaire : function exemple_formulaire_ahah() { $form[ commentaire ] = array( #type => textfield, #title => t( Votre commentaire ), #description => t( Saisissez votre commentaire ), #ahah => array( path => exemple/commentaire/add, wrapper => wrapper-commentaires, method => append, effect => fade, event => blur ) ); $form[ wrapper_commentaires ] = array( #value => <div id="wrapper-commentaires"></div> ); return $form; }//exemple_formulaire_ahah() On définit dans le formulaire dans un premier temps un composant sans spécifier le type (par défaut, type markup) qui contient un élément <div> représentant le wrapper. On ajoute ensuite un composant de type textfield représentant le commentaire en spécifiant que lorsque surviendra un changement de valeur, le menu exemple/commentaire/add effectuera un rajout de contenu dans l élément défini par l id wrapper-commentaires. Il s agit maintenant de définir les éléments de menu permettant d afficher le formulaire en faisant appel à la fonction drupal_get_form() et de retourner le contenu HTML : function exemple_menu() { $items = array(); $items[ exemple/commentaire/add ] = array( title => Ajout d\ un commentaire à la liste, description => Ce menu permet d\ ajouter un commentaire, page callback => exemple_commentaire_ajout, access callback => TRUE, type => MENU_CALLBACK ); $items[ exemple/formulaire/ahah ] = array( title => Formulaire avec un champ AHAH, description => Affichage d\ un formulaire avec un champ AHAH, page callback => drupal_get_form, page arguments => array( exemple_formulaire_ahah ), access callback => TRUE ); return $items; }//exemple_menu() Ce menu, puisqu il n a pas pour vocation a être affiché en tant que page, est défini en tant que MENU_CALLBACK (utilisation du menu en tant que fonction). À chaque appel de ce menu, c est la fonction exemple_commentaire_ajout () qui sera exécutée. Il s agit maintenant d écrire cette fonction : function exemple_commentaire_ajout() { $commentaire = $_POST[ commentaire ];

163 $content = <div class="comment-item"> ; $content = Commentaire :.$commentaire; $content.= </div> ; print drupal_to_js(array( data => $content, status => true)); exit(); }//exemple_commentaire_ajout() À l exécution, le formulaire s affiche : Au moment du changement de valeur pour la zone de saisie du commentaire, la liste se met automatiquement à jour : Il faudrait agrémenter ici le module pour que le commentaire soit sauvegardé en base. Cette opération peut être faite dans la fonction exemple_commentaire_ajout(). Au lieu de de générer du code HTML directement dans le PHP comme le fait l exemple ci dessus, le module devrait faire appel à un fichier de template pour mieux découpler le traitement de la présentation. Pour plus d information sur le fonctionnement des thèmes, cf. chapitre Créer un thème L intérêt des thèmes. 2. Les hooks de formulaire a. Le hook hook_form() Un module peut créer de nouveaux types de contenu lors de son installation. Ces nouveaux types de contenu peuvent posséder de nouveaux champs dont les valeurs sont enregistrées dans de nouvelles tables, créées elles aussi lors de son installation. Pour que ces valeurs puissent être saisies lors de la création d un nœud, il faut que ces nouveaux champs apparaissent dans le formulaire de création et de modification des nœuds. Le hook hook_form() permet de définir les champs de ce formulaire. La signature de la fonction est la suivante : function hook_form(&$node, $form_state) Les paramètres sont détaillés ci dessous :

164 $node : correspond au nœ ud qui a été enregistré (créé ou modifié) $form_state : correspond à l état du formulaire. La valeur de retour correspond à un tableau associatif de formulaire contenant les composants à afficher. Par exemple, le code suivant du module exemple permet d afficher une zone de saisie pour le résumé du contenu : function exemple_form(&$node) { $type = node_get_types( type, $node); // Champs standard : $form[ title ] = array( #type => textfield, #title => check_plain($type->title_label), #default_value => $node->title, #required => TRUE, ); $form[ body ] = array( #type => textarea, #title => check_plain($type->body_label), #default_value => $node->body, #rows => 20, #required => TRUE, ); $form[ filter ] = filter_form($node->format); // Champs personnalisés : $form[ resume ] = array( #type => textare, #title => t( Résumé ), #description => t( Saisissez le résumé du contenu ), ); return $form; }//exemple_form() b. Le hook hook_validate() Lors de l enregistrement d un nœ ud, et notamment lorsque de nouveaux champs ont été ajoutés au contenu, il peut être nécessaire de valider la saisie de l utilisateur pour vérifier la cohérence des données. Le hook hook_validate() est appelé automatiquement lorsqu un contenu est enregistré. Cette fonction n est appelée que si le type du nœ ud en cours d enregistrement a été créé lors de l installation du module courant. Si cette fonction détecte des erreurs de saisie, le nœ ud ne sera pas enregistré. Les erreurs sont détectées en faisant appel à la fonction form_set_error(). Pour plus d information sur cette fonction, cf. chapitre Les fonctions pratiques de Drupal Les autres fonctions. La signature de cette fonction est la suivante : function hook_validate($node, &$form) Les paramètres sont détaillés ci dessous : $node : correspond au nœ ud sur le point d être enregistré. $form : correspond au formulaire. Cette fonction ne renvoie aucune information

165 Par exemple, le code suivant du module exemple permet de vérifier si le champ "resume" a bien été saisi : function exemple_validate($node, &$form) { if(!$node->resume) { form_set_error("resume_error", t( Le résumé est obligatoire. )); }//if() }//exemple_validate() c. Le hook hook_form_alter() Il n y a pas que des formulaires de création et de modification de nœ ud sous Drupal. Il existe toute sorte de formulaires tels que le formulaire de recherche, le formulaire de connexion, etc. Il est indispensable dans un projet de les modifier pour changer l ordre d apparition des composants ou encore en rajouter de nouveaux. Le hook hook_form_alter() permet de réaliser ces modifications. La signature de cette fonction est la suivante : function hook_form_alter(&$form, &$form_state, $form_id) Les paramètres sont détaillés ci dessous : $form : le formulaire lui même. $form_state : l état courant du formulaire. $form_id : l identifiant unique du formulaire. La fonction ne retourne aucune valeur. Par exemple, le code suivant du module exemple permet d ajouter un texte dans le bloc de connexion : function exemple_form_alter(&$form, &$form_state, $form_id) { switch($form_id) { case user_login_block : $form[ message ] = array( #prefix => <div class="title_acces"> ; #value => t( Merci de vous identifier ), #suffix => </div> ); break; }//switch() }//exemple_form_alter()

166 Conclusion Ce chapitre a permis de présenter la structure classique d un module en termes de fichiers et de code. Un module, pour qu il soit viable, doit respecter un ensemble de notations et de conventions pour qu il puisse s intégrer à la plate forme. Ces conventions passent par l utilisation de fonctions normalisées, appelées automatiquement par Drupal à certains moments clés de la génération d une page. Ces hooks, comme on les appelle, permettent de surcharger le système en y ajoutant de nouvelles fonctionnalités. Le principe est simple : on ne modifie pas le moteur, mais on lui rajoute des comportements. Il existe de nombreux hooks disponibles qu il est possible d utiliser au sein d un module en fonction des besoins. Ce chapitre a également introduit les notions de formulaire sous Drupal et notamment leur structure en termes de tableau associatif. Chaque composant de formulaire correspond à une entrée dans ce tableau et c est Drupal qui se chargera de générer le formulaire HTML au moment de son parcours. Le chapitre suivant n aura pas pour objectif de développer à nouveau l utilisation des hooks, mais uniquement de présenter les autres fonctions proposées par le moteur et mises à la disposition des développeurs

167 L accès à la base de données Drupal propose une couche d abstraction permettant de s affranchir de tout code spécifique à un SGBDR ainsi que des fonctions spécifiques que propose PHP pour chacun de ces systèmes. 1. La connexion La première fonction à laquelle on pense est bien évidemment celle permettant de se connecter au serveur de base de données : mysql_connect(). Il n est pas utile de faire appel à une fonction de connexion dans Drupal, la connexion à la base est exécutée quand elle est nécessaire. Néanmoins, si l on souhaite ouvrir une connexion à une autre base de données pour une raison quelconque, il est possible de le faire avec la fonction db_connect(). Elle prend en paramètre une URL de connexion : Cette fonction s utilise en général en adéquation avec db_set_active() qui permet de passer d une base de données à une autre. Ci dessous se trouve un exemple de connexion à la base de données nommée "photothèque" : <?php $connection = db_connect Une fois que la connexion à la base de données est effectuée, il est temps d exécuter des requêtes SQL. 2. L exécution des requêtes Les fonctions mysql_query($sql) et pg_query($sql) seront avantageusement remplacées par db_query($sql[, $attr1, $attr2...]). Cette fonction, en plus de prendre en paramètre la requête SQL, pourra également prendre plusieurs paramètres supplémentaires permettant de spécifier les arguments de la requête et ainsi éviter les attaques de type injection SQL. $sql = "SELECT * FROM {node} node WHERE nid = %u"; $resultats = db_query($sql, 2); L utilisation des accolades est aussi spécifique à cette couche d abstraction. Elle permet l utilisation des noms des tables standard sans forcément connaître le nom du préfixe qui aurait pu être configuré à l installation du site. Tous les modules additionnels sont donc compatibles avec votre installation sans avoir à modifier ni la base de données, ni le code des modules. Les fonctions de PHP sont donc inutiles mais les spécificités des SGBDR peuvent également être évitées. La requête suivante retourne 10 enregistrements de la table node : $sql = "SELECT * FROM {node} node LIMIT 0, 10"; $resultats = db_query($sql); Elle peut être remplacée par la fonction db_query_range($sql[, $attr1, $attr2...], $premier, $limite). Par exemple : $sql = "SELECT * FROM {node} node"; $resultats = db_query_range($sql, 0, 10); Cette fonction prend en paramètre la requête SQL suivie éventuellement des arguments de la requête puis de l indice du premier enregistrement à retourner et enfin du nombre maximum de résultats à retourner. Cette fonction permet de gérer les spécificités du LIMIT de MySQL mais également celui de PostgreSQL. Habituellement, ce type de requête permet aux développeurs de gérer la pagination de leurs résultats. Drupal nous propose une autre fonction spécifique pour assurer cette tâche. Il s agit de la fonction pager_query() dont le - 1 -

168 prototype est le suivant : function pager_query($query, $limit = 10, $element = 0, $count_query = NULL) Grâce à cette fonction, la gestion de la pagination n est plus un casse tête. Il suffit de lui passer la requête SQL que l on souhaite exécuter, suivie de la quantité souhaitée de résultats retournés par page, d un indice permettant d identifier la requête dans une page qui possède plusieurs requêtes paginées et enfin la requête qui permet au système de connaître le nombre total de résultats. Ce dernier paramètre est facultatif si la requête est simple. En effet, la fonction utilisera une expression régulière pour la réécrire et générer une requête avec la fonction SQL COUNT(). Comme avec toutes les autres fonctions d exécution de requêtes SQL, après ces paramètres il est possible de mettre une série d arguments de la requête. Si l on reprend notre exemple du dessus : $sql = "SELECT * FROM {node} node"; $resultats = pager_query($sql); Le système retournera les résultats 10 par 10 (le prototype de la fonction nous indique que le paramètre $limit est à 10 par défaut. Et la requête sera réécrite de la façon suivante pour obtenir le nombre d enregistrements total : SELECT COUNT(*) FROM {node} node Il est important de noter qu une requête qui comporte déjà une clause COUNT() ou qui est très complexe peut poser problème. Auquel cas, il est impératif de spécifier à la fonction pager_query() la requête permettant de compter le nombre total d enregistrements. 3. Le traitement des données Une fois que la requête est exécutée, il faut encore récupérer les résultats pour les traiter ou les afficher. Il existe 3 fonctions pour cela dans Drupal : db_fetch_array() db_fetch_object() db_result() La fonction db_result() n est utile que dans le cas d une requête ne retournant qu un champ d un enregistrement. Par exemple, le code suivant permet de retourner le titre du nœud dont l identifiant est égal à 2 et de l affecter à la variable $titre : $sql = "SELECT node.title FROM {node} node WHERE nid = %d"; $resultats = db_query($sql, 2); $titre = db_result($resultats); Les fonctions db_fetch_array() et db_fetch_object() retournent quant à elles un ensemble d enregistrements. Si l on souhaite afficher tous les titres de l ensemble des nœuds de la base, il suffira d utiliser une structure itérative de type while(). $sql = "SELECT * FROM {node} node"; $resultats = db_query($sql); while ($ligne = db_fetch_array($resultats)) { print $ligne[ title ]; print <br /> ; } La fonction db_fetch_array() retourne un tableau associatif d éléments. Les noms des champs de la table correspondent aux clés du tableau et les valeurs aux valeurs de chaque enregistrement. Cette fonction est équivalente à la fonction mysql_fetch_assoc()

169 La fonction db_fetch_object() retourne un objet dont les attributs correspondent aux champs de la table. $sql = "SELECT * FROM {node} node"; $resultats = db_query($sql); while ($ligne = db_fetch_object($resultats)) { print $ligne->title; print <br /> ; } - 3 -

170 La modification des en têtes Il est parfois utile de disposer d un fichier CSS ou d un fichier JavaScript spécifique pour son module. Il est possible d appeler l un ou l autre de ces fichiers grâce à des fonctions associées. 1. L ajout de feuilles de style La fonction drupal_add_css() permet d insérer un fichier CSS dans les en têtes du fichier HTML qui sera rendu dans le navigateur de l internaute. Elle retourne au système un tableau de fichiers CSS. Le prototype de cette fonction est le suivant : function drupal_add_css($path = NULL, $type = module, $media = all, $preprocess = TRUE) Le premier paramètre est évidemment le chemin vers le fichier CSS en question. Ce chemin est toujours relatif à la racine du site (récupérée grâce à base_path()). Il est important de noter que les fichiers CSS doivent être préfixés du nom du module pour éviter les conflits lors du chargement des fichiers. Le second paramètre correspond au type de fichier CSS à ajouter, il peut avoir pour valeur module ou theme. Le troisième correspond au média concerné par la feuille de style. Cet élément peut prendre les valeurs habituelles (all, print, screen, braille ). Enfin, le dernier paramètre permet de gérer la notion de cache pour les feuilles de style. En effet, il peut être important d avoir recours à ce cache pour éviter d avoir un nombre trop important de fichiers à charger lors de l affichage de la page. Les navigateurs vont plus vite pour charger un gros fichier que deux dont la taille est moitié moindre. Attention cependant, tous les fichiers n ont pas besoin d être mis en cache. Il faut par exemple passer la variable $preprocess à FALSE quand on utilise une CSS sur une page unique comme une page d administration par exemple. 2. L ajout de fichiers JavaScript Pour ajouter un fichier JavaScript, on utilise la fonction drupal_add_js(). Le prototype de la fonction est le suivant : function drupal_add_js($data = NULL,$type = module, $scope = header, $defer = FALSE, $cache = TRUE, $preprocess = TRUE) Le premier paramètre est dépendant du second. Le second paramètre permet de définir le type de JavaScript que l on souhaite ajouter à la page, les valeurs autorisées sont core, module, theme, inline et setting. Ces valeurs définissent donc le premier paramètre. Si l on utilise core, module ou theme, ce paramètre correspond à un chemin vers le fichier JavaScript que l on souhaite ajouter. Drupal charge les fichiers dans l ordre suivant : les fichiers du core puis ceux des modules et enfin ceux des thèmes. Si l on souhaite ajouter du code JavaScript sans passer par un fichier externe, on utilise le paramètre inline qui impliquera l écriture du code JavaScript dans le premier paramètre de notre fonction. Le paramètre setting implique la saisie d un tableau associatif PHP qui sera stocké ensuite dans Drupal.settings. Le paramètre suivant (scope) permet de définir le positionnement de l appel au fichier JavaScript que l on souhaite charger dans notre page HTML. On peut indiquer "header" ou "footer" à ce paramètre. Il est donc envisageable de positionner un fichier JavaScript en tête ou en bas de page selon les besoins du script. Le paramètre defer permet d ajouter l attribut defer="defer" à la balise script. Cet attribut permet le chargement ou l exécution d un fichier JavaScript après le chargement complet de la page. Il vaut mieux privilégier les fonctions proposées par jquery pour obtenir le même résultat dans la mesure où cet attribut n est pas géré par Firefox. Enfin les 2 derniers paramètres fonctionnent de la même façon que leur équivalent dans la fonction drupal_add_css ()

171 Il est également possible de faire appel à un fichier JavaScript externe auquel cas il faut utiliser la fonction drupal_set_html_head(). Cette fonction ne prend qu un seul paramètre. Il s agit de la chaîne HTML permettant l appel à un fichier JavaScript : drupal_set_html_head("<script type= text/javascript src= ></script>"); Il est important de noter qu il faut bien fermer la balise script avec une balise fermante complète, l écriture auto fermante est mal supportée par Firefox

172 La manipulation de chaînes de caractères Dans le chapitre précédent nous avons vu comment intégrer facilement des fichiers supplémentaires au chargement des pages HTML. Drupal étant un framework à part entière, beaucoup de fonctions sont disponibles pour manipuler du texte. Un grand nombre de fonction PHP ont été réécrites pour répondre aux spécificités de Drupal. La fonction PHP strlen() par exemple a été remplacée par la fonction drupal_strlen() qui compte les caractères d une chaîne encodée en UTF 8. Par exemple, le code suivant permet de compter le nombre de caractères de la chaîne Bonjour! : $decompte = drupal_strlen("bonjour!"); print $decompte; //ceci affichera 9 La fonction drupal_substr()permet quant à elle de découper une chaîne de caractères en se basant sur les indices de position des caractères dans une chaîne encodée en UTF 8. Elle fonctionne sur le même principe que sa version originale PHP en prenant le texte à couper en premier paramètre, suivi de la position de départ et de la longueur à laquelle on souhaite découper la chaîne. Par exemple, le code suivant permet de récupérer les cinq premiers caractères de la chaîne Hello World! : $sschaine = drupal_substr("hello World!", 0, 4); print $sschaine; //ceci affichera Hello La fonction drupal_ucfirst() transforme la première lettre d une chaîne de caractères encodée en UTF 8 en majuscule. Cette fonction, ne disposant pas d équivalent en PHP dans les fonctions mbstring (celles qui gèrent les chaînes multioctet dont UTF 8), prend le premier caractère de la chaîne grâce à la fonction drupal_substr() et le transforme en majuscule avec drupal_strtoupper(). Cette dernière et sa congénère drupal_strtolower() transforme une chaîne de caractères UTF 8 en majuscule pour la première et en minuscule pour la seconde. Par exemple, le code suivant permet de transformer la chaîne Hello World! en majuscule : $maj = drupal_strtoupper("hello World!"); print $maj; //ceci affichera HELLO WORLD! Il est parfois intéressant de convertir un texte saisi par l internaute en texte brut. Pour cela Drupal fournit la fonction drupal_html_to_text(). Elle prend deux paramètres correspondant, pour le premier, à la chaîne HTML à convertir en texte brut et, pour le second, à un tableau PHP de balises HTML autorisées. Dans Drupal cette fonction est utilisée principalement pour convertir un contenu du site en texte brut pour un envoi par mail. Par exemple, le code suivant permet de créer un lien et de l afficher via cette fonction : $texte_html = l("mon lien", "http://monsite.com ); $texte_brut = drupal_html_to_text($texte_html); print $texte_brut; En lieu et place du lien HTML prévu, le texte brut s affichera suivi d un indice entre crochets permettant de retrouver le lien en texte brut sous le texte : Mon lien [1] [1] Quand on souhaite ajouter un lien, il existe la méthode classique en écrivant le code HTML mais Drupal nous propose - 1 -

173 une fonction nous permettant de générer facilement un lien. Cette fonction s appelle l(). Le prototype de la fonction est le suivant : function l($texte, $lien, $options = array()); Au lieu d écrire : <a href="http://www.monsite.com">mon site</a> On écrira : <?php print l( Mon site, )?> Le premier paramètre est évidemment le texte ou code HTML qui sera visible et sur lequel le lien sera créé. Le second est le lien à proprement parler. Si le contenu est un lien avec une URL complète, le lien sera considéré comme externe au site. S il s agit d un chemin du site comme node/5, le lien sera construit en récupérant, s il existe, l alias pour ce chemin. Enfin, on peut également fournir <front> qui générera un lien vers la page d accueil du site. Le dernier paramètre est le plus important (ou presque) parce qu il permet de paramétrer le lien que l on souhaite créer. En effet, ce paramètre doit recevoir un tableau associatif. Les clés de ce tableau peuvent être html, attributes, query, fragment, absolute ou alias. La clé html attend une valeur booléenne et permet de définir le type de contenu du paramètre $texte, ce qui permet de créer un lien sur une image par exemple. Le code suivant affichera un lien pointant vers node/5 sur une image s appelant image.png : print l( <img src="image.png" />, node/5, array( html => TRUE)); //Le code source HTML retournera : //<a href="node/5"><img src="image.png" /></a> La clé query attend comme valeur une requête complète du type q=5&op=view ou un tableau associatif avec des couples clé/valeur. La clé fragment attend le nom d une ancre sans le caractère # permettant d atteindre cette ancre sur la page liée. L exemple suivant permet d atteindre l ancre top sur la page node en cliquant sur un lien s appelant Haut de page. print l( Haut de page, node, array( fragment => top )); //Le code source HTML retournera : //<a href="node#top">haut de page</a> Les clés absolute et alias attendent des booléens. absolute permet de définir le lien comme absolu, c est à dire qu il commencera toujours par permettant ainsi de générer des liens pour des affichages qui se feraient en dehors du site comme dans un flux RSS par exemple. alias permet quant à elle d indiquer à Drupal que le lien qui lui est passé est déjà un alias. Enfin, la clé attributes permet d ajouter tous types d attributs supplémentaires à la balise a, comme une classe CSS par exemple. Cette clé attend un tableau associatif. Le code suivant affichera le texte Mon lien dont le lien pointera vers node/5 et la balise HTML a disposera d une classe CSS appelée lien. print l( Mon lien, node/5, array( attributes => array( class => lien ))); //Le code source HTML retournera : //<a href="node/5" class="lien">mon lien</a> - 2 -

174 La manipulation des images 1. L affichage d une image Avant de manipuler les images, il est judicieux de savoir les afficher. Drupal nous permet de le faire facilement avec les fonctions de thème et plus particulièrement la fonction theme_image(). Cette fonction s utilise de la façon suivante : function theme_image($chemin, $alt =, $title =, $attributs = NULL, $getsize = TRUE) Le premier paramètre, comme son nom l indique, correspond au chemin vers l image que l on souhaite afficher (il est ici judicieux d utiliser la fonction drupal_get_path()). Les deux paramètres suivants permettent de définir les attributs alt et title de la balise HTML <img>. Ces deux attributs sont très importants dans le référencement d un site parce qu ils permettent d afficher un texte alternatif quand l image ne peut pas s afficher et d afficher un titre pour identifier correctement le contenu de l image. Le paramètre $attributs sert à définir tous types d attributs dans la balise HTML. Il se compose d un tableau associatif. On peut imaginer intégrer une classe CSS par exemple. Ce paramètre est très intéressant quand on utilise un JavaScript de type lightbox qui nécessite d utiliser l attribut rel dans la balise <img>. Par exemple, le code suivant affichera l image nommée image.png dans la page : print theme_image( image.png, Une image, Le titre de mon image, array( class => maclasse ), TRUE); Enfin le dernier paramètre est lui aussi un élément important. Il permet d alléger les temps de traitement de la page web lors de son chargement. Ceci est important pour faciliter l affichage et le référencement de la dite page Web. Quand ce paramètre est à TRUE, les dimensions de l image sont affichées dans les attributs HTML width et height. Quand il est à FALSE, ces attributs ne sont pas affichés. Si le module ImageCache est installé, il est possible de faire appel à une fonction spécifique permettant d utiliser les profils ImageCache facilement. Il s agit de la fonction theme_imagecache() qui s utilise de la même manière que la fonction theme_image() mais qui nécessite un paramètre supplémentaire qui vient se placer en première position et qui correspond au nom du profil ImageCache par lequel on souhaite faire passer notre image avant son affichage dans la page HTML. Si nous disposons d un profil s appelant une pour l affichage recadré et redimensionné d une image sur la page d accueil d un site, l utilisation de cette fonction se fera de la façon suivante : print theme_imagecache( une, image.png, La Une, Le titre de ma une ); 2. Les modifications possibles d une image Pour la manipulation des images, Drupal se base sur une couche d abstraction permettant de travailler aussi bien avec la librairie GD qu avec une autre librairie comme ImageMagick par exemple. Cette couche d abstraction propose donc toute une série de fonctions facilitant ces manipulations. En voici la liste : image_crop($source, $destination, $x, $y, $largeur, $hauteur) Cette fonction permet de recadrer une image en fonction des paramètres saisis. $x et $y correspondent aux coordonnées des points positionnés en haut et à gauche du rectangle de recadrage et les paramètres $largeur et $hauteur correspondent aux dimensions de notre rectangle de recadrage.le premier paramètre permet de savoir sur quelle image la fonction va agir et le second de connaître la destination d enregistrement de la version recadrée. Cette fonction retournera un booléen correspondant à son statut de réussite. image_crop( image.png, image_crop.png, 0, 0, 50, 30); - 1 -

175 /*Ceci enregistrera une version recadrée en partant du haut gauche de l image d origine et mesurant 50 pixels par 30 dans un fichier s appelant image_crop.png*/ image_get_info($fichier) Cette fonction permet de connaître diverses informations sur le fichier image. Drupal supporte les fichiers au format GIF, PNG et JPEG. Si le fichier n est pas trouvé, la fonction retourne FALSE, sinon elle retournera un tableau associatif contenant les informations sur l image. Les informations qu elle peut renvoyer sont la largeur (width), la hauteur (height), l extension (extension), le type mime (mime_type, dont les valeurs pourront être image/jpeg, image/gif ou image/png) et enfin, la dernière clé correspond à la taille en octets du fichier (file_size). $infos = image_get_info( image.png ); print_r($infos); /*Dans cet exemple la fonction print_r pourrait nous retourner Array ( [width] => 27 [height] => 27 [extension] => png [file_size] => 1858 [mime_type] => image/png ) */ image_resize($source, $destination, $largeur, $hauteur) Il s agit ici d une fonction de redimensionnement de base. Elle ne conserve pas le ratio de l image. Une image qui fait 200 pixels de large par 300 pixels de haut pourra être redimensionnée en 100 pixels par 100 pixels et sera donc carrée au lieu de rectangulaire. Pour conserver le ratio, il faudra utiliser la fonction image_scale(). image_resize( image.png, image_resize.png, 0, 0, 50, 30); /*Ceci enregistrera une version redimensionnée en partant du haut gauche de l image d origine et mesurant 50 pixels par 30 dans un fichier s appelant image_resize.png*/ image_scale($source, $destination, $largeur, $hauteur) Contrairement à la fonction image_resize(), le redimensionnement fourni par cette fonction conserve le ratio de l image. Ce redimensionnement essayera de s approcher le plus possible des 2 dimensions passées en paramètres. L image résultante pourra donc avoir une des deux dimensions plus petite que celle souhaitée. La fonction commence par vérifier si le ratio de l image est inférieur au ratio souhaité. Le ratio est obtenu en divisant la hauteur par la largeur. Si c est le cas, les valeurs utilisées sont : En largeur : la plus petite des valeurs entre la largeur souhaitée et la largeur de l image. En hauteur : la largeur multipliée par le ratio. Si, au contraire, le ratio est plus grand alors les valeurs utilisées sont : En largeur : la hauteur divisée par le ratio. En hauteur : la plus petite des valeurs entre la hauteur souhaitée et la hauteur de l image. image_scale( image.png, image_scale.png, 10, 10); /*Ceci enregistrera une version redimensionnée en gardant l échelle mesurant 10 pixels par 10 dans un fichier s appelant image_scale.png*/ image_scale_and_crop($source, $destination, $largeur, $hauteur) L image sera ici redimensionnée sans respect du ratio en recadrant à distance égale des bords gauche, droit, haut et bas de cette image. L image qui en résultera disposera des dimensions fournies à la fonction

176 image_scale_and_crop( image.png, image_scale_n_crop.png, 10, 10); /*Ceci enregistrera une version redimensionnée en gardant l échelle et recadrée, mesurant 10 pixels par 10 dans un fichier s appelant image_scale_n_crop.png*/ image_rotate($source, $destination, $degres, $background =0x000000) L objectif ici est de permettre la rotation de l image selon un angle spécifié dans le paramètre $degres. Le dernier paramètre permet de spécifier la couleur du fond dans le cadre qui n est plus recouvert par l image. La valeur à fournir est une valeur hexadécimale (0x pour le noir, 0xff0000 pour le rouge ). La rotation s effectue dans le sens des aiguilles d une montre. image_rotate( image.png, image_rotate.png, 90); /*Ceci enregistrera une image dans un fichier s appelant image_rotate.png en la tournant vers la droite de 90 degrés et en remplissant le cadre original de l image en noir.*/ - 3 -

177 Les autres fonctions Voici une liste de fonctions qui peuvent servir en toutes circonstances : drupal_get_path() permet de récupérer le chemin d un module ou d un thème pour facilement afficher une image par exemple. L exemple suivant permet d afficher l image qui s appelle bg navigation item.png située dans le dossier images du thème Garland fourni en standard avec Drupal. print theme_image(drupal_get_path( themes, garland ). /images/bgnavigation-item.png ); Une fonction permet de récupérer le chemin de base de l installation Drupal, il s agit de base_path(). Cette fonction retournera au moins /. Régulièrement il peut être nécessaire de prévenir les internautes d une erreur ou simplement de leur afficher un message. La fonction drupal_set_message() est entièrement dédiée à cette tâche. Cette fonction peut prendre jusqu à trois paramètres. Le premier correspond au message lui même, le suivant permet de définir le type de message que l on souhaite afficher (de ce type dépendra les classes CSS affectées au texte du message) et le dernier permet de spécifier la répétition ou non du message. Par défaut ce dernier paramètre est à FALSE. Le type de message peut être status, warning ou error : status indiquant un message d information, warning une alerte et error une erreur. Le code suivant affiche le message d information Hello World : drupal_set_message( Hello world, status ); Les messages aux internautes sont pratiques dans de nombreux cas mais il existe une fonction pour stocker des messages systèmes destinés, eux, aux développeurs et aux administrateurs d un site Drupal. Il s agit de la fonction watchdog(). Le prototype est le suivant : function watchdog($type, $message, $variables = array(), $severity = WATCHDOG_NOTICE, $link = NULL) Celle ci permet de stocker un message dans le journal d événements du site. Le paramètre type est de type chaîne de caractères et peut prendre n importe quelle valeur. Le message est à fabriquer en fonction de ce que l on souhaite remonter comme information. Le tableau de variables permet d affecter des variables au message que l on souhaite afficher. Le code suivant génère un message dans le journal d événements dans la catégorie TEST et qui affichera pour l utilisateur d administration : message qui affiche 1. watchdog( TEST, message qui affiche %uid, array( %uid => $user- >uid)); Le paramètre $severity permet de définir le niveau de gravité du message. On peut y placer toutes les constantes retournées par la fonction watchdog_severity_levels(). Il y a en tout 8 niveaux de gravité. Enfin le dernier paramètre permet d associer un lien au message

178 Après les alertes dans le journal d événements, on peut également vouloir recevoir un mail quand un événement survient. Pour cela il faut utiliser la fonction drupal_mail(). Cette fonction est un peu plus complexe que les autres parce qu elle nécessite la création d un module implémentant le hook hook_mail(). Ce hook permet de définir le sujet et le corps du mail qui sera envoyé. Le prototype de la fonction est le suivant : function drupal_mail($module, $key, $to, $language, $params = array(), $from = NULL, $send = TRUE); La fonction drupal_mail() sera ensuite appelée en lui passant les paramètres associés au hook que l on aura créé. Un exemple valant un long discours, voici un module exemple implémentant le hook hook_mail() et une fonction générant l envoi du mail. function exemple_envoi(){ drupal_mail( exemple, information, ); } function exemple_mail($key, &$message, $params){ switch($key){ case information : $message[ subject ] = Information ; $message[ body ][] = Bonjour et bienvenue ; break; } } Pour rediriger un utilisateur vers une page du site, il faut utiliser la fonction drupal_goto(). L utilisation de base consiste à lui passer uniquement le chemin vers lequel on souhaite renvoyer l internaute. Cependant il est possible d affiner cette redirection en passant en second paramètre les éléments de la requête (q=node/5 par exemple), en troisième une ancre et enfin en dernier un code HTTP de redirection. Les codes de redirections supportés et le plus souvent utilisés sont les suivants : 301 (valeur la plus souvent recommandée), 302 (valeur par défaut de la fonction), 303, 304, 305 et 307. Il s agit de codes destinés au navigateur du poste client afin de lui indiquer une action à réaliser. Le code 301 indique par exemple que le document a été déplacé de façon permanente, le code 307 permet d informer le navigateur que la requête doit être redirigée temporairement ver l URI spécifiée, etc. drupal_is_front_page() nous permet de savoir si la page courante est la page d accueil du site. Cette fonction retournera TRUE si la page courante est la page d accueil et FALSE dans le cas contraire - 2 -

179 Conclusion Drupal n est pas qu un simple CMS : il s agit d un véritable Framework, fournissant un ensemble de fonctions utilitaires. Ces fonctions, qu elles permettent l accès aux données ou bien des traitements sur les chaînes de caractères, peuvent être utilisées aussi bien dans les modules que dans les thèmes. Le chapitre suivant traite justement du fonctionnement des thèmes et explique notamment comment intégrer des appels à ces fonctions

180 L intérêt des thèmes 1. La composition d un thème Drupal sépare la présentation du traitement. En clair, il sépare l affichage des données des opérations à réaliser (enregistrement, validation, etc.). Les traitements sont réalisés via des hooks définis dans des modules (pour plus d information sur ce sujet, cf. chapitre Développer un module Les hooks). Les différents affichages sont, quant à eux, gérés par les thèmes. Un thème permet de définir comment sont présentées les données dans une page à la fois en termes de structure (positionnement d un bloc dans une page, dimensions d une image, etc.) et de mise en forme (type de police, couleur, etc.). Concrètement, un thème sous Drupal est composé d éléments graphiques tels que des images et des fichiers CSS, mais aussi de fichiers de template (modèle). Ces fichiers de template ont pour objectif de séparer la responsabilité des affichages de chacun des éléments de Drupal inclus dans la page (images, blocs, nœuds). Sous Drupal, une page est structurée en régions. Une région correspond à une zone particulière de la page telle que la zone d en tête ou la zone de contenu. Une région est composée d un ensemble de blocs correspondant soit à des blocs utilisateur (on entend par blocs utilisateur des blocs créés par un utilisateur dans l administration de Drupal) soit à des blocs créés via des modules. Dans les deux cas, le résultat est le même : un élément <div> est généré et le contenu placé à l intérieur. Pour plus d informations sur le concept de thème, de région et de bloc, cf. chapitre Drupal et son architecture L organisation des pages. Un thème permet également de modifier les informations définies par les modules : un libellé d un bouton de formulaire, ou bien une image présente dans un bloc. Bien que l essentiel du contenu d un thème se base sur les fichiers de template (essentiellement composés de code HTML), le développement d un thème nécessite des connaissances en PHP, notamment pour modifier des valeurs qui lui sont passées, ou encore pour effectuer un certain nombre de traitements avant l affichage d un bloc, d un nœud ou d une page. 2. La séparation des responsabilités Le principe d utilisation des thèmes repose sur la séparation des responsabilités du développement de chaque partie d un projet. Par analogie, on pourrait prendre comme exemple un orchestre : chaque instrument est responsable de sa partition et le chef d orchestre est responsable de la cohérence de l ensemble. Pour un projet informatique et le développement d une application Web, il s agit de la même chose : le développeur aura en charge le développement des modules et l intégrateur Web aura pour but de mettre en forme les données fournies par le développeur. L intégrateur n est pas développeur et ne doit pas avoir l obligation de connaître l implémentation de certaines données (structure de la base de données par exemple) ou bien le fonctionnement exact du moteur utilisé (Drupal par exemple). Son travail consiste la plupart du temps à mettre en forme via le langage HTML et les styles CSS des données en provenance de PHP. Même si, bien souvent, l intégrateur Web ne possède pas des connaissances très poussées en développement, c est lui qui a en charge l utilisation du moteur de template : c est à lui de bien définir les avantages et les inconvénients d un moteur par rapport à un autre afin de proposer celui qui sera le plus adapté au projet. Le schéma suivant présente cette séparation des responsabilités : même s il y a une communication nécessaire entre les différents acteurs du projet, le travail de l un ne doit pas empiéter sur le travail de l autre : - 1 -

181 Ceci peut être fait via des moteurs de template. Ces moteurs ont pour objectif de prendre en charge la présentation des données selon plusieurs techniques différentes : certains gardent l intégration de code PHP à l intérieur des templates, d autres bannissent complètement le code PHP au profit de notations plus spécifiques aux moteurs

182 L installation et la configuration d un thème Nombreux sont les thèmes Drupal qu il est possible de trouver sur Internet et notamment sur le site officiel Drupal laisse la possibilité de mettre en place autant de thèmes que l on souhaite, dont un seul peut être le thème par défaut, et d en activer certains seulement. Pour les autres thèmes actifs, les utilisateurs peuvent choisir dans leur profil de les définir par défaut (pour eux) ou non. Ce système permet une plus grande souplesse de configuration de son espace pour l utilisateur. Installer un thème revient tout simplement à le télécharger et à le décompresser dans le répertoire prévu à cet effet. Dans la plupart des cas où il n existe qu un seul site sur la plate forme, le répertoire des thèmes est le répertoire sites/all/themes : Nous allons prendre ici l exemple du thème Zero Point. Pour l installer, il suffit de suivre les étapes suivantes : Télécharger le thème à partir de la page du projet située à l adresse suivante ou le trouver en lançant une recherche directement sur le site drupal.org. Il s agit normalement d un fichier compressé type ZIP ou TGZ. Décompresser l archive directement dans le répertoire sites/all/themes (si ce répertoire n existe pas, le créer au préalable). L arborescence obtenue devrait ressembler à celle ci : Le thème est à présent installé, mais non visible, sur le site : - 1-

183 En effet, pour qu un thème soit utilisable sous Drupal, il faut qu il soit activé. Comme il sera expliqué dans les lignes qui suivent, un thème activé est rendu disponible pour les utilisateurs, c est à dire qu ils peuvent choisir de le définir comme thème par défaut quand ils se connecteront. Il peut par conséquent y avoir plusieurs thèmes activés sur la plate forme et un seul, comme indiqué précédemment, peut être défini par défaut. Pour activer le thème, il suffit de suivre la procédure suivante : Se connecter avec un compte administrateur, puis aller dans Administrer Construction du site Thèmes. La page suivante liste les thèmes que Drupal a trouvés : - 2 -

184 Pour chaque thème listé, une case à cocher permet de l activer ou de le désactiver et un bouton radio permet de le définir par défaut. Cocher à la fois la case à cocher et le bouton radio pour la ligne correspondant au thème Zero Point. Il est également possible de configurer la plupart d entre eux. Il existe deux types de configuration : La configuration générale : il s agit d une configuration commune à l ensemble des thèmes (le logo, le slogan, etc.). La configuration spécifique : il s agit d une configuration un peu particulière fournie avec le thème. Il peut s agir par exemple de la configuration de la couleur générale du thème, dans le cas où cette couleur est administrable. Pour accéder à la page de configuration des thèmes, il suffit de cliquer : Sur le bouton Configurer situé en haut de la page : la page de configuration se place directement sur les paramètres généraux. Sur le bouton Configurer situé sur la ligne du thème correspondant : la page de configuration se place directement sur les paramètres du thème associé. Cliquez sur le bouton Configurer situé en haut de la page. Un système d onglets situé en haut de la page permet de passer plus rapidement de la configuration générale à la configuration d un thème en particulier : - 3 -

185 Sur la page de paramétrage général, il est possible de : Choisir quelles sont les informations visibles sur le site : logo, slogan, nom du site, zone de recherche, etc. Ces informations ou ces composants s afficheront selon ce qui est paramétré. Définir l image du logo et l icône de favoris. Souvent, il est nécessaire de paramétrer de nouveau ces éléments sur les thèmes activés, chacun pouvant avoir sa propre configuration, différente des autres. Chaque thème possède en effet sa propre implémentation, dans laquelle il peut redéfinir certaines propriétés globales, - 4 -

186 mais également certaines informations beaucoup plus spécifiques au thème concerné. Par exemple, le thème Zero Point permet de configurer à peu près tous les éléments affichables de Drupal : les blocs, les menus, les nœuds, etc

187 La structure d un thème Tout comme les modules, un thème possède une structure un peu particulière et normalisée. Un thème doit posséder au minimum, pour pouvoir le personnaliser, deux fichiers : un fichier.info et un fichier template.php. En plus de ces fichiers, il est possible et nécessaire de copier ou de créer d autres fichiers tels que : Un ou plusieurs fichiers CSS. Des fichiers images. Des fichiers de Template. Le nom du répertoire du thème correspond au nom machine (nom informatique) du thème. Par conséquent, il ne faut pas qu il y ait de caractères spéciaux ni d espace dans ce nom. 1. Le fichier.info Le fichier.info, tout comme pour les modules, permet de paramétrer le thème. Il s agit d un fichier d information qui contient un ensemble de paires de clés / valeurs permettant de définir un certain nombre d éléments de configuration. Ce fichier doit respecter quelques conventions : Il doit être placé à l intérieur du thème. Il doit posséder le même nom que le thème. Les clés qu il est possible de placer dans ce fichier d information sont les suivantes : name : le libellé du thème qui est affiché dans la partie d administration. Ce libellé peut contenir des caractères spéciaux. Cette clé est obligatoire. Par exemple : name = Eni - Addvista description : la description du thème qui est affichée dans la page de sélection des thèmes, dans Administrer Construction du site Thèmes. Par exemple : description = Thème exemple pour le livre Drupal 6 screenshot : le nom du fichier image correspondant à la vignette du thème. Par défaut, si cette clé n est pas spécifiée, Drupal cherchera un fichier nommé screenshot.png à la racine du thème. Il est nécessaire de définir cette clé si le nom du fichier image est différent de screenshot.png ou si la vignette est placée ailleurs qu à la racine du site. Par exemple : screenshot = eni_addvista.png version : le numéro de version du thème. Par exemple : - 1 -

188 version = 1.0 core : la version du moteur de Drupal avec laquelle le thème est compatible. Si cette valeur ne concorde pas avec la version en place de la plate forme, le thème est désactivé. Cette valeur peut correspondre à un numéro de version générique, auquel cas la lettre "x" désigne l indice variant. Cette clé est obligatoire. Par exemple : core = 6.x engine : le moteur de template utilisé par le thème. Par défaut, Drupal utilise le moteur phptemplate, mais d autres peuvent être mis en place. Par exemple : engine = phptemplate base theme : le thème parent dans le cas où le thème courant est un sous thème. Le système des sous thèmes permet d appliquer le principe de réutilisation des ressources. En standard, le thème Minelli est un sous thème de Garland. Cette clé doit correspondre au nom machine du thème parent (le nom du répertoire) et non son libellé. Par exemple : base theme = garland régions : la liste des régions disponibles au sein du thème. Par défaut, il existe cinq régions dans une page : header, left, right, content, et footer. Cette clé fonctionne comme un tableau associatif. Pour remplacer ces régions par défaut, il faut spécifier entre crochets le nom machine de la région (aucun caractère spécial) et en tant que valeur le libellé de cette région, qui sera affiché dans la page listant les blocs dans Administrer Construction du site Blocs. Par exemple, par défaut, les régions sont définies comme suit : regions[left] = Left regions[right] = Right regions[header] = Header regions[content] = Content regions[footer] = Footer Mais, l exemple ci dessous redéfinit la liste des régions : regions[gauche] = Barre de gauche regions[droit] = Barre de droite regions[entete] = Zone d entête regions[contenu_haut] = Zone au dessus du contenu regions[contenu] = Zone de contenu regions[contenu_bas] = Zone au dessous du contenu regions[pied_page] = Zone de pied de page Ces régions seront disponibles dans les fichiers de template pour structurer les pages. Par exemple, les régions ci dessous pourraient être positionnées comme suit : - 2 -

189 Dans le fichier de template représenté par ce schéma, chaque région correspond à une variable. Pour afficher le contenu d une région, il suffit de vérifier si elle n est pas vide, et le cas échéant, l afficher. Le code du template implémentant cette structure serait le suivant : <html> <head> </head> <body> <div class="main-body"> <?php if($entete):?> <div class="header"><?php print $entete?></div> <?php endif;?> <div class="main-content"> <?php if($gauche):?> <div class="left"><?php print $gauche?></div> <?php endif;?> <?php if($contenu $contenu_haut $contenu_bas):?> <div class="content-center">?></div> <?php if($contenu_haut):?> <div class="content-top"><?php print $contenu_haut <?php endif;?> <?php if($contenu):?> <div class="content"><?php print $contenu?></div> <?php endif;?>?></div> <?php if($contenu_bas):?> <div class="content-bottom"><?php print $contenu_bas <?php endif;?> - 3 -

190 </div> </div> </body> </html> </div> <?php endif;?> <?php if($droite):?> <div class="right"><?php print $droite?></div> <?php endif;?> <?php if($pied_page):?> <div class="footer"><?php print $pied_page?></div> <?php endif;?> features : la liste des éléments de configuration du thème disponible dans Administrer Construction du site Thèmes. Cette clé fonctionne de la même façon que pour les régions, à cette exception près qu il n existe pas de valeur entre les crochets. Les valeurs par défaut pour chacune des entrées du tableau sont : logo, name, slogan, mission, node_user_picture, comment_user_picture, search, favicon, primary_links et secondary_links. Chacune de ces valeurs correspond à une case à cocher disponible dans la configuration du thème. Si l une de ces fonctionnalités n est pas définie via cette clé features, la case à cocher correspondante n apparaîtra pas. Par exemple, la configuration suivante n autorise pas la sélection du slogan et de la mission : features[] = logo features[] = name ;features[] = slogan ;features[] = mission features[] = node_user_picture features[] = comment_user_picture features[] = search features[] = favicon features[] = primary_links features[] = secondary_links On notera au passage que la notation suit légèrement celle utilisée dans les fichiers ".ini" sous Windows, à savoir que les commentaires (les lignes de slogan et de mission) commencent par un point virgule en début de ligne. Il reste possible de rajouter des fonctionnalités qui n existent pas en standard sous Drupal. Cette partie est détaillée un peu plus loin dans ce chapitre. stylesheets : la liste des feuilles de style utilisées par le thème. Chacun de ces fichiers CSS est inclus au début de chacune des pages gérées par le thème. Cette clé fonctionne de la même façon qu un tableau associatif à deux dimensions : la première spécifie le type de média pour lequel s applique le fichier CSS (par exemple all, screen ou encore print), la seconde correspond à la liste elle même. Par exemple : stylesheets[all][] = style.css stylesheets[all][] = photo.css stylesheets[print][] = photo.css La liste des fichiers CSS définie dans le fichier.info est utilisable à travers la variable $styles. Pour importer les feuilles de style dans la page, il suffit d afficher la variable dans le template : <html> <head> <?php print $styles?> </head> <body> - 4 -

191 <div class="main-body">... Bien qu il n y ait dans l exemple ci dessus que trois fichiers CSS définis, Drupal en importera beaucoup plus au chargement de la page. Cela s explique par le fait que Drupal importe ses propres feuilles de styles et celles utilisées par les différents modules. scripts : la liste des fichiers JavaScript à inclure dans chacune des pages du site. Par exemple : scripts[] = scripts.js scripts[] = jquery.tooltip.js La liste des fichiers JavaScript définie dans le fichier.info est utilisable à travers la variable $scripts. Pour importer ces fichiers dans la page, il suffit d afficher la variable dans le template : <html> <head> <?php print $styles?> <?php print $scripts?> </head> <body>... php : la version minimum de PHP pour que le thème puisse s exécuter. Comme il sera décrit par la suite, un thème n est pas composé que d un ensemble de fichier HTML. Il existe un fichier PHP contenant un ensemble de traitements à réaliser. Ces traitements sont décrits plus loin dans ce chapitre. Par exemple : php = Ci dessous se trouve un exemple complet de fichier.info : name = Eni - Addvista description = Thème exemple pour le livre Drupal 6 screenshot = eni_addvista.png version = 1.0 core = 6.x regions[left] = Left regions[right] = Right regions[header] = Header regions[content_top] = Content Top regions[content] = Content regions[content_bottom] = Content Bottom regions[footer] = Footer features[] = logo features[] = name features[] = favicon features[] = primary_links features[] = secondary_links stylesheets[all][] = styles.css scripts[] = scripts.js 2. Le fichier template.php Les thèmes fonctionnent de la même façon que les modules : Drupal exécute un ensemble de fonctions spécifiques - 5 -

192 avant de rendre l affichage des données. Cela permet d agir sur l affichage après que l ensemble des modules ait été exécuté. Toutes ces fonctions de traitement doivent être situées dans un fichier normalisé nommé template.php. Un des concepts apportés par l utilisation des modules est le principe de surcharge : l idée principale est de rajouter des fonctionnalités au système tout en ne modifiant pas le code d origine. Il s agit de la même chose avec les thèmes. Drupal fournit un certain nombre de mises en forme des données qu il est possible de modifier via des fonctions incluses dans le fichier template.php : c est le système des hooks. Dans un thème, il est possible de surcharger plusieurs choses : Les fonctions Les fichiers de template Pour surcharger une fonction, il suffit de la réécrire dans le fichier template.php et de la renommer pour la faire commencer par le nom machine du thème. Par exemple, si la fonction de base est theme_livre(), il est possible de réécrire la fonction dans le thème nommé eni sous la forme eni_livre(). Pour surcharger un fichier de template défini par exemple dans un module, il suffit de le copier dans le répertoire du thème et de modifier le fichier copié. Ainsi, on ne touche pas au comportement du fichier d origine

193 À chaque fois qu un élément (fonction ou template) est ajouté au thème courant, il est nécessaire de rafraîchir le cache de Drupal. En effet, Drupal met en cache une grande quantité d information concernant les thèmes à travers le registre de thème (aussi appelé "theme registry") pour ne pas avoir à analyser tous les fichiers à chaque traitement de page. Pour vider le cache, il suffit d aller dans Administrer Configuration du site Performance et de cliquer sur le bouton Vider le cache. Les fonctions situées dans le fichier template.php sont de deux ordres : Soit il s agit de fonctions de thème (gérant directement l affichage d une donnée particulière). Soit il s agit de fonctions de prétraitement, aussi appelé preprocessing. Ces dernières permettent de traiter les données avant leur affichage. Il existe par exemple une fonction de preprocessing pour les pages, une autre pour les nœuds, etc. Le code ci dessous est un exemple de fichier template.php. Il permet de rajouter un texte dans la page et la date du jour dans les nœuds. Ce texte et cette date pourront respectivement être utilisés via les variables $text_addvista et $date_courante dans les templates respectifs : <?php function eni_preprocess_page(&$vars) { $vars[ text_addvista ] = t( Ceci est un texte pouvant être affiché dans la page via la variable $text_addvista ); }//eni_preprocess_page()?> function eni_preprocess_node(&$vars) { $vars[ date_courante ] = date( dmy ); }//eni_preprocess_node() - 7 -

194 - 8 -

195 Les différents moteurs de template Drupal permet de mettre en forme les données via un système de thème. Ces thèmes sont gérés notamment grâce à des fichiers de template : ce sont ces fichiers qui permettent de mettre en forme les données rapatriées soit par des modules, soit par le thème lui même. La structure et la syntaxe de ces fichiers de template sont fonction du moteur utilisé. En effet, c est le moteur qui permet de gérer le fonctionnement du rendu d une page. Utiliser tel ou tel moteur de thème n est qu une préférence de développement : il est possible qu un moteur soit plus rapide qu un autre, mais il s agit plutôt d une préférence d écriture. Certains réutiliseront du code PHP au sein des fichiers de template, d autres utiliseront une notation de balises ou encore du code spécifique au moteur. Il est possible d utiliser n importe quel moteur de thème, pourvu qu il soit adapté à Drupal. Le moteur de thème par défaut est un moteur spécifique à Drupal et développé au cours de sa version 4 : phptemplate. Il s agit d un moteur utilisant du code PHP dans les fichiers de template pour afficher les données. Il est ainsi possible d itérer sur une collection via une instruction foreach pour afficher un ensemble de livres par exemple. Le moteur phptemplate n est pas à mettre en place, car installé par défaut, mais il est possible d en installer des supplémentaires : Installer un nouveau moteur de thème sur la plate forme se fait en deux temps : Mettre en place le plugin Drupal correspondant à ce moteur. Mettre en place sa bibliothèque. Le plugin et la bibliothèque doivent être placés dans le répertoire sites/all/themes/engines : - 1 -

196 Par exemple, pour les moteurs smarty et phptal, les répertoires seraient les suivants : sites/all/themes/engines/smarty sites/all/themes/engines/phptal Le thème actif sur la plate forme doit ensuite utiliser la notation du moteur au sein de ses fichiers de template. Par exemple, sous phptemplate, un fichier de template ressemblerait au code suivant : <div class="bloc-livres"> <?php if($livres):?> <div class="liste-livre"> <?php foreach($livres as $livre):?> <div class="livre"><?php print $livre?></div> <?php endforeach;?> </div> <?php endif;?> </div> Sous le moteur smarty, le même fichier contiendrait le code : <div class="bloc-livres"> {if count($livres)} <div class="liste-livre"> {foreach from=$livres item=livre} <div class="livre">{$livre}</div> {/foreach} </div> {/if} </div> Enfin, sous le moteur phptal, le même fichier contiendrait le code : <div class="bloc-livres"> <div class="liste-livre" tal:condition="php:is_array(livres)"> <div class="livre" tal:reapeat="livre livres" tal:content="link"> Texte par défaut </div> </div> </div> - 2 -

197 Les régions et les blocs 1. Les régions Comme expliqué précédemment, les régions permettent de structurer les données d une page. Toutes les informations administrables s affichant dans une page se trouvent dans des régions, excepté le contenu de cette page qui est disponible dans une variable nommée généralement $content. Pour plus d information sur les notions fondamentales de région et de blocs, cf. chapitre Drupal et son architecture L organisation des pages. La gestion des régions et des blocs se fait en deux temps : D abord, il est nécessaire de déclarer les régions à l aide du fichier de configuration du thème (fichier.info). Ensuite il faut placer les variables de région à l intérieur des fichiers de template et enfin, dans l administration de Drupal mais également au sein des modules, il suffit de placer des blocs dans ces régions. Placer un bloc dans une région signifie que ce bloc sera inclus dans le contenu de cette région. Afficher la variable d une région dans un template implique donc l affichage de l ensemble des blocs qui y sont définis. Le schéma suivant décrit ce processus : - 1 -

198 La définition des régions est fondamentale car elle conditionne l organisation de la page. Généralement, elles sont définies au départ par la charte graphique et ne bougent que très peu. 2. Les blocs Si les régions sont des zones structurantes, les blocs quant à eux sont des éléments unitaires d information. Il s agit d éléments fondamentaux sous Drupal, au même titre que les types de contenu et la taxonomie, permettant de gérer uniquement l affichage de données. Même s il est possible via des modules d y rajouter des informations complémentaires, un bloc est structuré en deux parties au minimum : Un titre : il s agit du titre du bloc. Un corps : Il s agit du contenu du bloc. Le contenu du bloc est toujours du contenu texte, mais peut être de deux types : Type simple : l utilisateur saisit le texte directement dans la partie d administration. Cette forme est très utilisée pour afficher une information promotionnelle sur un site marchand, un bloc contenant un objet FLASH ou encore une image. Type complexe : l utilisateur ne peut pas forcément gérer le contenu du bloc car celui ci est généré par un module. Cette forme est très utilisée pour afficher une liste de nœud suivant un critère particulier (par exemple, les 10 derniers livres vendus sur le site). Si aucun titre ne doit apparaître à l affichage, la zone de titre ne doit pas rester vide, sinon un titre par défaut sera utilisé par Drupal. Dans ce cas, il est nécessaire d utiliser la valeur <none>. Un bloc, pour pouvoir être affiché, doit être placé dans une région. Sans cela, il n est pas considéré comme visible et est placé dans une rubrique Blocs désactivés sur la page de gestion des blocs dans Administrer Construction du site Blocs. Chaque bloc est ordonnancé dans une région. Il se voit en effet attribuer un poids (sous Drupal on parle de weight) qui indique son ordre. Un bloc qui possède un poids important sera affiché dans les derniers et inversement. Un bloc ne peut être ajouté qu à une région à la fois. En effet, il n est pas possible d afficher un bloc dans deux régions différentes du site. Un bloc ajouté à une région sera présent dans cette région sur toutes les pages du site. Il n est pas possible d indiquer au bloc d être dans une région sur une page et dans une autre région sur une autre page

199 En revanche, il est possible de définir si ce bloc est affiché ou non dans cette région en fonction de la page. En effet, il est possible de restreindre l affichage dans les propriétés du bloc. Pour plus d information sur ce sujet, cf. chapitre Utiliser Drupal Les blocs

200 Les templates Chaque élément fondamental de Drupal possède un fichier de template particulier : Un nœud possède un template nommé node.tpl.php Un bloc possède un template nommé block.tpl.php Une page possède un template nommé page.tpl.php 1. Le template de nœud Le fichier node.tpl.php correspond en réalité au rendu du contenu d un nœud. Par défaut, Drupal affiche certaines informations comme par exemple les liens associés au nœud ou encore son corps, lequel est agrémenté automatiquement d informations par les différents modules, ce qui est le cas notamment avec le module CCK. En effet, ce module permet de rajouter tous les champs supplémentaires à l intérieur du corps du nœud. Pour plus d information sur l utilisation du module CCK, cf. chapitre Étendre Drupal Les modules additionnels. Le contenu du nœud est disponible directement dans le fichier de template via une variable nommée $content. Cette variable est une chaîne de caractères contenant toutes les informations du nœud déjà formatées. Il n est donc plus possible, ou difficilement, de modifier une information se trouvant dans cette chaîne. Par exemple, l exemple ci dessous présente le fichier node.tpl.php du thème garland : <div id="node-<?php print $node->nid;?>" class="node<?php if ($sticky) { print sticky ; }?><?php if (!$status) { print node-unpublished ; }?>"> <?php print $picture?> <?php if ($page == 0):?> <h2><a href="<?php print $node_url?>" title="<?php print $title?>"><?php print $title?></a></h2> <?php endif;?> <?php if ($submitted):?> <span class="submitted"><?php print $submitted;?></span> <?php endif;?> <div class="content clear-block"> <?php print $content?> </div> <div class="clear-block"> <div class="meta"> <?php if ($taxonomy):?> <div class="terms"><?php print $terms?></div> <?php endif;?> </div> <?php if ($links):?> <div class="links"><?php print $links;?></div> <?php endif;?> </div> </div> Le code ci dessus permet d afficher le contenu du nœud de cette manière : - 1 -

201 Heureusement, Drupal passe au fichier de template l intégralité du nœud sous forme d objet dans la variable $node. Il est donc possible d utiliser directement les informations qui s y trouvent en les affichant dans le fichier de template. Par exemple, le code suivant permet d afficher et de mettre en forme le corps du nœud, l auteur et la date de création :... <div class="content clear-block"> <div class="content-body"> Contenu : <?php print $node->content[ body ][ #value ]?> </div> <div class="content-auteur"> Auteur : <?php print $node->name?> </div> <div class="content-date-publication"> Date de création : <?php print date("d/m/y", $node->created)?> </div> </div>... Le code ci dessus permet d afficher ainsi le nœud : À l intérieur du nœud se trouve le champ body correspondant au contenu complet du nœud, incluant les données supplémentaires. Si l on souhaite afficher que le contenu du corps, il faut utiliser le champ content. Il existe une autre solution consistant à préparer les données avant de les afficher en passant par une fonction de preprocessing

202 Pour plus d information sur le sujet, cf. partie suivante. Le fichier node.tpl.php correspond au fichier de template par défaut des nœuds, c est à dire que tous les nœuds voient en principe leur affichage géré par ce fichier. Dans la plupart des sites Web, les différents types de contenu n ont pas le même rendu : les éléments composant un article de presse n auront pas la même disposition qu un produit d un site marchand par exemple. Il est heureusement possible de spécifier qu un fichier de template s applique à un type de contenu en particulier en spécifiant le nom machine du type de contenu dans le nom du fichier de template suivant le format nodeletypedecontenu.tpl.php. Par exemple, pour un type de contenu produit, on pourra disposer d un fichier node produit.tpl.php. Les fichiers de template sont chargés dans un ordre précis et sont utilisés suivant le principe FIFO (First In First Out). En effet, ces fichiers de template sont empilés dans un tableau PHP et c est le premier fichier contenu dans ce tableau, trouvé dans le répertoire de thème, qui est utilisé : node produit.tpl.php node.tpl.php Il existe deux modes d affichage des nœuds : L affichage des nœuds sous forme de liste. L affichage des nœuds en pleine page. Le premier mode peut s illustrer par une liste d articles ou de produits : chaque nœud sera affiché avec un nombre d informations plutôt sommaire, donnant envie à l utilisateur d en savoir plus. Le second mode correspond par exemple à la fiche même de l article ou du produit : l utilisateur a cliqué sur le titre du nœud et voit s afficher sa fiche détaillée. Cette distinction est faite au sein du fichier de template grâce à la variable $page. Cette variable peut prendre deux valeurs : Si la variable $page possède la valeur 0, le nœud s affiche sous forme de liste. Si la variable $page possède la valeur 1, le nœud s affiche sous forme de page. Par exemple, le code suivant fait cette distinction :... <?php if ($page == 0):?> <h2><a href="<?php print $node_url?>" title="<?php print $title?>"><?php print $title?></a></h2> <?php endif;?>... Dans ce cas, si le nœud s affiche sous forme de liste, un titre avec un lien vers le nœud apparaîtra. 2. Le template de bloc Tout comme les nœuds, les blocs peuvent être mis en forme via un fichier de template nommé block.tpl.php. Dans le thème Garland de Drupal, le fichier contient par exemple le code suivant : <div id="block-<?php print $block->module. -. $block->delta;?>" class="clear-block block block-<?php print $block->module?>"> <?php if (!empty($block->subject)):?> <h2><?php print $block->subject?></h2> <?php endif;?> <div class="content"><?php print $block->content?></div> </div> Ce fichier est très simple : il provoque en l affichage du titre (ici, la variable $block->subject) et du contenu (ici, la - 3 -

203 variable $block->content). Chaque bloc ayant dans la majorité des cas la structure utilisée ci dessus, il n est pas courant de la modifier. Ce fichier block.tpl.php correspond au thème par défaut. Il est possible de créer un fichier de template spécifique pour un bloc en particulier. Les fichiers des blocs respectent l un des nommages suivants : block [module] [delta].tpl.php : ce fichier s applique dans le cas où le bloc a été généré par le module spécifié (mot clé [module]) ainsi qu au delta indiqué (mot clé [delta]). block [module].tpl.php : ce fichier s applique dans le cas où le bloc a été généré par le module spécifié (mot clé [module]). Ce fichier est utilisé si le fichier de template indiquant le delta du bloc n a pas été trouvé. block [region].tpl.php : ce fichier s applique à tous les blocs définis au sein de la région indiquée (mot clé [region]). Ce fichier est utilisé si aucun fichier de template correspondant au module ayant créé le bloc n a été trouvé. block.tpl.php : ce fichier s applique aux blocs dont les fichiers de template ci dessus n ont pas été trouvés. Par exemple, si un bloc est créé dans le module exemple via le delta 0, le fichier de template suivant sera utilisé par Drupal : block exemple 0.tpl.php Le delta d un bloc peut très bien être une chaîne de caractères, auquel cas, le delta pourrait être login : block exemple login.tpl.php 3. Le template de page Au contraire des nœuds et des blocs, éléments unitaires simples, les templates de pages ont en charge, eux, l affichage global de la page : structure, impression, positionnement des régions, etc. C est en effet le dernier template appelé par Drupal pour rendre l affichage d un nœud ou d un menu. Le thème Garland propose le fichier de template suivant : <?php // $Id: page.tpl.php,v /04/30 00:13:31 goba Exp $?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<?php print $language->language?>" lang="<?php print $language->language?>" dir="<?php print $language->dir?>"> <head> <?php print $head?> <title><?php print $head_title?></title> <?php print $styles?> <?php print $scripts?> <!--[if lt IE 7]> <?php print phptemplate_get_ie_styles();?> <![endif]--> </head> <body<?php print phptemplate_body_class($left, $right);?>> <!-- Layout --> <div id="header-region" class="clear-block"><?php print $header;?></div> <div id="wrapper"> <div id="container" class="clear-block"> <div id="header"> <div id="logo-floater"> <?php // Prepare header $site_fields = array(); if ($site_name) { - 4 -

204 $site_fields[] = check_plain($site_name); } if ($site_slogan) { $site_fields[] = check_plain($site_slogan); } $site_title = implode(, $site_fields); if ($site_fields) { $site_fields[0] = <span>. $site_fields[0]. </span> ; } $site_html = implode(, $site_fields); if ($logo $site_title) { print <h1><a href=". check_url($front_page). " title=". $site_title. "> ; if ($logo) { print <img src=". check_url($logo). " alt=". $site_title. " id="logo" /> ; } print $site_html. </a></h1> ; }?> </div> <?php if (isset($primary_links)) :?> <?php print theme( links, $primary_links, array( class => links primary-links ))?> <?php endif;?> <?php if (isset($secondary_links)) :?> <?php print theme( links, $secondary_links, array( class => links secondary-links ))?> <?php endif;?> </div> <!-- /header --> <?php if ($left):?> <div id="sidebar-left" class="sidebar"> <?php if ($search_box):?><div class="block blocktheme"><?php print $search_box?></div><?php endif;?> <?php print $left?> </div> <?php endif;?> <div id="center"><div id="squeeze"><div class="rightcorner"><div class="left-corner"> <?php print $breadcrumb;?> <?php if ($mission): print <div id="mission">. $mission. </div> ; endif;?> <?php if ($tabs): print <div id="tabs-wrapper" class="clear-block"> ; endif;?> <?php if ($title): print <h2. ($tabs? class="withtabs" : ). >. $title. </h2> ; endif;?> <?php if ($tabs): print <ul class="tabs primary">. $tabs. </ul></div> ; endif;?> <?php if ($tabs2): print <ul class="tabs secondary">. $tabs2. </ul> ; endif;?> <?php if ($show_messages && $messages): print $messages; endif;?> <?php print $help;?> <div class="clear-block"> <?php print $content?> </div> <?php print $feed_icons?> <div id="footer"><?php print $footer_message. $footer?></div> </div></div></div></div> <!-- /.left-corner, /.right-corner, /#squeeze, /#center --> <?php if ($right):?> <div id="sidebar-right" class="sidebar"> - 5 -

205 <?php if (!$left && $search_box):?><div class="block block-theme"><?php print $search_box?></div><?php endif;?> <?php print $right?> </div> <?php endif;?> </div> <!-- /container --> </div> <!-- /layout --> <?php print $closure?> </body> </html> Il s agit d un fichier de template de page somme toute assez simple dans lequel les régions par défaut sont affichées uniquement si elles ne sont pas vides :... <?php if ($right):?> <div id="sidebar-right" class="sidebar"> <?php if (!$left && $search_box):?> <div class="block block-theme"> <?php print $search_box?> </div> <?php endif;?> <?php print $right?> </div> <?php endif;?>... Ce fichier est extrêmement important car c est lui qui détermine la structure des pages du thème et où sont placées les régions. En clair, c est lui qui définit le thème

206 Les hooks de thème 1. Les fonctions de thème Pour mettre en forme des données, les modules ont le choix d utiliser les fonctions de thème. Ces fonctions de thème sont des fonctions normalisées dont le nom doit commencer par theme_ suivi du nom de l élément à mettre en forme. Par exemple, theme_produit() permettrait de mettre en forme une fiche produit. function theme_produit($product) { $content = <div class="product"> ;... $content.= $product->title;... $content.= </div> ; return $content; }//theme_produit() Les éléments à mettre en forme doivent être référencés via le hook hook_theme() du module concerné. Par exemple, pour les éléments du dessus, le code du hook hook_theme() serait le suivant : function exemple_theme() { return array( produit => array( arguments => array( product => NULL) ) ); }//exemple_theme() Pour plus d information sur le hook hook_theme(), cf. chapitre Développer un module Les hooks. Il reste possible de réécrire au niveau du thème ces fonctions de thème (dans l exemple ci dessus, la fonction theme_produit()) et d agir ainsi sur l affichage qui en découle. Pour surcharger l affichage d un élément, il suffit de réécrire la fonction en modifiant son nom de la sorte : function lenomdutheme_fonctiondetheme() Dans l exemple ci dessus, si le thème doit mettre en italique le titre, le code suivant pourrait être ajouté : function eni_produit($product) { $content = <div class="product"> ;... $content.= <i>.$product->title. </i> ;... $content.= </div> ; return $content; }//eni_produit() Le principe appliqué dans le cas des fonctions de thème s apparente plus au principe de la redéfinition que de la surcharge. En effet, Drupal ne tiendra pas compte de la mise en forme des fonctions de thème des modules si elles sont redéfinies par le thème actif. 2. Les fonctions de preprocessing - 1 -

207 a. Le hook hook_preprocess_node() Il existe une autre solution consistant à préparer les données avant de les afficher. Il s agit d implémenter une fonction spécifique nommée lenomdutheme_preprocess_node() exécutée avant l appel du template de nœud node.tpl.php où lenomdutheme correspond au nom machine du thème. Cette fonction possède la signature suivante : function lenomdutheme_preprocess_node(&$vars) Comme expliqué, cette fonction laisse au développeur la possibilité de modifier les informations destinées à être affichées dans le fichier node.tpl.php. Le paramètre $vars est un tableau associatif correspondant à toutes les informations qui seront passées au fichier de template. Cette variable est passée par référence pour qu elle puisse être modifiée directement dans la fonction. Ainsi, cette dernière n a pas besoin de retourner quoi que ce soit. Toute information qui n existerait pas initialement dans cette variable $vars peut tout de même y être ajoutée en spécifiant une clé arbitraire. Par exemple, le code ci dessous supprime toutes les balises HTML du contenu du nœud, place le résultat dans une entrée nommée corps_modifie et en rajoute une autre nommée resume correspondant au résumé généré dynamiquement (les deux cents premiers caractères du contenu) : function eni_preprocess_node(&$vars) { $vars[ corps_modifie ] = drupal_html_to_text($vars[ node ]- >content[ body ][ #value ]); $vars[ resume ] = substr($vars[ corps_modifie ], 0, 200)."..."; }//eni_preprocess_node() Ces données sont directement utilisables sous forme de variables dans le fichier node.tpl.php :... <div class="content clear-block"> <div class="content-resume"> Résumé : <?php print $resume?> </div> <br/> <div class="content-corps-modifie"> Corps modifié : <?php print $corps_modifie?> </div> <br/> <div class="content-body"> Contenu : <?php print $node->content[ body ][ #value ]?> </div> <div class="content-auteur"> Auteur : <?php print $node->name?> </div> <div class="content-date-publication"> Date de création : <?php print date("d/m/y", $node->created)?> </div> </div>... Le résultat correspond à la copie d écran suivante : - 2 -

208 b. Le hook hook_preprocess_block() Il est possible de formater les informations avant de les transmettre au fichier de template, via la fonction nommée lenomdutheme_preprocess_block() dont la signature est la suivante : function lenomdutheme_preprocess_block(&$vars) Le paramètre $vars est passé par référence et correspond à un tableau comportant l ensemble des variables qui peuvent être utilisées à l intérieur du fichier de template. Il est ainsi possible de modifier le titre du bloc ou son contenu avant leur affichage. Le code suivant par exemple permet de rajouter au contenu affiché l identifiant de l utilisateur connecté : function eni_preprocess_block(&$vars) { global $user; $content_to_add = <div class="user-connected"> ; $content_to_add.= t("connected user :!username", array("!username" => $user->name)); $content_to_add.= </div> ; $vars[ block ]->content.= $content_to_add; }//eni_preprocess_block() c. Le hook hook_preprocess_page() À l instar des nœuds et des blocs, il est possible de formater les données avant de les transmettre au template via une fonction nommée lenomdutheme_preprocess_page() dont la signature est la suivante : function lenomdutheme_preprocess_page(&$vars) Le paramètre $vars est passé par référence et correspond à un tableau comportant l ensemble des variables qui peuvent être utilisées à l intérieur du fichier de template

209 Le contenu de la variable $vars[ content ] correspondant au contenu même de la page est déjà formaté. Si une modification des données s y trouvant est souhaitée, il est nécessaire de spécifier cette modification à l intérieur d une autre fonction de preprocessing. Par exemple, le code suivant permet d ajouter dans la page le texte statique Bienvenue suivi du nom de l utilisateur connecté ou Connectez vous! s il s agit d un utilisateur anonyme : function eni_preprocess_page(&$vars) { global $user; if($user->uid == 0) { // Cas d un utilisateur non connecté : $vars[ home_message ] = l(t("connectez-vous!"), "user"); }//if() else { // Cas d un utilisateur connecté : $vars[ home_message ] = t("bienvenue!user", array("!user" => $user->name)); }//else() }//eni_preprocess_page() En insérant l affichage de cette variable dans le fichier de template des pages : <?php if($home_message):?> <div class="home-message"> <?php print $home_message?> </div> <?php endif;?> On obtiendra l affichage suivant : d. Le hook hook_preprocess() Les parties précédentes expliquent le fonctionnement des fonctions de preprocessing des nœuds, des blocs et des pages. Celles ci permettent d effectuer un certain nombre de traitements sur ces éléments avant de les afficher. En réalité, il existe bien d autres fonctions de preprocessing. En effet, il en existe une pour chaque fichier de template. Ces fonctions sont déclinées de la façon suivante : function lenomdutheme_preprocess_lafonctiondetheme(&$vars) Dans cette signature, le mot clé lenomdutheme correspond au nom machine du thème, et le mot clé lafonctiondetheme correspond à la clé de l élément mis en forme. Le mot clé lafonctiondetheme ne correspond pas au nom du fichier de template, mais bien à la clé de l élément mis en forme défini par le hook hook_theme(). Le schéma suivant illustre le fonctionnement du système de preprocessing : - 4 -

210 Ce système permet de gérer l affichage de chacune des informations utilisées au sein d un fichier de template. Cela rend également le système très souple : chaque thème pourra modifier à sa guise ces informations pour qu elles puissent coller au maximum à l interface graphique générale. Par exemple, le code ci dessous permet de modifier les informations d un produit avant de l afficher : function eni_preprocess_produit(&$vars){ $vars[ price ] = sprintf("%01.2f", $vars[ product ]->price); }//eni_preprocess_produit() Il est également possible de déclarer une fonction exécutée avant tout appel de template. Il s agit tout simplement de la fonction : function lenomdutheme_preprocess(&$vars) Cette fonction générique est exécutée avant toutes les autres et permet de modifier une information de façon générale. Par exemple, le code ci dessous permet de mettre en forme le titre de tous les éléments gérés par des fichiers de template : function eni_preprocess(&$vars) {... $vars[ title ] = <i>.$vars[ title ]. </i> ;... }//eni_preprocess() Cette fonction de preprocessing peut en réalité être très générique : on peut indiquer à Drupal que cette fonction est utilisée uniquement par ce thème en la faisant précéder par le nom du thème correspondant (cas des exemples précédents) ou bien qu elle est beaucoup plus générale et qu elle peut de cette façon être utilisée par l ensemble des thèmes dépendant d un même moteur de thème. Par exemple, si l on souhaite que l exemple précédent concernant l affichage du titre en italique soit partagé par les thèmes basés sur le moteur phptemplate, il suffirait d écrire le code suivant : function phptemplate_preprocess(&$vars) { - 5 -

211 ... $vars[ title ] = <i>.$vars[ title ]. </i> ;... }//phptemplate_preprocess() Il faut faire très attention avec ce type de fonction générique. Il faut en effet s assurer qu aucun autre thème ne la déclare, auquel cas PHP détectera un conflit (deux fonctions ne peuvent pas avoir le même nom)

212 La configuration avancée Il est possible d ajouter toute une partie de paramétrage à un thème personnalisé : par exemple laisser le choix de la couleur à l utilisateur, définir la largeur des pages, le type de police, etc. En fonction de ces éléments configurables, le thème se comportera d une façon différente. La spécification d une configuration avancée dans un thème présente plusieurs avantages. Tout d abord, il s agit de laisser la possibilité à l utilisateur de configurer la plus grande quantité possible d informations afin que le thème soit le plus polyvalent possible. Ensuite, pouvoir personnaliser un thème, c est pouvoir également personnaliser les sousthèmes qui en découlent. Enfin, le paramétrage des propriétés au sein de la partie d administration évite de modifier le code du thème pour caler certains éléments graphiques au sein d une page. Pour définir des éléments configurables au sein d un thème, il est nécessaire de créer un fichier de configuration nommé theme settings.php. À l intérieur de ce fichier, une fonction respectant le nommage suivant doit être présente : function lenomdutheme_settings($saved_settings) Par exemple, pour le thème Garland, on pourrait retrouver la fonction : function garland_settings($saved_settings) Cette fonction a pour objectif de rajouter des informations au formulaire de configuration du thème. Par conséquent, il n est pas surprenant que cette fonction doive retourner un tableau de formulaire contenant les différents composants à rajouter. Par exemple, le code suivant permet de rajouter une zone de saisie pour définir la couleur de la police du site : function eni_settings($saved_settings) { $default_values = array( couleur => # ); $settings = array_merge($default_values, $saved_settings); $form = array(); $form[ couleur ] = array( #type => textfield, #title => t( Couleur de police ), #description => ( Saisissez la couleur de la police utilisée sur le site ), #default_value => $settings[ couleur ] ); return $form; }//eni_settings() Pour récupérer cette couleur saisie par l utilisateur dans la partie d administration il suffit d utiliser la fonction theme_get_setting() en lui passant comme paramètre le nom de la propriété à récupérer. Par exemple, pour récupérer dans le fichier template.php du thème la couleur ci dessus, il faudrait utiliser le code suivant : function eni_preprocess_page(&$vars) {... $color = theme_get_setting( couleur );... }//eni_preprocess_page() Il existe aussi une fonction nommée theme_get_settings() prenant en paramètre le nom d un thème et qui permet de récupérer toutes les valeurs de la configuration du thème. Chacune des propriétés avancées du thème peut se voir attribuer une valeur par défaut grâce au fichier lenomdutheme.info. Ainsi, pour donner une couleur par défaut à la zone de saisie, il est possible de rajouter cette ligne dans ce fichier :... settings[couleur] = #

213 Dans le même temps, il faut pouvoir récupérer ces valeurs par défaut au moment de l affichage du formulaire. Cela peut être réalisé grâce à la fonction list_themes() permettant de rapatrier toutes les informations de l ensemble des thèmes actifs. L utilisation de la variable globale $theme, correspondant au thème actuellement utilisé, permet de retrouver les informations qui lui sont associées, dans le tableau renvoyé par la fonction list_themes() : function eni_settings($saved_settings) { global $theme; $themes = list_themes(); $default_values =!empty($themes[$theme]->info[ settings ])? $themes[$theme]->info[ settings ] : array(); $settings = array_merge($default_values, $saved_settings); $form = array(); $form[ couleur ] = array( #type => textfield, #title => t( Couleur de police ), #description => ( Saisissez la couleur de la police utilisée sur le site ), #default_value => $settings[ couleur ] );...?> On peut remarquer que chaque composant est automatiquement enregistré par Drupal. En effet, aucune fonction de traitement n est requise ici, le moteur s occupant de la gestion des données. Cependant, il n en est pas de même pour certaines actions comme par exemple le transfert de fichier. Dans ce cas précis, il est nécessaire de rajouter une action de validation au sein du composant lui indiquant d exécuter une action qui s occupera de gérer ce transfert. Le code suivant permet de rajouter au paramétrage du thème une possibilité d uploader un bandeau promotionnel : function eni_settings($saved_settings) { $default_values = array( couleur => # ); $settings = array_merge($default_values, $saved_settings); $form = array(); $form[ couleur ] = array( #type => textfield, #title => t( Couleur de police ), #description => ( Saisissez la couleur de la police utilisée sur le site ), #default_value => $settings[ couleur ] ); $form[ chemin_bandeau ] = array( #type => textfield, #title => t( Chemin d\ accès au fichier ), #description => t( Saisissez le chemin d\ accès au fichier du bandeau ) ); $form[ bandeau ] = array( #type => file, #title => t( Bandeau promotionnel ), #description => t( Choisissez l\ image correspondant au bandeau promotionnel ) ); $form[ bandeau ][ #element_validate ][] = eni_settings_file_submit ; return $form; - 2 -

214 }//eni_settings() Drupal n est pas capable de gérer l enregistrement d un fichier par défaut. Le code suivant permet de copier le fichier au sein de Drupal et d initialiser la valeur du champ chemin_bandeau situé dans le POST avec le chemin d accès au fichier après la copie : function eni_settings_file_submit($form, &$form_state) { if($file = file_save_upload( bandeau )) { $parts = pathinfo($file->filename); $filename = bandeau.$parts[ extension ]; if(file_copy($file, $filename)) { $_POST[ chemin_bandeau ] = $form_state[ values ][ chemin_bandeau ] = $file->filepath; }//if() }//if() }//eni_settings_file_submit() - 3 -

215 Le système de sous thèmes Pour des raisons évidentes liées à la réutilisation (on essaie de ne pas réinventer la roue), Drupal permet de décliner les thèmes sous forme de thème parent / thème enfant ou encore thème / sous thème. Le principe est simple : un sous thème peut bénéficier de nombreuses informations contenues dans le thème parent. Cela peut être très utile dans le cas d une gestion multisite dans laquelle le code de la plate forme est identique pour l ensemble des sites installés. En effet, il peut être proposé aux utilisateurs un large choix de thèmes à appliquer à leur site Web : colonages différents, couleurs différentes ou polices différentes. Dans ce cas, il est possible de regrouper un certain nombre de choses communes à ces thèmes (fichier de template, JavaScript, etc.) et de ne modifier dans les sous thèmes que certains éléments graphiques comme par exemple les CSS. Cela permet également de réduire la maintenance du site : si les fonctionnalités sont gérées à plus haut niveau (celui du thème parent), une modification de l une d entre elles à ce niveau permettra une répercussion immédiate sur les sous thèmes. Pour installer un sous thème, la procédure à suivre est la même que pour la mise en place d un thème, à la différence près qu il est nécessaire de spécifier le nom machine du thème parent via la ligne suivante du fichier.info : base theme = garland En clair, les sous thèmes héritent des éléments définis dans le thème parent. Toutefois, tous les éléments ne peuvent pas être réutilisés par les sous thèmes. La liste des éléments réutilisables est fournie ci dessous : Les fichiers CSS : Les sous thèmes héritent des feuilles de style du thème parent. Il est possible de surcharger un fichier CSS parent en incluant dans le fichier de configuration du thème, le fichier.info, la ligne suivante : stylesheets[all][] = styles.css Cette ligne aura pour effet de rajouter des CSS en plus de celles du thème parent. Les fichiers JavaScript : Le système est le même que pour les fichiers CSS : chaque fichier JavaScript du sous thème pourra être ajouté à la liste des fichiers utilisés via la ligne du fichier.info suivante : scripts[] = scripts.js Le fichier template.php Pour surcharger les fonctions présentes dans le fichier template.php du thème parent, il n y a pas d autre solution que de passer par les hooks de thème, et de suivre ainsi la norme consistant à faire précéder chaque hook par le nom du sous thème. Les fichiers de template (*.tpl.php) : Les fichiers de template par défaut seront ceux du thème parent. S il est nécessaire de modifier l un de ces fichiers, il suffit de le copier dans le thème enfant et d effectuer les différentes modifications. C est ce dernier qui sera pris en compte par Drupal. Si un fichier de template spécifique tel que node product.tpl.php doit être créé dans le thème, le fichier principal node.tpl.php doit obligatoirement être présent dans le thème. Si ce dernier est absent, Drupal ne tiendra pas compte du fichier spécifique. Si ce bug a été corrigé dans Drupal 7, ce n est pas le cas avec la version 6. La vignette du thème : Par défaut, si rien n est spécifié dans le sous thème, c est la vignette du thème parent qui est prise en compte par Drupal. Cette vignette peut être redéfinie dans le sous thème via la ligne du fichier.info suivante : screenshot = eni_addvista.png - 1 -

216 Les régions : Il n y a pas d héritage possible entre les régions. Le sous thème ne peut pas réutiliser les régions du thème parent. Le paramétrage : Il n y a pas d héritage possible entre les paramètres des thèmes. Le sous thème ne peut pas réutiliser ces informations

217 Conclusion Si les modules permettent de réaliser un ensemble de traitements, les thèmes, quant à eux, permettent de contribuer à la mise en forme des données. Ce sont les thèmes qui permettent de positionner les éléments dans la page, d imposer un style particulier et de séparer la responsabilité des différents affichages. Ces affichages passent par l utilisation de fichiers de template, fichiers PHP ayant pour objectif de mettre en forme les informations. Il existe plusieurs types de fichiers de template sous Drupal, chacun permettant de s occuper de la mise en forme d un élément : affichage d un nœud, d un bloc ou d une page. Un affichage peut également être géré directement par une fonction, à la place d un fichier de template, via un hook spécifique : les thèmes et les modules, bien qu ayant des objectifs distincts, ne sont pas fondamentalement décorrélés mais bien utilisés conjointement par le système

218 Introduction La plus grande crainte que l on peut avoir sur un site internet est le détournement des fonctions que l on a écrites pour modifier le contenu du site. Il existe un grand nombre de façons pour une personne animée de mauvaises intentions de tenter de modifier un site internet. Par exemple on peut imaginer qu une personne veuille utiliser votre site pour envoyer du spam ou bien s introduire dans le système pour accéder à des informations auxquelles elle n est pas censée avoir accès. Heureusement, Drupal fournit un ensemble d outils permettant d éviter les principales erreurs que l on peut faire en tant que développeur. En préambule, il est bon de savoir que la plupart des failles informatiques sont en fait des failles humaines. Il est très simple de se faire passer pour une personne du service informatique. En discutant avec suffisamment de tact avec une personne néophyte, il est possible d obtenir très facilement un nom d utilisateur et un mot de passe. Donc la première chose à faire pour sécuriser son site Drupal est de spécifier des rôles et des droits restreints pour chacun d entre eux autant que possible. Ceci évitera l utilisation du superutilisateur pour des tâches qui ne nécessitent pas de l être et donc la fuite d un mot de passe permettant un accès complet au site

219 La sécurisation des requêtes SQL 1. Les variables de remplacement La première chose à faire, et le chapitre Les fonctions pratiques de Drupal nous l a montré, est de sécuriser ses requêtes SQL. Pour cela il faut absolument utiliser les variables de remplacement. Ceci permettra d éviter ce que l on appelle les injections SQL. La requête suivante n est par exemple pas sécurisée : $sql = "SELECT * FROM {node} node WHERE type = $type "; Si cette variable $type prend sa source dans une URL du site par exemple, il sera très simple d injecter un bout de code SQL et de contourner le fonctionnement normal de la requête. Dans notre exemple, l URL enverra à notre fonction le type page. La requête sera donc : SELECT * FROM {node} node WHERE type = page "; L utilisation frauduleuse se présenterait ainsi : %20OR%20type= story La requête suivante en découle alors : SELECT * FROM {node} node WHERE type = page OR type= story "; Il faudra remplacer cette écriture par celle ci : SELECT * FROM {node} node WHERE type = %s "; db_query($sql, $type); La ou les variables passées à la fonction db_query() seront ici échappées (avec un \) et donc la tentative d injection donnera une requête SQL qui ne pourra pas être exécutée : SELECT * FROM {node} node WHERE type = page\ OR type=\ story "; Il est bien sûr possible d améliorer encore le fonctionnement de cet exemple précis mais chaque cas étant spécifique, nous resterons sur cette sécurisation de base. a. Le hook hook_db_rewrite_sql() Pour améliorer encore la sécurité, on peut souhaiter ajouter la gestion des droits internes au site à notre requête. Ceci se fera à l aide de la fonction db_rewrite_sql(). Il est nécessaire d ajouter l alias de la table et la clé primaire dans la requête SQL pour que cette fonction soit opérationnelle. Si l on reprend l exemple précédent : $sql = SELECT node.nid, node.* FROM {node} node WHERE type = %s "; db_query(db_rewrite_sql($sql), $type); Ici, les modules qui implémentent le hook hook_db_rewrite_sql() seront appelés et modifieront la requête pour y intégrer les éléments de restrictions que l on souhaite. Le module node par exemple y intégrera les éléments spécifiques aux droits d accès des nœuds. Pour bien comprendre le fonctionnement de ce hook, voici son prototype : function hook_db_rewrite_sql($requete, $table_primaire, $champ_primaire, $arguments) Et voici son implémentation dans le module node : function node_db_rewrite_sql($query, $primary_table, $primary_field) - 1 -

220 { if ($primary_field == nid &&!node_access_view_all_nodes()) { $return[ join ] = _node_access_join_sql($primary_table); $return[ where ] = _node_access_where_sql(); $return[ distinct ] = 1; return $return; }//if }//node_db_rewrite_sql Le code ci dessus fait appel aux deux fonctions _node_access_join_sql() et _node_access_where_sql() qui permettent d inclure, au sein de la requête SQL qui sera exécutée, une jointure et une sélection sur la table node_access, accroissant ainsi la sécurité

221 Les permissions 1. Les droits d accès Dans le chapitre précédent, nous avons vu que l on peut sécuriser les requêtes SQL. Ici nous allons voir que chaque module peut disposer de ses propres droits d accès et que l on peut facilement les configurer. Il faut pour cela utiliser le hook hook_perm(). Quand on crée une page dans un module à l aide du hook hook_menu(), le tableau de chemin que l on crée contient une clé qui s appelle access arguments et qui sera passée en paramètre de la fonction indiquée par la clé access callback. Par défaut la valeur de cette clé est définie à user_access. Pour résumer, quand un utilisateur accède à la page spécifiée par ce hook, Drupal exécute la fonction user_access() et lui passe en paramètre la valeur spécifiée par la clé access arguments. Si le retour de cette fonction est TRUE, l utilisateur dispose des droits suffisants, sinon il verra apparaître un message lui indiquant que son accès est refusé. La case access arguments contient un tableau de permissions qui sont définies par le hook hook_perm(). Ces permissions sont de simples chaînes de caractères décrivant le droit octroyé. Le code suivant présente le hook hook_menu() faisant appel aux arguments d accès. La valeur de la clé access arguments est array( access content ). La fonction user_access() vérifiera si l internaute dispose du droit d accès au contenu. function exemple_menu() { $items = array(); $items[ chemin/de/la/page ] = array( title => Ceci est une page, description => Page d\ exemple, page callback => exemple_page, access arguments => array( access content ), type => MENU_NORMAL_ITEM, ); return $items; }//exemple_menu() Le code suivant présente l implémentation du hook hook_perm(). Il permet d ajouter au système trois nouvelles permissions : les droits d administrer les exemples, d ajouter et de voir ces exemples. function exemple_perm() { return array( Administrer les exemples, Ajouter des exemples, Voir les exemples ); } Cette notion de droit d accès est fondamentale dans Drupal, il est donc très important de bien implémenter les droits dans les modules que l on développe

222 La sécurité des formulaires 1. FAPI (Form API) Un des avantages à utiliser l API Drupal (spécifique aux formulaires Drupal, appelée communément FAPI) pour la création des formulaires est que la sécurité est en grande partie gérée par le système. Le chargement d un formulaire dans Drupal implique une séquence d événements impliquant notamment la validation du formulaire. Cette validation permet de s assurer que les données envoyées par le formulaire sont celles que l on est censé recevoir. La fonction drupal_get_form() qui s occupe de générer les formulaires fonctionne de la façon suivante : Démarrage du traitement en récupérant la variable $form. Conversions de tous les éléments de type $form[ nom ] en balises HTML. Appel de toutes les fonctions de validation (génériques et spécifiques) et de toutes les fonctions de nettoyage. Soumission du formulaire si une fonction de soumission est déclarée et que le formulaire l a été. Appel de toutes les fonctions de rendu visuel qui ont été déclarées. Renvoi de la chaîne HTML contenant le formulaire. Dans ce processus on se rend compte que la troisième étape est importante et nettoie le code et les saisies utilisateur pour éviter les tentatives de piratage. Les fonctions de validations peuvent être définies dans la création du formulaire et utilisent le hook hook_validate(). Le code suivant permet d afficher un message d erreur quand un champ de code postal contient autre chose que des chiffres et fait plus de 5 caractères. function exemple_form(){ $form = array() ; $form[ code_postal ] = array( #type => textfield, #title => t( Code postal ), #description => t( Saisissez votre code postal ), #default_value => 60000, ); $form[ #validate ][] = exemple_validate ; return $form ; }//exemple_form() function exemple_validate($form, &$form_state){ if (!is_numeric($form_state[ values ][ code_postal ] drupal_strlen($form_state[ values ][ code_postal ]) > 5) { form_set_error( code_postal, Le code postal doit être exclusivement chiffré et faire 5 caractères. ) ; } }//exemple_validate() Une fois que le formulaire est envoyé, il ne faut pas utiliser la super globale $_POST pour traiter les valeurs du formulaire mais bien sûr la variable $form_state[ values ] qui contient un tableau de l ensemble des valeurs saisies dans le formulaire. 2. Les marqueurs de remplacement - 1 -

223 Lors de la création du formulaire, il est impératif d utiliser des fonctions de traduction ou de nettoyage de code. L élément #title de notre champ code postal aurait pu être traité par la fonction check_plain() au lieu de la fonction t (), permettant de ce fait l utilisation si nécessaire des ou % pour l insertion de variables dans les chaînes de caractères, tout comme la description. Dans le code suivant, on peut voir comment fonctionnent les marqueurs dans la fonction t(). drupal_set_message(t( $user- >name))) ; Le indique à la fonction t() de passer la variable remplaçant le marqueur dans la fonction check_plain(). Celle ci remplacera tout code HTML contenu dans la variable par leur entité correspondante. Chaque préfixe dispose de sa propre règle de réécriture. Le préfixe! indiquera à la fonction de ne pas transformer le texte, le préfixe % passera la chaîne dans une fonction de thème portant le nom theme_placeholder() permettant une mise en italique du texte qui sera passé dans check_plain(), et que l on vient de voir qui passe la variable dans la fonction check_plain(). La valeur par défaut définie par la clé #default_value n a pas besoin de ces fonctions parce que le passage dans la fonction de thème pour le rendu visuel du formulaire s en occupera

224 La sécurité de MySQL 1. L utilisateur root Dans un environnement de développement il est tout à fait envisageable d utiliser l utilisateur root pour se connecter à la base de données. Cependant dans un environnement de production cette solution est une faille de sécurité immense. En effet, root est le superutilisateur de la base de données et dispose donc de tous les droits. Aussi bien ceux de création de base que de suppression mais également le droit d attribution de permissions d accès. Quelqu un qui réussirait à accéder à la base de données avec ce compte utilisateur, en plus de tout détruire, pourrait également s octroyer tous les droits en créant un autre superutilisateur. Il est donc absolument nécessaire de créer un utilisateur par base de données et de lui attribuer des privilèges restreints. Pour créer un utilisateur avec des droits spécifiques dans MySQL il faut taper la commande suivante : GRANT privilege ON base[.table] TO adresse_ip IDENTIFIED BY mot_de_passe Il s agit d une requête SQL, les caractères spéciaux SQL % et _ s appliquent. La liste des privilèges possibles est la suivante : DROITS ALTER DELETE INDEX INSERT SELECT UPDATE CREATE DROP GRANT REFERENCES CREATE TEMPORARY TABLES EXECUTE FILE LOCK TABLES PROCESS RELOAD REPLICATION CLIENT REPLICATION SLAVE CONTEXTE tables tables tables tables tables tables bases de données, tables ou index bases de données ou tables bases de données ou tables bases de données ou tables administration du serveur administration du serveur accès aux fichiers du serveur administration du serveur administration du serveur administration du serveur administration du serveur administration du serveur - 1 -

225 SHOW DATABASES SHUTDOWN SUPER administration du serveur administration du serveur administration du serveur L ensemble de ces droits peut être saisi dans la requête GRANT. Si l on souhaite attribuer tous les privilèges à un utilisateur, au lieu de lister tous les droits il existe ALL PRIVILEGES. La requête suivante donnera les droits SELECT, INSERT et UPDATE sur toutes les tables de la base de données DRUPAL à l utilisateur drupal se connectant depuis n importe quelle adresse IP avec le mot de passe DruPal2010. GRANT SELECT, INSERT, UPDATE ON DRUPAL TO % IDENTIFIED BY DruPal Le fichier my.cnf Une connexion à un serveur MySQL peut se faire soit depuis la même machine que le serveur Apache soit depuis une machine distante. Le fichier de configuration de MySQL my.cnf permet de définir quelles adresses IP sont autorisées à se connecter au serveur MySQL. Par défaut, dans le fichier de configuration, le serveur MySQL n écoute que localhost ( ). Dans ce fichier, les lignes en commentaires sont préfixées par le caractère #. Il faut donc retirer ce caractère pour la ligne comportant la clé bind address : #bind-address = Il est donc possible ensuite de modifier l adresse IP qui aura le droit de se connecter au serveur MySQL. Cet élément de sécurité est important puisqu il permet de bien spécifier quelle machine est susceptible de se connecter au serveur MySQL. Une fois que cette modification est apportée, il ne faut pas oublier de redémarrer le serveur MySQL pour que les modifications soient prises en compte

226 Conclusion Comme la plupart des CMS actuels, Drupal intègre toute une gestion de la sécurité : que ce soit au niveau des requêtes SQL ou au niveau des formulaires, des verrous peuvent être posés, et pour certains, comme pour les formulaires, le sont déjà. Néanmoins, une bonne partie de la sécurité ne dépend pas de la plate forme. En effet, quelques bonnes pratiques et une bonne configuration du serveur SQL permettent de diminuer les risques d apparition de failles de sécurité

227 La présentation Il s agit dans cette étude de cas de développer un module permettant de gérer un ensemble de listes de courses. Ces listes doivent être affichées sous plusieurs formes : Dans une page avec de la pagination. Dans un bloc administrable mettant en valeur soit les listes du mois courant, soit les listes du mois glissant. La page d une liste doit également afficher l ensemble des produits qui y sont rattachés

228 Les spécifications techniques 1. La structure des données Les modules CCK et Views ne seront pas utilisés dans cette étude. Un type de contenu doit être créé automatiquement à l installation du module. Il s agit du type de contenu shopping_list qui contient les différents champs standard de Drupal ainsi que deux champs personnalisés : Date des courses : il s agit d un composant de type date, stocké en base de données dans une colonne de type timestamp. Ce champ correspond à la date prévisionnelle des courses. Montant maximum : il s agit d un composant de type textfield, stocké en base de données dans une colonne de type float. Ce champ correspond au montant maximum du budget. Ces champs doivent être enregistrés dans une table supplémentaire nommée shopping_list, dont la structure est définie ci dessous : Noms des colonnes nid vid shopping_date amount Descriptions Identifiant du nœud de la liste Identifiant de la révision Date de la liste Montant total du budget La table shopping_products doit également être créée pour stocker les produits d une liste et leur quantité. Cette table doit contenir les champs suivants : Noms des colonnes pid nid name quantity Description Identifiant du produit Identifiant du nœud correspondant à la liste Libellé du produit Quantité du produit dans la liste Les tables contenant les données supplémentaires ne sont pas normalisées. Leur nom ne commence pas forcément par le nom du module. Il s agit simplement d une convention. Un vocabulaire doit être aussi présent pour taguer les listes. En effet, il doit être possible de définir si une liste correspond à une fête, à de simples courses, etc. Ce vocabulaire doit porter le nom de shopping_type et doit être associé au type de contenu shopping_list. Ce vocabulaire n a pas à être créé automatiquement à l installation du module. 2. Les interfaces graphiques L administration du module doit permettre d indiquer si les utilisateurs ont l autorisation de rajouter de nouveaux produits ou bien s ils ne peuvent que choisir des produits existants. Le choix des produits doit se faire à la création de la liste de courses. Si l utilisateur peut créer de nouveaux produits, - 1 -

229 il doit disposer d une zone de saisie gérée par autocomplétion. Si le produit n existe pas dans la base, il sera créé à l enregistrement. Si l utilisateur n a pas la possibilité d en créer de nouveaux, il disposera alors d une simple liste déroulante. Les affichages graphiques sont divisés en deux parties : Un bloc permettra d afficher les listes du mois courant ou celles du mois glissant, cette donnée étant administrable dans la configuration du bloc qui sera créé par le module via le hook hook_block(). Une page permettra de lister, grâce à un système de pagination, l ensemble des listes de courses. Cette page sera créée par le module via le hook hook_menu(). Enfin, le module fournira un template particulier pour le type de contenu shopping_list, permettant notamment d afficher tous les produits associés

230 Le développement 1. La structure du module Le module est structuré à l aide des fichiers suivants : shopping_list.info : permet de configurer le module en définissant ses informations de base. shopping_list.install : permet d installer le nouveau schéma de base de données, utilisé par le module. shopping_list.module : contient tout le code du module. shopping_list.tpl.php : permet de mettre en forme une liste de courses. Dans un premier temps, un répertoire shopping_list doit être créé dans le répertoire sites/all/modules et les fichiers cidessus y être placés, même s ils ne possèdent pas encore de contenu. 2. La configuration du module À l intérieur du répertoire du module, le fichier shopping_list.info doit contenir le code suivant : name = Listes de courses description = Module permettant de gérer un ensemble de listes de courses package = Addvista version = 1.0 core = 6.x Le module possède le libellé "Listes de courses" et est placé dans le package nommé "Addvista". 3. L installation du schéma Le fichier shopping_list.install contient toutes les définitions des tables à rajouter à la plate forme à travers le hook hook_schema(). La première fonction à écrire est la fonction correspondant au hook hook_install() : function shopping_list_install() { drupal_install_schema("shopping_list"); }//shopping_list_install() Cette fonction, très simple, permet d indiquer à Drupal qu un schéma défini par le module shopping_list doit être créé. De la même façon, l utilisation du hook hook_uninstall() permet d indiquer à Drupal que le schéma du module doit être supprimé à la désinstallation du module via la fonction drupal_uninstall_schema() : function shopping_list_uninstall() { drupal_uninstall_schema("shopping_list"); }//shopping_list_uninstall() Il ne reste plus qu à définir le schéma qui doit être installé. Cela commence en implémentant le hook hook_schema(). Comme pour de nombreuses autres fonctionnalités sous Drupal, telles que le système de formulaires, les tables à créer doivent être déclarées sous forme d un tableau PHP. Celui ci, lorsqu il est renvoyé par le hook hook_schema(), est traité par Drupal et les requêtes SQL sont automatiquement générées et exécutées. Enfin, chaque case de ce tableau correspond à une table à créer. Le code de cette fonction est le suivant : - 1 -

231 function shopping_list_schema() { $schema = array(); $schema[ shopping_list ] = array( description => La table de stockage des listes de courses, fields => array( nid => array( description => "L identifiant du noeud", type => int, not null => TRUE, default => 0 ), vid => array( description => "L identifiant de la révision du noeud", type => int, not null => TRUE, default => 0 ), shopping_date => array( description => La date prévisionnelle des courses (timestamp), type => int, not null => TRUE, default => 0 ), amount => array( description => Le montant du budget pour les courses, type => float, not null => FALSE, default => 0 ) ), primary key => array( nid ), unique keys => array( vid => array( vid ) ) ); $schema[ shopping_products ] = array( description => La table des produits des listes, fields => array( pid => array( description => "L identifiant du produit", type => serial, not nul => TRUE, ), nid => array( description => "L identifiant du noeud représentant la liste", type => int, not null => TRUE, default => 0 ), name => array( description => Le nom du produit, type => varchar, length => 50, not null => TRUE, default => ), quantity => array( description => La quantité à acheter, type => int, not null => TRUE, default => 0 ) ), primary key => array( pid ) ); return $schema; }//shopping_list_schema() - 2 -

232 Le tableau $schema permet de déclarer la structure des deux tables shopping_list et shopping_products ainsi que leurs champs respectifs. Le module peut dès à présent être activé, puisqu il est désormais visible dans la liste des modules, dans le menu Administrer Construction du site Modules : Une fois le module activé, les tables apparaissent dans la base : 4. La définition des accès Pour plus de sécurité, des permissions doivent permettre de restreindre les accès aux différentes opérations. Dans un premier temps, le hook hook_perm()doit être implémenté : function shopping_list_perm() { return array( create shopping list, edit shopping list, delete shopping list, edit own shopping list, delete own shopping list ); }//shopping_list_perm() Fichier shopping_list.module fonction shopping_list_perm() Cette fonction permet de définir cinq permissions différentes : autoriser tous les utilisateurs à ajouter, éditer ou supprimer l ensemble des listes de courses, ou bien autoriser uniquement l utilisateur à éditer et supprimer ses propres listes. Il faut maintenant définir que ces actions ne doivent être réalisées que si ces permissions sont vérifiées : function shopping_list_access($op, $node, $account) { switch($op) { case create : return user_access( create shopping list, $account); case update : return user_access( edit shopping list, $account) (user_access( edit own shopping list, $account) && $account->uid == $node->uid); case delete : return user_access( delete shopping list, $account) - 3 -

233 (user_access( delete own shopping list, $account) && $account->uid == $node->uid); }//switch() }//shopping_list_access() Fichier shopping_list.module fonction shopping_list_access() 5. La création du type de contenu Le module doit créer au sein de la plate forme un nouveau type de contenu shopping_list. À tous les nœuds de ce type qui seront créés par la suite, le module devra ajouter les informations contenues dans les nouvelles tables. Pour cela, plusieurs hooks devront être utilisés dans le module : hook_node_info() : permet de déclarer le type. hook_form() : permet de rajouter la saisie d informations supplémentaires sur le formulaire d édition d un nœud. a. La définition du type Le hook hook_node_info() permet de déclarer le type de contenu : function shopping_list_node_info() { return array( shopping_list => array( name => t( Liste de courses ), module => shopping_list, description => t( Permet de créer un ensemble de listes de courses contenant des produits ) ) ); }//shopping_list_node_info() Fichier shopping_list.module fonction shopping_list_node_info() La fonction déclare ici plusieurs informations concernant le type : Le nom machine : correspond à la clé shopping_list du tableau. Le libellé du nouveau type : correspond à la clé name. Le nom du module qui l a créé : correspond à la clé module. Une description fournissant une aide à la saisie : correspond à la clé description. b. La saisie des champs Une fois le type de contenu créé, il est nécessaire de permettre la saisie des nouveaux champs non prévus par Drupal. Cette saisie s effectue par la création d un formulaire. Pour le moment, seuls les champs associés directement à la liste (ceux de la table shopping_list) seront saisis : Il s agit d utiliser le hook hook_form() : function shopping_list_form(&$node) { $type = node_get_types( type, $node); // Champs standard : $form[ title ] = array( #type => textfield, #title => check_plain($type->title_label), - 4 -

234 #default_value => $node->title, #required => TRUE, ); $form[ body ] = array( #type => textarea, #title => check_plain($type->body_label), #default_value => $node->body, #rows => 20, #required => TRUE, ); $form[ filter ] = filter_form($node->format); // Champs personnalisés : if($node->shopping_date) $date = date( d/m/y, $node->shopping_date); else $date = date( d/m/y, time()); $date = explode("/", $date); $form[ shopping_date ] = array( #type => date, #title => t( Date des courses ), #default_value => array( year => (int)$date[2], month => (int)$date[1], day => (int)$date[0]), #description => t( Choisissez la date de ces courses ), ); $form[ shopping_amount ] = array( #type => textfield, #title => t( Montant prévisionnel ), #default_value => $node->shopping_amount, #description => t( Saisissez le montant prévisionnel de vos courses ) ); return $form; }//shopping_list_form() Fichier shopping_list.module fonction shopping_list_form() Par défaut, un type de contenu ne possède pas de titre ni de corps. Il est donc nécessaire de rajouter ces informations au formulaire. c. La validation de la saisie Les informations saisies dans le formulaire ci dessus peuvent, et dans certains cas doivent, être validées. Cette validation peut se faire via le hook hook_validate() : function shopping_list_validate($node, &$form) { // Validation de la saisie du montant : if(!is_numeric($node->shopping_amount)) { form_set_error("amount_error", t( Le montant saisi doit être numérique. )); }//if() }//shopping_list_validate() Fichier shopping_list.module fonction shopping_list_validate() L exemple ci dessus permet de vérifier si le montant saisi est bien de type numérique. d. L ajout, la modification et la suppression d un contenu Il est possible d effectuer un ensemble d opérations à l insertion, à la modification ainsi qu à la suppression d un nœud de la base, en implémentant respectivement les hooks hook_insert(), hook_update() et hook_delete() : - 5 -

235 function shopping_list_insert($node) { $timestamp = mktime(0, 0, 0, $node->shopping_date[ month ], $node->shopping_date[ day ], $node->shopping_date[ year ]); db_query("insert INTO {shopping_list} (nid, vid, shopping_date, amount) VALUES (%d, %d, %d, %f)", $node->nid, $node->vid, $timestamp, $node->shopping_amount); }//shopping_list_insert() Fichier shopping_list.module fonction shopping_list_insert() function shopping_list_update($node) { $timestamp = mktime(0, 0, 0, $node->shopping_date[ month ], $node->shopping_date[ day ], $node->shopping_date[ year ]); db_query("update {shopping_list} SET shopping_date = %d, amount = %d WHERE nid = %d AND vid = %d", $timestamp, $node->shopping_amount, $node->nid, $node->vid); }//shopping_list_update() Fichier shopping_list.module fonction shopping_list_update() function shopping_list_delete($node) { db_query("delete FROM {shopping_list} WHERE nid = %d AND vid = %d", $node->nid, $node->vid); }//shopping_list_delete() Fichier shopping_list.module fonction shopping_list_delete() e. Le chargement des données et leur affichage Une chose essentielle à laquelle il faut absolument penser est de charger les données dans le nœud. Sans cela, il n est pas possible d utiliser ces informations via la variable correspondant au nœud. Ce chargement est réalisé par le hook hook_load() : function shopping_list_load($node) { $data = db_fetch_object(db_query("select nid, vid, shopping_date, amount as shopping_amount FROM {shopping_list} WHERE nid = %d AND vid = %d", $node->nid, $node->vid)); return $data; }//shopping_list_load() Fichier shopping_list.module fonction shopping_list_load() Les données rajoutées par cette fonction dans le nœud ne sont pas seulement destinées à l affichage du contenu dans les listes ou en pleine page, mais aussi à l affichage du formulaire d édition ou plus généralement partout où ce nœud sera chargé. Enfin, il ne reste plus qu à indiquer que ces nouvelles données doivent être rendues lors de l affichage du nœud. En effet, Drupal n affiche par défaut que le contenu (l attribut content) et n intègre pas automatiquement au contenu tous les champs de l objet $node. Le hook hook_view() permet de gérer cet affichage : function shopping_list_view($node, $teaser = FALSE, $page = FALSE) - 6 -

236 { // Préparation des informations standard du contenu : $node = node_prepare($node, $teaser); // Ajout au contenu des informations : $node->content[ shopping_date ] = array( #value => theme( shopping_list_date, $node->shopping_date), #weight => 1 ); $node->content[ shopping_amount ] = array( #value => theme( shopping_list_amount, $node->shopping_amount), #weight => 1 ); // Renvoi du noeud : return $node; }//shopping_list_view() Fichier shopping_list.module fonction shopping_list_view() Au moment de l ajout des données au contenu, des appels à des fonctions de thème sont réalisés. Ces fonctions sont référencées dans le hook hook_theme() : function shopping_list_theme() { return array( shopping_list_date => array( arguments => array( shopping_date => NULL) ), shopping_list_amount => array( arguments => array( shopping_amount => NULL) ) ); }//shopping_list_theme() Fichier shopping_list.module fonction shopping_list_theme() Les deux fonctions sont présentées ci dessous. La fonction theme_shopping_list_date() permet de mettre en forme la date des courses, et la fonction theme_shopping_list_amount() permet de mettre en forme le montant : function theme_shopping_list_date($shopping_date) { $content = <div class="shopping-list"> ; $content.= t( Les courses sont prévues le %date, array( %date => date( d/m/y, $shopping_date))); $content.= </div> ; return $content; }//theme_shopping_list_date() Fichier shopping_list.module fonction theme_shopping_list_date() function theme_shopping_list_amount($shopping_amount) { $content = <div class="shopping-list"> ; $content.= t( Le budget prévu pour les courses est de %montant, array( %montant => $shopping_amount)); $content.= </div> ; return $content; }//theme_shopping_list_amount() Fichier shopping_list.module fonction theme-shopping_list_amount() f. Les tests Il s agit, avant d aller plus loin, de tester ce qui a précédemment été développé pour s assurer que les prochains développements s appuient sur des bases solides. Après l activation du module, le nouveau type de contenu apparaît dans la page Administrer Gestion du contenu Types de contenu : - 7 -

237 Il n y a pas de bouton Supprimer sur la ligne correspondant au nouveau type de contenu Liste de courses. Cela s explique par le fait que le type de contenu a été créé par le module et non par un utilisateur. À la création d un nœud, les nouvelles saisies apparaissent dans le formulaire de création d un nœud : Une fois le nœud enregistré, le contenu s affiche, avec les informations ajoutées par le module : - 8 -

238 6. La saisie des produits Il s agit ici de modifier la partie précédente pour y rajouter la saisie des produits de la liste. Sans cette fonctionnalité, le module n aurait pas grand intérêt. Dans cette première version, l utilisateur peut ajouter de nouveaux produits (aucun droit d accès ne sera vérifié quant à cette création), cela pour faciliter l intégration du code dans la version ci dessus. a. La saisie des nouveaux champs Tout d abord, il est nécessaire de modifier le formulaire des nœuds pour ajouter cette partie de gestion des produits. La fonction shopping_list_form() est à modifier en ajoutant le code suivant :... // Gestion des produits : $form[ shopping_products ][ products_bloc ] = array( #type => fieldset, #title => Produits ); $form[ shopping_products ][ products_bloc ][ products ][0] [ product_name_0 ] = array( #type => textfield, #title => t( Nom ), #description => t( Saisissez le nom du produit ), #default_value => ($node->products[0])? $node->products[0]- >name : ); $form[ shopping_products ][ products_bloc ][ products ][0] [ product_quantity_0 ] = array( #type => textfield, #title => t( Quantité ), #description => t( Saisissez la quantité du produit à acheter ), #default_value => ($node->products[0])? $node->products[0]- >quantity :, #size => 4, #maxlength => 4 ); next($node->products); foreach($node->products as $key => $product) { $form[ shopping_products ][ products_bloc ][ products ][$key] [ product_name_.$key] = array( #type => textfield, #title => t( Nom ), #description => t( Saisissez le nom du produit ), - 9 -

239 #default_value => ($node->products[$key])? $node- >products[$key]->name : ); $form[ shopping_products ][ products_bloc ][ products ][$key] [ product_quantity_.$key] = array( #type => textfield, #title => t( Quantité ), #description => t( Saisissez la quantité du produit à acheter ), #default_value => ($node->products[$key])? $node->products[$key]->quantity :, #size => 4, #maxlength => 4 ); }//foreach() $form[ shopping_products ][ products_bloc ] [ wrapper-products ] = array( #value => <div id="wrapper-products"></div>, ); $form[ shopping_products ][ products_bloc ] [ add_new_button ] = array( #type => submit, #value => t( Nouveau produit ), #ahah => array( path => shopping_list/.$node->nid. /js/product/add, wrapper => wrapper-products, method => append, effect => fade ), ); return $form; }//shopping_list_form() Fichier shopping_list.module fonction shopping_list_form() Dans le formulaire, deux zones de saisie sont rajoutées par produit pour saisir respectivement : le nom du produit, la quantité à acheter. Un bouton Nouveau produit est également présent pour rajouter au formulaire un lot de deux nouvelles zones de saisie. Enfin, un bloc nommé wrapper-products est un bloc spécialisé pour afficher ces nouvelles zones de saisie. Le bouton Nouveau produit permet de rajouter ces nouvelles zones grâce à la technologie ahah. Au clic, le navigateur appellera en effet le menu shopping_list/[nid]/js/product/add exécutant une fonction nommée shopping_list_js_product_add(). Ce menu est à rajouter dans le hook hook_menu() : function shopping_list_menu() { $items = array(); $items[ shopping_list/%/js/product/add ] = array ( page callback => shopping_list_js_product_add, type => MENU_CALLBACK, access callback => shopping_list_access_js, access arguments => array(1) ); return $items; }//shopping_list_menu() Fichier shopping_list.module fonction shopping_list_menu() Ce hook vérifie si l utilisateur possède bien les droits d accès correspondants, en spécifiant une fonction d accès

240 spécifique au module : function shopping_list_access_js($nid) { global $user; $node = node_load($nid); return shopping_list_access( update, $node, $user); }//shopping_list_access_js() Fichier shopping_list.module fonction shopping_list_access_js() La fonction réalisant la modification du formulaire correspond au code ci dessous : function shopping_list_js_product_add() { // Fabrication des champs : $name = array( #type => textfield, #title => t( Nom ), #description => t( Saisissez le nom du produit ), ); $quantity = array( #type => textfield, #title => t( Quantité ), #description => t( Saisissez la quantité du produit à acheter ), #size => 4, #maxlength => 4 ); // Récupération de l ID unique du formulaire $form_build_id = $_POST[ form_build_id ]; // On fabrique un faux form_state $form_state = array( submitted => FALSE); // Récupération du formulaire à partir du cache $form = form_get_cache($form_build_id, $form_state); // Calcul du nombre de produits : $nb_products = count($form[ shopping_products ][ products_bloc ][ products ]); // On ajoute notre élément dynamique dans le formulaire (en fait, on remplace l ancien...) $form[ shopping_products ][ products_bloc ][ products ][$nb_produc ts][ product_name_.$nb_products] = $name; $form[ shopping_products ][ products_bloc ][ products ][$nb_produc ts][ product_quantity_.$nb_products] = $quantity; // Sauvegarde du formulaire dans le cache form_set_cache($form_build_id, $form, $form_state); // Reconstruction du formulaire $form = form_builder($_post[ form_id ], $form, $form_state); // Récupération des données reconstruites $name = $form[ shopping_products ][ products_bloc ][ products ] [$nb_products][ product_name_.$nb_products]; $quantity = $form[ shopping_products ][ products_bloc ][ products ] [$nb_products][ product_quantity_.$nb_products]; // Transformation de l élément en HTML $output = drupal_render($name); $output.= drupal_render($quantity); // On renvoie au client le formulaire sous sa forme HTML, convertie en Javascript print drupal_to_js(array( data => $output, status => true));

241 exit(); }//shopping_list_js_product_add() Fichier shopping_list.module fonction shopping_list_js_product_add() Cette fonction un peu spéciale passe par plusieurs étapes. En effet, pour chaque formulaire, Drupal applique une politique de sécurité particulière : il vérifie si les types des données du formulaire correspondent bien aux types générés au moment de la création du formulaire. En clair, si les champs du formulaire sont différents des champs d origine, Drupal refusera de les traiter. Il faut donc tout d abord récupérer le formulaire situé dans le cache. Effectivement, Drupal place en cache beaucoup d informations, dont les formulaires. Cela permet de les afficher plus rapidement. Ce formulaire peut être récupéré via un identifiant particulier nommé form_build_id. Ensuite, les nouveaux champs peuvent être rajoutés comme pour un formulaire classique. Une fois modifié, il est nécessaire de reconstruire le formulaire via la fonction form_builder(). Enfin, les composants peuvent être renvoyés au format JavaScript. b. L enregistrement des valeurs Les données supplémentaires doivent être prises en compte au moment de la création d une liste et au moment de sa modification. Il est nécessaire de modifier les hooks hook_insert() et hook_update(). Il s agit du même code :... // Gestion des produits : $form_state = array( submitted => FALSE); // Suppression des produits : db_query("delete FROM {shopping_products} WHERE nid = %d", $node->nid); // Récupération du formulaire à partir du cache $form = form_get_cache($node->form_build_id, $form_state); foreach($form[ shopping_products ][ products_bloc ][ products ] as $product) { // Récupération du nom et de la quantité : $keys = array_keys($product); $name = $node->$keys[0]; $quantity = $node->$keys[1]; if(!empty($name)) db_query("insert INTO {shopping_products} (nid, name, quantity) VALUES(%d, %s, %f)", $node->nid, $name, $quantity); }//foreach() }//shopping_list_insert() Fichier shopping_list.module fonctions shopping_list_insert() et shopping_list_update() Cet algorithme permet de supprimer les produits précédents, récupérer le formulaire associé au nœud puis le nom des champs correspondant aux noms et aux quantités des produits. Enfin, ces données sont insérées dans la table shopping_products. c. L affichage des informations Les produits doivent être chargés dans le nœud pour que ces informations puissent être utilisables. Le hook hook_load() doit donc être modifié : function shopping_list_load($node) { // Données de la liste : $data = db_fetch_object(db_query("select nid, vid, shopping_date, amount as shopping_amount FROM {shopping_list}

242 WHERE nid = %d AND vid = %d", $node->nid, $node->vid)); // Données des produits : $products_query = db_query("select pid, nid, name, quantity FROM {shopping_products} WHERE nid = %d", $node->nid); while($product = db_fetch_object($products_query)) { $data->products[] = $product; }//while() return $data; }//shopping_list_load() Fichier shopping_list.module fonction shopping_list_load() Les produits sont rajoutés dans le nœud sous forme de tableau. Enfin, ces données doivent être affichées. Le hook hook_view() doit être également modifié :... // Ajout des produits : if($node->products) { $node->content[ shopping_products ] = array( #value => theme( shopping_list_products, $node- >products), #weight => 1 ); }//if() // Renvoi du noeud : return $node; }//shopping_list_view() Fichier shopping_list.module fonction shopping_list_view() Cette fonction d ajout de produits fait appel à une nouvelle fonction de thème. Cette dernière doit être référencée puis écrite : function shopping_list_theme() { return array( shopping_list_date => array( arguments => array( shopping_date => NULL) ), shopping_list_amount => array( arguments => array( shopping_amount => NULL) ), shopping_list_products => array( arguments => array( shopping_products => NULL) ) ); }//shopping_list_theme() Fichier shopping_list.module fonction shoppping_list_theme() function theme_shopping_list_products($shopping_products) { $content = <div class="shopping-list"> ; $content.= <div class="title">produits :</div> ; foreach($shopping_products as $product) { $content.= <div class="product">.$product->name. (Qte :. $product->quantity. )</div> ; }//foreach() $content.= </div> ; return $content; }//theme_shopping_list_amount() Fichier shopping_list.module fonction theme_shopping_list_amount() d. Les tests

243 Au cours de la création ou de la modification d une liste, Drupal permet de saisir les produits : Au clic sur le bouton Nouveau produit, deux nouvelles zones s affichent : Une fois enregistré, le nœud affiche toutes les données concernant les produits :

244 7. Le paramétrage du module Avant de rajouter une gestion des produits, il est nécessaire de permettre aux administrateurs de configurer le module. Cette page de configuration sera accessible dans la rubrique Administrer Gestion du contenu Configuration des listes de courses. Un nouveau menu doit être ajouté dans le module :... $items[ admin/content/shopping_list_admin ] = array( title => Administration des listes de courses, description => "Permet de configurer la règle de gestion des produits", page callback => drupal_get_form, page arguments => array( shopping_list_admin ), access arguments => array( access administration pages ), type => MENU_NORMAL_ITEM, ); return $items; }//shopping_list_menu() Fichier shopping_list.module fonction shopping_list_menu() Ce menu fait appel à la fonction shopping_list_admin() qui permet de générer le formulaire : function shopping_list_admin() { $form = array(); $form[ #submit ] = array( shopping_list_admin_submit ); $form[ product_management_type ] = array( #type => select, #title => t( Type de gestion des produits ), #description => t( Choisissez le type de gestion des produits des listes de course ), #required => TRUE, #options => array( 0 => Autoriser l\ ajout de produit, 1 => Interdire l\ ajout de produit ), #default_value => variable_get("shopping_list_product_management_type", 0) ); return system_settings_form($form); }//shopping_list_admin()

245 Fichier shopping_list.module fonction shopping_list_admin() Lors de la validation du formulaire, la valeur sélectionnée est enregistrée sous forme de variable Drupal : function shopping_list_admin_submit($form, &$form_state) { // Enregistrement de la valeur : variable_set("shopping_list_product_management_type", $form_state[ values ][ product_management_type ]); }//shopping_list_admin_submit() Fichier shopping_list.module fonction shopping_list_admin_submit() Il faut maintenant vider le cache de Drupal afin de rendre la page disponible : 8. La gestion des produits Maintenant que le module peut être configuré, le formulaire de création et de modification d un nœud doit être également modifié pour remplacer la zone de saisie par : une zone de saisie autocomplétée si les utilisateurs sont autorisés à créer des produits. une liste déroulante si ce n est pas le cas. Ceci se fait très simplement, il suffit de remplacer la génération de la zone de saisie suivante dans la fonction shopping_list_form() : $form[ shopping_products ][ products_bloc ][ products ][0] [ product_name_0 ] = array( #type => textfield, #title => t( Nom ), #description => t( Saisissez le nom du produit ), #default_value => ($node->products[0])? $node->products[0]- >name : ); Fichier shopping_list.module Ancien code de la fonction shopping_list_form() Par le code suivant : if(variable_get( shopping_list_product_management_type, 0)) { $form[ shopping_products ][ products_bloc ][ products ][0] [ product_name_0 ] = array( #type => select, #title => t( Nom ), #description => t( Choisissez le nom du produit ),

246 #options => shopping_list_get_products(), #default_value => ($node->products[0])? $node- >products[0]->name : ); }//if() else { $form[ shopping_products ][ products_bloc ][ products ][0] [ product_name_0 ] = array( #type => textfield, #title => t( Nom ), #description => t( Saisissez le nom du produit ), #autocomplete_path => shopping_list/js/product/list/, #default_value => ($node->products[0])? $node- >products[0]->name : ); }//else() Fichier shopping_list.module Nouveau code de la fonction shopping_list_form() Ce remplacement est à faire sur toutes les zones de saisie du nom des produits et à adapter en fonction. Ce remplacement est à faire pour tous les composants du formulaire correspondant aux zones de saisie des noms des produits. De cette façon, l autocomplétion sera active sur l ensemble de ces zones. Le code ci dessus commence par vérifier la configuration du module (si l utilisateur est autorisé ou non à créer des produits), puis remplace le composant en fonction de ses droits d accès. Pour créer une zone de saisie autocomplétée, il suffit de spécifier l attribut #auto_complete en précisant un menu particulier. Ici, il s agit du menu shopping_list/js/product/list déclaré dans le hook hook_menu() :... $items[ shopping_list/js/product/list/% ] = array ( page callback => shopping_list_js_product_list, page arguments => array(4), type => MENU_CALLBACK, access callback => shopping_list_access_js, access arguments => array(1) ); return $items; }//shopping_list_menu() Fichier shopping_list.module fonction shopping_list_menu() Ce menu fait appel à la fonction shopping_list_js_product_list() prenant en paramètre la saisie de l utilisateur (argument d indice 4 dans le menu) et qui permet de renvoyer la liste des produits (les dix premiers). La fonction est la suivante : function shopping_list_js_product_list($search = ){ $matches = array(); if ($search) { $products_query = db_query_range("select nid, name FROM {shopping_products} WHERE LOWER(name) LIKE LOWER( %s% )", $search, 0, 10); while ($product = db_fetch_object($products_query)) $matches[$product->name] = $product->name; }//if() // Retour des données au format Javascript : print drupal_to_js($matches); exit(0); }//shopping_list_js_product_list() Fichier shopping_list.module fonction shopping_list_js_product_list() Enfin, dans le cas où l utilisateur n est pas autorisé à ajouter de nouveaux produits, il dispose d une liste déroulante dont les valeurs sont définies par la fonction shopping_list_get_products() : function shopping_list_get_products() { $matches = array(); $products_query = db_query("select name FROM {shopping_products}

247 GROUP BY name "); while ($product = db_fetch_object($products_query)) $matches[$product->name] = $product->name; return $matches; }//shopping_list_get_products() Fichier shopping_list.module fonction shopping_list_get_products() Une fois ces éléments mis en place dans le module, le formulaire de création ou de modification d un nœud s affiche tel que présenté ci dessous si l utilisateur est autorisé à ajouter des produits : Ou bien, le formulaire s affiche de la façon suivante si l utilisateur n en a pas le droit : 9. La création du bloc Le fichier shopping_list.module doit contenir le hook hook_block() pour créer la liste mensuelle ou glissante des listes

248 de courses. Le code de cette fonction est le suivant : function shopping_list_block($op = list, $delta = 0, $edit = array()) { switch($op) { case list : $blocks[0][ info ] = t( Listes de courses ); return $blocks; break; case configure : if($delta == 0) { $form = array(); $form[ type_list ] = array( #type => radios, #title => t( Type des listes ), #description => t( Choisissez le type d\ affichage des listes.<br/>calendaire : il s\ agit des listes du mois en cours<br/>glissant : il s\ agit des listes du mois glissant (depuis 1 mois) ), #options => array( 0 => t( Calendaire ), 1 => t( Glissant ) ), #default_value => 0 ); return $form; }//if() break; case save : if($delta == 0) variable_set("shopping_list_block_type_list", $edit[ type_list ]); break; case view : if($delta == 0) { $block = array( subject => t( Listes de courses ), content => shopping_list_block_content() ); return $block; }//if() break; }//switch() }//shopping_list_block() Fichier shopping_list.module fonction shopping_list_block() Le bloc gère quatre opérations différentes : La déclaration du bloc pour le delta de valeur 0 dans le cas list. La configuration du bloc dans le cas configure. Le formulaire qui y est créé permet d afficher deux boutons radios. L enregistrement de la valeur sélectionnée par l utilisateur dans le cas save. La génération du contenu du bloc grâce à la fonction shopping_list_block_content() dans le cas view. Cette fonction permet d afficher les listes de courses correspondant au mois calendaire ou bien au mois glissant : function shopping_list_block_content() { if(variable_get("shopping_list_block_type_list", 0)) {

249 $shopping_list_query = db_query("select * FROM {shopping_list} WHERE shopping_date >= UNIX_TIMESTAMP(DATE_ADD(FROM_UNIXTIME(%d), INTERVAL -1 MONTH))", time()); $nodes = ; while($shopping_list = db_fetch_object($shopping_list_query)) { $node = node_load($shopping_list->nid); $nodes.= <div>.l($node->title. (. count($node- >products). produits), $node->nid). </div> ; }//while() }//if() else { $first_day_of_month = mktime(0, 0, 0, date( m, time()), 1, date( Y, time())); $shopping_list_query = db_query("select * FROM {shopping_list} WHERE shopping_date >= %d", $first_day_of_month); $nodes = ; while($shopping_list = db_fetch_object($shopping_list_query)) { $node = node_load($shopping_list->nid); $nodes.= <div>.l($node->title. (. count($node- >products). produits), $node->nid). </div> ; }//while() }//else() return $nodes; }//shopping_list_block_content() Fichier shopping_list.module fonction shopping_list_block_content() Le premier cas gère le mois glissant. La requête récupère directement les listes dont la date des courses est prévue après le jour correspondant au jour courant moins un mois. Les opérations sur les dates sont effectuées directement via les requêtes MySQL. Le second cas gère le mois calendaire. La requête récupère les listes dont la date des courses est prévue après le premier jour du mois courant. Les opérations sur les dates sont réalisées via des fonctions PHP. Le résultat qui en découle est passé à la requête SQL. Le bloc possède donc une configuration propre. Pour y accéder, il suffit de se rendre sur la page des blocs dans Administrer Construction du site Blocs puis de cliquer sur le bouton configurer du bloc nommé Listes de courses. Le type d affichage peut être sélectionné par l utilisateur :

250 Dans les deux cas, le bloc affiche les données de la même façon. Seul le contenu diffère : 10. La création de la page des listes Il s agit enfin de créer une page permettant de lister l ensemble des listes de courses. Étant donné le grand nombre potentiel de listes, cette page devra être paginée. Tout d abord, un nouveau menu doit être rajouté pour permettre l accès à la page :... $items[ shopping_list ] = array( title => Listes des courses, description => "Permet de lister l ensemble des listes de courses", page callback => shopping_list_page, access arguments => TRUE, type => MENU_NORMAL_ITEM, ); return $items; }//shopping_list_menu() Fichier shopping_list.module fonction shopping_list_menu() Cette page est accessible via l URL shopping_list et fait appel à la fonction shopping_list_page(). Cette fonction a pour but de récupérer les données et de les afficher : function shopping_list_page() { $limit = 2; $content = ; $shopping_list_query = pager_query("select * FROM

251 {shopping_list}", $limit); while($shopping_list = db_fetch_object($shopping_list_query)) { $content.= theme( shopping_list, node_load($shopping_list- >nid)); }//while() $content.= theme( pager, NULL, $limit); return $content; }//shopping_list_page() Fichier shopping_list.module fonction shopping_list_page() Ici, le nombre de listes affichées est limité à deux, mais on pourrait imaginer une zone de configuration permettant d administrer cette valeur. Deux choses intéressantes sont présentées ici. Tout d abord, l utilisation de la fonction pager_query() permet de récupérer des données en fonction d éléments de pagination. Ces éléments sont automatiquement gérés par la fonction elle même. En clair, en fonction de paramètres présents sur la requête, la fonction pager_query() récupère une partie des données. La deuxième chose essentielle est la barre de pagination elle même, permettant d afficher le nombre de pages et de passer de l une à l autre. Cela est réalisé grâce à un appel au thème pager. Le simple fait d ajouter dans le contenu une barre de pagination, permet, si un pager_query est utilisé, de paginer des données. Il n y a pas besoin de lier cette barre avec les données elles mêmes. Cela étant, il est possible de spécifier ce lien via des arguments. Ce paramétrage est nécessaire lorsqu il y a plusieurs listes paginées au sein de la même page. Pour mettre en forme les données, un nouveau thème nommé simplement shopping_list doit être rajouté à la fonction shopping_list_theme() du module :... shopping_list => array( template => shopping_list, arguments => array( shopping_list => NULL) ) ); }//shopping_list_theme() Fichier shopping_list.module fonction shopping_list_theme() Cette fois ci, un fichier de template est spécifié grâce à la clé template dans la configuration du thème. Cela signifie que c est un fichier, ici nommé shopping_list.tpl.php, qui sera utilisé pour la mise en forme des éléments. Il disposera d une variable nommée shopping_list qui correspond en réalité à l intégralité du nœud représentant la liste. Il est important de rappeler que les fichiers de template sont spécifiés dans la configuration du thème sans leur extension (ici : template => shopping_list ). Le contenu du fichier pourrait se présenter de la façon suivante : <div class="shopping-list"> <div class="title"> <?php print l($shopping_list->title, node/.$shopping_list->nid)?> </div> <div class="amount"> <?php print t( Amount : %amount, array( %amount => $shopping_list- >shopping_amount))?> </div> <div class="amount"> <?php print t( Date : %date, array( %date => date( d/m/y, $shopping_list- >shopping_date)))?> </div> </div> Contenu du fichier shopping_list.tpl.php

252 La page s affiche alors de cette façon : Un clic sur le bouton suivant > permet d obtenir la suite des listes :

253 Conclusion Cette étude de cas a permis de montrer l application des différents concepts présentés dans les chapitres précédents : création d un module, utilisation de fichiers de template spécifiques, etc. De nombreux hooks ont été utilisés pour parvenir à la réalisation du module : création de type de contenu, ajout d éléments de formulaire, traitement via Ajax, etc. Le module qui a été développé dans cette partie est un cas typique de réponse à un besoin spécifique d un client. La plupart des opérations courantes sur les modules y sont présentes et ce module peut être utilisé comme modèle de développement pour d autres. Beaucoup de points peuvent être améliorés, notamment en réalisant une partie d administration plus étoffée. La modélisation aurait pu faire en sorte également que chacun des produits soit stocké dans une table spécifique de la base pour éviter les doublons d information. Ce chapitre conclut la partie de codage des modules. Le prochain recense quelques astuces de configuration de démarrage d un site Drupal ainsi que quelques réponses à certains problèmes récurrents

254 Configurer un site Drupal en 10 minutes Il ne s agit pas ici de décrire le processus d installation de la plate forme, cela étant déjà expliqué dans le chapitre Introduction au CMS Drupal, mais plus de montrer la configuration de certains éléments nécessaires au bon fonctionnement du site, et l installation de modules incontournables qui n ont pas pu être détaillés dans les parties précédentes de ce livre ainsi que quelques autres astuces. 1. Les modules à installer Tout d abord, pour réaliser un site polyvalent, il est nécessaire de télécharger et d installer les modules de la liste suivante : CCK : permet d étendre les types de contenu. Pour plus d information à ce sujet, cf. chapitre Étendre Drupal Les modules additionnels. FileField : permet de rajouter un champ de type Fichier aux types de contenu. ImageField : permet de rajouter un champ de type Image aux types de contenu. ImageAPI : permet de réaliser des traitements sur les images. ImageCache : permet de créer des profils de traitement des images. Pour plus d information sur ce sujet, cf. chapitre Étendre Drupal Les modules additionnels. Views : permet de créer des pages et des blocs de contenus. Pour plus d information sur ce sujet, cf. chapitre Étendre Drupal Les modules additionnels. Block Class : permet de définir des classes CSS sur des blocs. Administration Menu : permet de rajouter une barre de menu déroulant dédiée aux administrateurs. CKEditor : permet de rajouter une barre d outils pour l ensemble des zones de saisie du site. IMCE : permet de greffer un module de gestion de fichiers pour les barres d outils de type CKEditor. PathAuto : permet de générer automatiquement un chemin d accès pour un contenu. Token : permet d utiliser des mots clés dans la plupart des modules (PathAuto, Views, etc.). Date : permet d ajouter de nombreux outils concernant le traitement des dates. SimpleNews : permet d intégrer un outil de newsletters au site. GoogleAnalytics : permet d intégrer un support de statistiques via l outil GoogleAnalytics. Webform : permet de générer des formulaires complexes. Ces modules sont ceux qu il faut installer au minimum sur un site pour pouvoir de façon simple et rapide ajouter les fonctionnalités standard répondant aux besoins classiques d un projet. D autres peuvent être installés par la suite en fonction des demandes spécifiques émises par le client : mise en place d une carte GoogleMaps pour localiser géographiquement un élément, lecture de musique en ligne, site marchand ou encore gestion multiblogs sont les fonctionnalités qu il est possible de rencontrer. Par exemple pour des sites qui réalisent de la vente en ligne, il existe plusieurs modules différents permettant de rajouter les fonctionnalités classiques d un site marchand, à savoir la gestion des produits, des catégories de produits, du paiement en ligne, des réductions, de la TVA, etc. Il existe notamment un module nommé Ubercart, très souple dans l intégration des modules et suffisamment stable pour être utilisé en production

255 2. La configuration du site Pour faciliter la saisie des informations (des contenus) sur le site, il est nécessaire de paramétrer correctement la plate forme. En effet, une bonne configuration de base évite de modifier un paramètre à chaque saisie d un contenu, ce qui correspond à un gain de temps non négligeable sur le long terme. Toutefois, il ne s agit pas seulement de la saisie des informations mais bien de certains points de paramétrage qu il ne faut pas oublier de modifier lors de la mise en production. a. Les informations du site Il s agit des informations les plus basiques, mais qui passent souvent à la trappe. En effet, les informations de base sont utilisées partout par la plate forme : à l envoi des mails, sur le site lui même, etc. Le nom du site et l adresse e mail sont des informations qui bien souvent sont mises à l écart lors du développement du site, mais qu il ne faut pas oublier de correctement initialiser lors de la mise en production : Une information importante est également présente sur cette page, il s agit du chemin d accès à la page d accueil. Ce chemin peut correspondre soit au chemin standard d un nœud (du type node/[nid]), soit à un chemin réécrit (du type content/le titre du nœud), soit à un menu spécifique à un module ou à une vue : b. Le format d entrée C est un point plus pratique qu autre chose mais qui peut s avérer problématique s il n est pas bien configuré

256 En effet, bien souvent, les utilisateurs sont autorisés à insérer des caractères HTML dans les contenus pour y placer des liens, des images, ou d autres objets complexes tels que des objets Flash. Il existe par défaut deux formats d entrées pour les contenus : Filtered HTML : la saisie est restreinte à certaines entités HTML. Full HTML : l utilisateur peut saisir l ensemble des entités HTML. Lorsqu un contenu est créé, comme par exemple un nouvel article, c est le format d entrée de la plate forme qui est défini par défaut dans le formulaire. Ainsi, si le format considéré est Filtered HTML, alors la mise en forme de l utilisateur (gras, italique, souligné, etc.), réalisée souvent avec un outil du type CKEditor, ne sera pas prise en compte. En clair, dans la majorité des sites, il est nécessaire de définir le format d entrée par défaut à Full HTML. Pour définir le format d entrée par défaut de la plate forme, il suffit d aller sur la page Administrer Configuration du site Formats d entrée puis de sélectionner le bouton radio correspondant : c. Le module Menu d administration Le module Administration Menu apporte une barre de menu située en haut de la fenêtre qui permet un accès plus rapide aux pages d administration. Le problème de ce module est que, par défaut, cette barre reste en haut de la page et non en haut de l écran. Conclusion : si l utilisateur fait défiler la page vers le bas, elle disparaît. Il est possible de modifier son comportement en faisant en sorte que cette barre soit toujours affichée. Pour cela, il suffit d aller sur la page Administrer Configuration du site Menu d administration puis de cocher la case Garder le menu en haut de page : - 3 -

257 d. Le rôle Webmaster Il est important de livrer un site sans donner tous les droits d administration à la personne qui sera chargée de s en occuper, et cela pour plusieurs raisons : le gestionnaire du site ne connaît pas forcément tous les aspects et toutes les notions de la plate forme, il ne possède pas forcément de compétences en informatique, etc. Il est plus confortable de créer un rôle dédié à la gestion générale du site, souvent nommé webmaster, qui possédera des droits d administration plus larges que les autres groupes d utilisateurs. Pour ajouter un rôle à la plate forme, il suffit de se rendre sur la page Administrer Gestion des utilisateurs Rôles, puis de renseigner le nom du groupe : Ce rôle doit posséder des droits d accès particuliers, sans pour autant lui donner tous les pouvoirs, à l image des droits d accès sur les contenus : - 4 -

258 Dans l exemple ci dessus, le webmaster peut accéder aux contenus et gérer les nœuds, mais n est pas autorisé à administrer les types de contenu. e. Les droits d accès Il est important de bien définir les droits d accès, tout du moins sur les deux rôles par défaut que sont les utilisateurs anonymes et les utilisateurs identifiés. Ces droits d accès peuvent être modifiés au cours du projet, en fonction des besoins changeants du client, mais ne varient finalement que très peu. f. Les alias d URL Le module PathAuto apporte une organisation des nœuds sous forme d arborescence d URL. Il permet de définir un chemin particulier pour les types de contenu et pour les termes, en utilisant des mots clés particuliers correspondant par exemple au titre d un nœud ou à l identifiant d un terme. Avant de commencer la création de contenu au sein du système, il est important de correctement définir cette arborescence de chemins qui permet d organiser les contenus du site. Une modification à postériori de cette architecture peut causer des problèmes d accès à ces contenus. Par exemple, pour la mise en place d une plate forme multiblogs, on pourrait se retrouver avec l arborescence suivante : La racine, modélisée par le caractère /, possède ici deux branches : Une branche pour la gestion des articles. Toutes les pages de cette branche ont des URL commençant par /articles. Une branche pour la gestion des blogs. Toutes les pages de cette partie ont des URL commençant par /blogs

259 Par exemple, la page correspondant au chemin /blogs pourrait être la page d accueil de l ensemble des blogs. À l intérieur de la branche /blogs se trouve un ensemble de chemins correspondant au blog de chaque utilisateur, dont les URL sont de la forme /blogs/[username], et où [username] est l identifiant de l utilisateur. Pour chacun de ces blogs, on dispose de deux parties : Les catégories, définies par l URL /blogs/[username]/categories. Chaque catégorie possède alors le chemin /blogs/[username]/categories/[categoryname] où [categoryname] correspond au nom de la catégorie. Les archives, définies par l URL /blogs/[username]/archives. Chaque archive est ici organisée selon son mois et son année de publication. Son URL est par conséquent de la forme /blogs/[username]/archives/[year] [month] où [year] correspond à une année et [month] correspond à un mois. Au bout de chaque branche se trouvent des feuilles, correspondant à des billets de blog qui possèdent au final l URL de la branche dans laquelle ils se trouvent, suivies d un élément pouvant les identifier de façon unique, tel que son identifiant (le nid du nœud) ou son titre. Les catégories sont souvent représentées par des termes sous Drupal. g. Le système de fichiers La page Administrer Configuration du site Système de fichiers permet de paramétrer les informations concernant l enregistrement des fichiers transférés par les utilisateurs comme par exemple leur répertoire de stockage. L aspect intéressant ici est le paramétrage du répertoire temporaire. Ce répertoire est utilisé pour stocker temporairement les fichiers uploadés avant qu ils soient déplacés dans leur répertoire définitif. Au cours du développement il n est pas rare d écraser sa base locale par la base d intégration afin de récupérer des données saisies sur le site d intégration ou pour récupérer des éléments de paramétrage réalisés par d autres membres de l équipe. Dans ce cas, il faut penser à modifier le chemin vers le répertoire temporaire qui n est probablement pas le même en local qu en intégration (il n est logiquement pas obligatoire de modifier le répertoire de stockage). Drupal permet également, par mesure de sécurité, de placer les fichiers dans un répertoire différent de celui du site. En effet, les fichiers étant accessibles via le protocole HTTP (nécessaire pour que les fichiers soient disponibles), n importe qui a la possibilité de télécharger ces fichiers, sans restriction aucune, s il en connaît le chemin. Drupal propose de placer les fichiers dans un répertoire du serveur autre que le répertoire du site. De cette façon, aucun utilisateur ne pourra accéder directement aux fichiers, mais c est Drupal qui aura pour mission de les fournir aux postes clients. Cette configuration s effectue via le formulaire de la page : - 6 -

260 h. Les paramètres de recherche Les paramètres de recherche sont accessibles sur la page Administrer Configuration du site Paramètres de recherche. Ces paramètres sont importants car ils conditionnent l indexation du contenu du site. Il est possible par exemple de définir le nombre de contenus à indexer à chaque exécution du cron, la pertinence des mots clés, etc. Cette page permet d indiquer également le taux d indexation de ces contenus : i. Le transfert de fichiers Il ne faut oublier de paramétrer les informations concernant les transferts de fichiers. Ces informations sont, par exemple, la taille des images, le poids maximum d un fichier ou encore le poids total qu un utilisateur peut transférer sur le site. Cette configuration est disponible sur la page Administrer Configuration du site Transferts de fichiers : - 7 -

261 j. Les paramètres utilisateurs Il est important également de paramétrer la façon dont les utilisateurs peuvent créer leur compte : doit il y avoir une validation de la part d un administrateur? L adresse e mail doit elle être confirmée? Ces informations sont configurables sur la page Administrer Gestion des utilisateurs Paramètres des utilisateurs : Cette page permet également de modifier les textes des mails qui sont envoyés aux utilisateurs lors de certaines étapes, telles que la création d un compte, sa validation, la demande de mot de passe, etc. k. Le paramétrage du thème - 8 -

262 Il s agit d une chose à laquelle on ne pense pas forcément, mais paramétrer le thème permet d éviter des surprises graphiques et autres problèmes d affichage. Il est notamment important de choisir un logo et un favicon. l. Le formulaire de contact Activer le module Contact ne suffit pas pour l afficher et permettre l envoi de mail. Il est en effet nécessaire de le configurer pour spécifier par exemple une réponse automatique envoyée à l utilisateur, pour gérer des catégories, etc. Si le module est activé, la page de configuration Administrer Construction du site Formulaire de contact permet de le configurer : L onglet Ajouter une catégorie permet de créer une nouvelle catégorie. La catégorie permet de filtrer les messages de contact : - 9-

263 Ainsi, le formulaire de contact propose notamment une liste déroulante à travers laquelle l utilisateur peut choisir le sujet de son message :

264 m. Le module CKEditor Le CKEditor est un outil permettant de mettre en forme du contenu. L utilisateur ne dispose plus d une simple zone de saisie multiligne, mais d une zone possédant une barre d outils, à l image des logiciels de traitement de texte, destinée à mettre en forme le contenu saisi. L installation du module CKEditor à lui seul ne suffit pas. Ce module n est en effet qu une passerelle entre la plateforme Drupal et l outil lui même et il reste nécessaire de télécharger le CKEditor à l adresse suivante : L outil est à copier dans le répertoire sites/all/libraries. Si ce dossier n existe pas, il faut le créer. Une fois le module et l outil correctement installés, il faut définir les droits d accès sur le module : Une fois les droits d accès établis, il reste à configurer les profils. À l instar du module de gestion d images ImageCache, CKEditor utilise deux profils par défaut qui s appliquent à certains rôles qu il est nécessaire de spécifier. Ces profils correspondent à un regroupement de paramètres définissant le comportement de la barre d outils. Il est par exemple possible de définir qu une barre simplifiée apparaît pour les utilisateurs anonymes et qu une barre beaucoup plus fournie en termes d options apparaît pour les utilisateurs connectés. Cette page de configuration est disponible dans le menu Administrer Configuration du site CKEditor :

265 Au sein de Drupal, toutes les zones de saisie n ont pas pour vocation de stocker du texte mis en forme. C est le cas par exemple des zones permettant de définir les URL des pages des blocs. Dans ces cas là, il est nécessaire de spécifier que la barre d outils ne doit pas s afficher sur ces zones. Pour réaliser cette opération, il suffit de cliquer sur le bouton modifier de la ligne Profil global CKEditor et la zone Paramètres globaux : Dans la page, la zone Paramètres de visibilité permet d inclure ou d exclure une zone de saisie dans la gestion du CKEditor : Les données contenues dans la zone de saisie Champs à inclure/exclure correspondent à des identifiants de zones (attributs id des balises HTML). Pour faire en sorte qu une zone ne soit pas gérée par le CKEditor, il suffit de trouver son identifiant (généralement, le CKEditor le spécifie sous la zone concernée) et de le copier à la fin. n. Le fichier.htaccess Drupal est fourni avec un fichier nommé.htaccess permettant de définir des règles d accès au site destinées au serveur Web. Il comprend notamment toutes les règles de réécriture d URL. La partie importante de ce fichier correspond à l extrait ci dessous :.. # VirtualDocumentRoot and the rewrite rules are not working properly

266 # For example if your site is at uncomment and # modify the following line: RewriteBase /drupal_livre # # If your site is running in a VirtualDocumentRoot at # # uncomment the following line: # RewriteBase / # Rewrite URL of the form x to the form index.php?q=x. RewriteCond %{REQUEST_FILENAME}!-f RewriteCond %{REQUEST_FILENAME}!-d RewriteCond %{REQUEST_URI}!=/favicon.ico RewriteRule ^(.*)$ index.php?q=$1 [L,QSA] </IfModule> La ligne RewriteBase doit spécifier le répertoire de base du site. En développement, il correspond au nom du répertoire du site (drupal_livre dans l exemple ci dessus). En production, il correspond au caractère / à cause du nom de domaine (la ligne avec ce caractère est commentée juste en dessous de la première). o. Le fichier settings.php Le fichier settings.php correspond au fichier de configuration du site. Il contient notamment la chaîne de connexion à la base de données, les informations de session, etc. Ce fichier ne subit pas de grosses modifications, voire aucune, au cours du projet. Si un référentiel SVN est mis en place pour le développement, le fichier settings.php ne doit pas être placé sous contrôle de version. 3. La configuration du serveur Drupal prend en compte l ensemble des modules activés au moment du rendu d une page, et à cause de cela, le temps de chargement peut être long. C est pour cela que Drupal propose un certain nombre de fonctionnalités de mise en cache des données (mise en cache des pages, des CSS, etc.) pour accélérer le processus de navigation sur le site. D autres éléments de configuration, au niveau du serveur cette fois ci, peuvent être également réglés pour améliorer la rapidité d exécution des scripts, du traitement des images, etc. Trois parties entrent en jeu dans cette phase de paramétrage : Le serveur Web : il est évident que le serveur Web joue un rôle majeur dans la vitesse de réaction du site. PHP : c est en effet PHP qui réalise tous les traitements au sein du site. Le serveur de base de données : la base est effectivement très sollicitée à chaque chargement de page ou accès à une ressource. Il ne s agit pas dans cette partie de décrire en détail tous les éléments de configuration de ces tiers (bien souvent, le site Drupal est présent sur un serveur physique hébergeant d autres sites qui nécessitent une configuration particulière), mais bien de décrire les aspects les plus importants de cette configuration. a. Le serveur Web : Apache C est souvent le serveur Web Apache qui est utilisé pour exécuter des sites utilisant la technologie PHP, bien que d autres serveurs tels que Microsoft IIS et NGinx permettent de le faire. Apache est donc aujourd hui le serveur Web de référence. Son objectif de serveur Web est d accepter des connexions clients et de servir des ressources (pages HTML, images, etc.). Pour augmenter ses performances, il donc recommandé de paramétrer au moins les directives suivantes au sein du fichier de configuration, souvent nommé httpd.conf : MaxClients : cette directive permet de définir le nombre de requêtes simultanées qu Apache est capable de traiter. Les connexions restent en attente jusqu à ce qu une requête se libère

267 Le nombre de connexions ne peut pas dépasser la valeur définie par la directive ServerLimit (par défaut 256). ServerLimit : cette directive permet de définir la valeur maximum paramétrable pour la directive MaxClients. Attention toutefois, si cette valeur est trop importante le serveur peut devenir instable. La valeur par défaut de cette directive est 256. Il n y a pas de valeur courante car elle dépend de la taille du site et de son trafic. KeepAlive : cette directive permet de définir si plusieurs requêtes peuvent partager la même connexion TCP. Cela permet par exemple de récupérer toutes les données d une page (textes, images, etc.) au lieu de créer une connexion pour chacune de ces ressources. KeepAliveTimeout : cette directive permet de définir le temps d attente pour la prochaine requête dans le cas où la directive KeepAlive est à On. Une valeur moyenne de deux à cinq secondes est recommandée, une valeur trop grande entrainerait une lenteur des processus enfants. b. PHP PHP est un programme annexe qui permet de traiter du code spécifique contenu dans les pages HTML. Ce programme possède plusieurs plugins permettant de s adapter aux différents serveurs Web du marché tels que Microsoft IIS ou encore Apache. Si le serveur Web est présent pour fournir les pages HTML aux postes clients, PHP est là pour traduire du code spécifique inclus dans ces pages et le transformer en code HTML. C est donc lui qui effectue tous les traitements (algorithmes, accès à la base de données, etc.). Ces traitements peuvent être améliorés en modifiant les paramètres de PHP dans son fichier de configuration, souvent nommé php.ini. Les paramètres les plus importants sont listés ci dessous : max_execution_time : permet de définir le temps maximum d exécution en secondes de chacun des scripts. La valeur de cette directive doit être augmentée dans le cas de scripts d importation avec rapatriement de fichier ZIP via un FTP externe par exemple, ou encore dans le cas du parcours d un fichier CSV pour un traitement spécifique. max_input_time : permet de définir le temps maximum d exécution en secondes du traitement des données de la requête par les scripts. memory_limit : permet de définir la quantité de mémoire maximum qu un script peut consommer. En général, une quantité de 96 Mo est requise au minimum pour réaliser des traitements sur les images (par exemple, pour que le module ImageCache soit optimisé), mais il est courant de configurer une quantité mémoire de 128 à 256 Mo. SMTP : permet de définir l adresse SMTP qui est utilisée pour l envoi des mails. Sous Windows, il est nécessaire de spécifier cette adresse ainsi que le port (via la directive smtp_port qui par défaut est réglée sur la valeur 25). Sous un système Linux, cette directive n est pas requise dans la mesure où un outil permettant ces envois est généralement présent sur la machine. sendmail_path : permet de définir le chemin d accès à l outil d envoi de mails sous les systèmes Linux. file_uploads : permet d autoriser (valeur On) ou non (valeur Off) le transfert de fichiers sur le serveur. upload_max_filesize : permet de définir le poids maximum des fichiers à transférer sur le serveur. post_max_size : permet de définir la quantité totale en Mo des données de formulaire. Il faut que cette quantité soit suffisamment élevée pour transmettre de gros fichiers. En clair, cette information doit forcément être supérieure à la valeur de la directive upload_max_filesize. extension : sous Windows, le fichier php.ini possède un ensemble de lignes correspondant aux extensions. Ces lignes, si elles ne sont pas commentées (si elles ne commencent pas par un caractère ;) permettent d activer les extensions. Sous les systèmes Linux, ces lignes ne sont pas présentes. Pour installer une extension, il faut : soit passer par le système d installation de logiciels (comme apt ou emerge),

268 soit effectuer une recompilation de PHP en spécifiant les modules à activer. c. Le serveur de bases de données : MySQL MySQL est l un des serveurs de bases de données les plus courants sur les sites Internet et c est notamment celui qui est le plus couramment utilisé sur les sites Drupal. À l instar du serveur Web et de PHP, il nécessite quelques éléments de configuration au moment du déploiement du site Web, à travers quelques directives qu il est possible de retrouver dans son fichier de configuration dont le nom diffère suivant le système d exploitation (my.ini sous Windows, my.cnf sous les systèmes Linux) : key_buffer_size : cette directive permet de définir la taille mémoire utilisée pour la mise en cache des index. Cette valeur peut être augmentée en faisant toutefois attention à ce qu elle ne dépasse pas 50% de la mémoire totale, sinon, le serveur commencera à écrire dans le fichier d échange, sur le disque (aussi appelé SWAP). max_allowed_packet : cette directive permet de définir la taille maximum des paquets gérés par MySQL. Cela peut être très utile, voire nécessaire lors de l exécution de grosses requêtes, notamment celles sur des colonnes de type blob. read_buffer_size : cette directive permet de spécifier la taille mémoire pour l exécution des requêtes de lecture

269 Subversion Subversion, aussi appelé SVN, est un outil dédié à la gestion des versions pour les projets informatiques. Il est très utile et fortement conseillé lors du développement d un projet car il permet aux différents membres de l équipe de travailler sur les mêmes fichiers en même temps et en réduisant les collisions. 1. Le répertoire de dépôt ou repository Le principe est simple : les fichiers sont stockés sur un serveur spécifiquement dédié à la gestion des versions. On appelle le répertoire stockant ces fichiers un répertoire de dépôt ou repository. Ce répertoire stocke non seulement la version courante mais aussi toutes les versions précédentes, ce qui permet en cas de problème sur un fichier de revenir à une version antérieure. L architecture générale est la suivante : 2. L environnement de développement et de production Chaque développeur doit posséder sur son poste les fichiers du site. Si ce n est pas le cas, il doit rapatrier l ensemble du site sur son poste (on appelle cette opération un checkout). Lorsqu il a fait une modification importante, il peut livrer ses fichiers sur le repository (on appelle aussi cela un commit). Lorsqu il souhaite récupérer les modifications réalisées par ses collègues, il peut faire une mise à jour (on appelle cela un update). Il est possible qu une collision se produise au moment où le développeur réalise une mise à jour (on appelle aussi cela un conflit) : en effet, il suffit que quelqu un d autre ait modifié la même ligne du fichier pour que le système de version détecte un conflit. Généralement, en cas de conflit, des outils graphiques spécifiquement développés pour SVN permettent d afficher les deux versions en conflit et laissent la possibilité au développeur de choisir les lignes ou différences qui doivent être retenues dans la nouvelle version. Sur le serveur de production, le principe est de ne jamais transférer un fichier directement, mais de toujours passer par le système SVN. De cette façon, il est toujours possible de revenir à une version antérieure en cas de livraison défectueuse. Sur la plate forme Drupal, tous les fichiers n ont pas besoin d être versionnés (comprendre placés sur le repository) car certains fichiers ne sont pas censés être modifiés, par exemple les fichiers du moteur. Au contraire, certains répertoires doivent absolument être gérés par le système de version, comme par exemple le répertoire sites qui contient l ensemble des modules et des thèmes. Malgré tout, le répertoire sites/default/files ainsi que le fichier sites/default/settings.php ne doivent pas l être puisqu ils sont spécifiques à l environnement de - 1 -

270 production

271 La FAQ des experts Les points ci dessous recensent les erreurs courantes rencontrées lors du développement d un site ou de sa mise en production. Les réponses apportées comportent le plus souvent des cas à vérifier. Le site n accède pas à la base de données. Cette erreur est peut être due à l un des points suivants : Le serveur de base de données est hors ligne. Le fichier settings.php n existe pas. En effet, dans le cas d une mise en production et d une utilisation de l outil Subversion, il est tout à fait probable que ce fichier n ait pas été placé sur le référentiel SVN auquel cas, lors du checkout, le fichier settings.php n a pas été mis en place. Il est alors nécessaire de recopier le fichier default.settings.php en le renommant comme il se doit et de reconfigurer la ligne correspondant à l accès à la base. Le fichier settings.php n est pas correctement paramétré. Il se peut en effet que les privilèges d accès à la base aient changé pour une raison ou une autre. Il n est possible d accéder qu à la page d accueil. Il est tout à fait probable, surtout avec l utilisation de Subversion, que le fichier.htaccess présent à la racine n ait pas été placé sur le référentiel SVN, auquel cas Drupal ne sait pas comment les URL doivent être réécrites. Cela expliquerait pourquoi la page d accueil s afficherait mais pas les autres. Il est possible également que le fichier.htaccess soit présent mais soit configuré pour fonctionner avec un sousrépertoire et pas avec un nom de domaine. Dans ce cas, il suffit de modifier la ligne RewriteBase. Les profils du module ImageCache ne génèrent pas de vignettes. Pour que les traitements sur les images puissent être réalisés, il faut que le ou les répertoires qui doivent stocker les images finales possèdent les droits nécessaires en écriture. Ces répertoires n ont pas forcément les mêmes droits d accès que les autres répertoires du site. Il faut donc vérifier les droits d accès des répertoires impliqués dans la génération de vignettes. Dans une vue, les blocs ne prennent pas en compte les arguments. Effectivement, il s agit d une limite du module Views. Si cette possibilité est fonctionnelle pour le type d affichage Page, il n est pas possible de passer des arguments à un bloc. En effet, Views n est pas capable de savoir si les arguments passés correspondent à des paramètres sur l URL ou des paramètres spécifiques passés au bloc lui même. Il existe une astuce permettant de contourner le problème. Il s agit d utiliser du code PHP au sein de la vue pour indiquer qu un paramètre de l URL doit être considéré comme un argument de la vue. En effet, lors de l ajout d un argument dans une vue, il est possible de spécifier du code PHP : - 1 -

272 Ce code PHP permet de retourner la valeur d un paramètre de la requête. Cette valeur doit être cohérente avec le type de l argument : l uid d un utilisateur, le nid ou le titre d un nœud, ou encore le tid d un terme. Un des menus d un module récemment créé n est pas accessible. Il s agit probablement d un problème de rafraîchissement du cache. Il faut faire très attention lors de l écriture d un module et notamment du hook hook_menu(). Ce hook n est vu par Drupal qu au rafraîchissement du cache et par conséquent, si le cache n a pas été rechargé, le menu n est pas accessible. Un fichier de template récemment créé n est pas pris en compte. De la même façon que pour les nouveaux menus, il est nécessaire lors de la création du nouveau fichier de template, que le cache de Drupal soit vidé. En effet, c est au moment du rafraîchissement du cache que Drupal recense tous les fichiers de mise en forme. Les déclinaisons des fichiers de template de page et de nœud ne sont pas prises en compte dans le thème et le cache a pourtant bien été vidé. Il est possible de créer dans les thèmes des fichiers de template déclinant un ensemble de page ou de nœud. Par exemple, le fichier node story.tpl.php ne sera utilisé que pour les nœuds de type story, ou encore le fichier pagefront.tpl.php ne sera utilisé que pour la page d accueil. Ces fichiers ne sont traités par Drupal que si les fichiers de référence, à savoir ici les fichiers node.tpl.php et page.tpl.php, se trouvent dans le thème. Pour corriger le problème, il suffit de copier ces fichiers, disponibles par ailleurs respectivement dans les répertoires modules/node et modules/system, au sein du thème concerné. Un module activé n est plus disponible dans la page des modules. Cela est très rare mais reste un problème qu il est possible de rencontrer. L origine du problème est très obscure, mais il semble que le module se désactive de lui même et n apparaisse plus dans la liste des modules pour être réactivé. Dans ce cas, il est nécessaire de se rendre directement dans la base de données et plus précisément dans la table system, et de rechercher la ligne correspondant au module concerné. Si le problème est bien celui ci, sur cette ligne, la colonne status devrait être à 0 alors que la valeur doit être à 1 pour les modules actifs. Passer cette valeur à 1 devrait résoudre le problème. L un des hooks d un module n a pas accès à toutes les données (de formulaire ou de nœud par exemple). Ce problème arrive plus souvent qu on ne le pense. En effet, il ne faut pas perdre de vue que les modules sont ordonnancés : ils s exécutent selon un ordre particulier. Les modules systèmes sont censés s exécuter en premier alors - 2 -

273 que les modules supplémentaires, en particulier les modules que nous avons développés, sont censés s exécuter en dernier. On peut dès lors imaginer qu un module communautaire téléchargé et installé sur le site ajoute des informations au sein des nœuds. Tout module qui voudra alors utiliser ces informations devra s exécuter après celui ci. Sans cela, les modules n auront pas accès à toutes les informations que les modules précédents pourraient ajouter au système. Si le numéro d ordre des modules doit être modifié pour une raison ou une autre, il est nécessaire de se rendre dans la base de données, plus précisément dans la table system, puis de trouver les lignes correspondant aux modules concernés et enfin de modifier la valeur de la colonne weight. En effet, c est cette colonne qui permet d ordonnancer l exécution des modules. Lors de la mise en production du site, les images insérées dans les contenus ne s affichent pas. C est un cas qu il est possible de rencontrer lorsque le site d intégration n est pas utilisé via un nom de domaine. Par exemple, si le chemin du site est du type tous les contenus qui posséderont des images posséderont également des liens vers celles ci qui seront du type /le_site_de_test/sites/default/files/ Or, lors du passage en production et avec l utilisation d un nom de domaine, le site est accessible avec une URL du type et donc les images ne sont plus trouvées (le sous répertoire initial reste indiqué dans leur URL alors qu il n est plus utilisé). C est une chose tout à fait normale et à laquelle il faut penser dès le début : avant même l intégration des contenus, il est nécessaire qu un nom de domaine, même un sous domaine, pointe vers le site. En clair, au lieu d une URL du type il faut préférer une URL du type La barre d outils de l éditeur de texte ne s affiche pas correctement. Drupal utilise une version de JQuery en version 1.2. Cette version est pleinement compatible avec la barre d outils CKEditor ou FCKEditor. Bien souvent, pour rajouter des fonctionnalités graphiques au site, notamment des systèmes de diaporama ou de zoom, il est nécessaire soit d ajouter de nouveaux plugins JQuery à la plate forme, soit d insérer sur certaines pages une version plus récente de la bibliothèque Ajax. Il est dans ce cas possible que les codes JavaScript entrent en conflit et provoquent un dysfonctionnement de la barre d outils. La barre d outils de l éditeur de texte ne permet pas le transfert de nouvelles images. Il s agit d un problème de configuration de l éditeur. Pour corriger le problème, il suffit de se rendre sur la page Administrer Configuration du site CKEditor puis de cliquer sur le bouton modifier du profil concerné. Enfin, il existe une zone Paramètres de l explorateur de fichiers qui permet de configurer les transferts de fichiers via le CKEditor : - 3 -

274 La barre d outils de l éditeur de texte, au moment du transfert d un fichier, réaffiche le site dans la pop up. Il s agit d un problème de droits d accès au moment du transfert de fichier via le CKEditor, voire de droits d accès au module IMCE si celui ci est installé. À l upload d un fichier, Drupal indique que sa taille dépasse la taille autorisée, alors que la taille maximum autorisée est bien supérieure dans l administration du site. Bien qu il soit possible de spécifier sur la page Administrer Configuration du site Transferts de fichiers la taille maximum des fichiers, le site n en reste pas moins dépendant de la configuration de PHP. Il faut donc, dans ce cas, vérifier la configuration de PHP. Lors de la mise en production, aucun fichier ne peut être transféré et les profils du module ImageCache ne génèrent pas de vignettes. Lors de la mise en production du site (passage des fichiers et de la base sur le serveur de production), il faut bien penser à modifier certains paramètres, notamment le répertoire temporaire défini sur la page Administrer Configuration du site Système de fichier. Si l environnement d intégration était sur un poste Windows et plus particulièrement sur un environnement WAMP, le répertoire temporaire était probablement réglé sur la chaîne c:\wamp\tmp. Si le serveur de production correspond à un système Linux, il faut sûrement changer cette valeur en /tmp. Les blocs d un module ne sont pas visibles dans la liste des blocs du thème actif malgré un rechargement du cache. Cela peut arriver si la région dans laquelle le bloc doit s afficher (définie par la clé region dans le hook hook_block()) n est pas disponible dans le thème courant et que le bloc est activé par défaut (la valeur correspondant à la clé status est égale à 1). Il faut dans ce cas se rendre dans la base de données et modifier la région des blocs concernés (colonne region dans la table blocks)

Sage 100 CRM Guide de l Import Plus avec Talend Version 8. Mise à jour : 2015 version 8

Sage 100 CRM Guide de l Import Plus avec Talend Version 8. Mise à jour : 2015 version 8 Sage 100 CRM Guide de l Import Plus avec Talend Version 8 Mise à jour : 2015 version 8 Composition du progiciel Votre progiciel est composé d un boîtier de rangement comprenant : le cédérom sur lequel

Plus en détail

Joomla : un système de gestion de contenu

Joomla : un système de gestion de contenu CHAPITRE 2 Joomla : un système de gestion de contenu Si SGC est l abréviation française pour système de gestion de contenu, l abréviation CMS de l anglais Content Management System est le terme le plus

Plus en détail

Créez et administrez vos sites Web

Créez et administrez vos sites Web Joomla! 3.3 Créez et administrez vos sites Web Didier MAZIER Table des matières.. 1 Chapitre 1 : Découvrir Joomla! A. Les raisons de créer un site sous Joomla!.. 9 B. Se documenter sur Joomla! 9 C. La

Plus en détail

Introduction aux concepts d ez Publish

Introduction aux concepts d ez Publish Introduction aux concepts d ez Publish Tutoriel rédigé par Bergfrid Skaara. Traduit de l Anglais par Benjamin Lemoine Mercredi 30 Janvier 2008 Sommaire Concepts d ez Publish... 3 Système de Gestion de

Plus en détail

Manuel du rédacteur. Dernière mise à jour : le 14/04/2010

Manuel du rédacteur. Dernière mise à jour : le 14/04/2010 Manuel du rédacteur Dernière mise à jour : le 14/04/2010 Table des matières 1 PRÉSENTATION GÉNÉRALE... 3 2 L INTERFACE DE GESTION... 3 2.1 ACCÈS À L INTERFACE DE GESTION... 3 2.2 PRÉSENTATION GÉNÉRALE...

Plus en détail

PLATEFORME COLLABORATIVE &

PLATEFORME COLLABORATIVE & & PARTAGE D INFORMATIONS Cerpeg 2012 - Fabienne Mauri - Académie de Bordeaux page 1 SOMMAIRE Vue d ensemble... 3 PRÉSENTATION GÉNÉRALE... 3 LES MODULES / LES UTILISATEURS... 4 LES ACTIONS... 5 Gestion

Plus en détail

Présentation de Drupal Positionnement par rapport aux autres CMS

Présentation de Drupal Positionnement par rapport aux autres CMS Présentation de Drupal Positionnement par rapport aux autres CMS 1. Introduction & installation 2. Vocabulaire de Drupal 3. Définition de la structure [Structure] 4. Gestion des modules [Modules] 5. Gestion

Plus en détail

ADMINISTRATION DU PORTAIL AFI OPAC 2.0 V3 AFI OPAC 2.0

ADMINISTRATION DU PORTAIL AFI OPAC 2.0 V3 AFI OPAC 2.0 ADMINISTRATION DU PORTAIL AFI OPAC 2.0 V3 AFI OPAC 2.0 V3 Sommaire Sommaire... 2 Note :... 2 Quelques Notions... 3 Profil :... 3 Pages :... 5 Créer du contenu... 6 Identification de l administrateur :...

Plus en détail

WordPress : Guide à l édition

WordPress : Guide à l édition WordPress : Guide à l édition WordPress : Guide à l édition... 1 Présentation... 2 1. Accès au site... 2 2. Le tableau de bord... 2 3. Editez les contenus... 4 Quelle est la différence entre les pages

Plus en détail

Manuel d utilisation du site web de l ONRN

Manuel d utilisation du site web de l ONRN Manuel d utilisation du site web de l ONRN Introduction Le but premier de ce document est d expliquer comment contribuer sur le site ONRN. Le site ONRN est un site dont le contenu est géré par un outil

Plus en détail

Installer, configurer et personnaliser Joomla

Installer, configurer et personnaliser Joomla Installer, configurer et personnaliser Joomla Web Platform Installer 2.0 15/02/2010 Access IT Julien CHOMARAT jchomarat@access-it.fr http://www.sharepointofview.fr/julien Retrouvez cet atelier à l adresse

Plus en détail

Manuel utilisateur. Mini-site régions. Drupal est un système de gestion de contenu (abrégé CMS en anglais) libre et open source.

Manuel utilisateur. Mini-site régions. Drupal est un système de gestion de contenu (abrégé CMS en anglais) libre et open source. Manuel utilisateur Mini-site régions Version 07/2012 Drupal est un système de gestion de contenu (abrégé CMS en anglais) libre et open source. Un CMS est un logiciel qui permet de gérer le contenu d un

Plus en détail

Documentation de CMS-gen

Documentation de CMS-gen Table des matières GÉNÉRALITÉ... 1 LA ZONE D'ADMINISTRATION... 2 LOGIN SUR LA ZONE D ADMINISTRATION... 2 EDITION DU CONTENU EN LIGNE... 3 LE MODE EDITION... 3 PUBLICATION... 3 SUPPRIMER DES MODIFICATIONS...

Plus en détail

Support de cours et mode d emploi pour le CMS WordPress

Support de cours et mode d emploi pour le CMS WordPress pour le CMS WordPress Retrouvez notre le plan de formation sur http:///formation- cms- wordpress- creer- et- administrer- un- site- web.html Agence de communication la couleur du Zèbre - Mise à jour Août

Plus en détail

Créer et partager des fichiers

Créer et partager des fichiers Créer et partager des fichiers Le rôle Services de fichiers... 246 Les autorisations de fichiers NTFS... 255 Recherche de comptes d utilisateurs et d ordinateurs dans Active Directory... 262 Délégation

Plus en détail

Guide de l administrateur. Démarrage rapide. www.cmsmadesimple.fr

Guide de l administrateur. Démarrage rapide. www.cmsmadesimple.fr Guide de l administrateur Démarrage rapide www.cmsmadesimple.fr Table des matières 1.Information document...4 1.1.Licence...4 1.2.Avertissements...5 1.3.Remerciements...5 1.4.Auteurs...6 1.5.Versions...6

Plus en détail

NOTICE D UTILISATION DE L ESPACE COLLABORATIF (POUR LES COLLABORATEURS)

NOTICE D UTILISATION DE L ESPACE COLLABORATIF (POUR LES COLLABORATEURS) NOTICE D UTILISATION DE L ESPACE COLLABORATIF (POUR LES COLLABORATEURS) Qu est-ce que l espace collaboratif? L espace collaboratif est un service vous permettant à vous, vos associés et collaborateurs

Plus en détail

Sage 100 CRM - Guide de l Import Plus Version 8. Mise à jour : 2015 version 8

Sage 100 CRM - Guide de l Import Plus Version 8. Mise à jour : 2015 version 8 Sage 100 CRM - Guide de l Import Plus Version 8 Mise à jour : 2015 version 8 Composition du progiciel Votre progiciel est composé d un boîtier de rangement comprenant : le cédérom sur lequel est enregistré

Plus en détail

ContactForm et ContactFormLight - Gestionnaires de formulaire pour Prestashop Edité par ARETMIC S.A.

ContactForm et ContactFormLight - Gestionnaires de formulaire pour Prestashop Edité par ARETMIC S.A. ContactForm et ContactFormLight - Gestionnaires de formulaire pour Prestashop Edité par ARETMIC S.A. - 1 - PREAMBULE Les conditions générales d utilisation détaillant l ensemble des dispositions applicables

Plus en détail

Systèmes de Gestion de Contenu

Systèmes de Gestion de Contenu Introduction à SPIP Master 1 CAWEB Page 1/1 SPIP http://demo.spip.org/ SPIP (acronyme récursif de «Système de Publication pour l Internet Spip») est l'un des logiciels libres de gestion de contenu parmi

Plus en détail

Tutoriel Drupal «views»

Tutoriel Drupal «views» Tutoriel Drupal «views» Tutoriel pour la découverte et l utilisation du module Drupal «Views» 1 Dans ce tutoriel nous allons d abord voir comment se présente le module views sous Drupal 7 puis comment

Plus en détail

Extension Géoportail pour ez Publish

Extension Géoportail pour ez Publish Extension Géoportail pour ez Publish Aurélien FRANCES Institut Géographique National 2, Avenue Pasteur 94165 - Saint-Mande 15 décembre 2011 1 Présentation EZ Publish est un logiciel de gestion de contenu

Plus en détail

GetSimple 3. Le guide complet pour créer des sites web. GetSimple 3 - Le guide complet pour créer des sites web. GetSimple 3 26,50.

GetSimple 3. Le guide complet pour créer des sites web. GetSimple 3 - Le guide complet pour créer des sites web. GetSimple 3 26,50. Le guide complet pour créer sites web Vous verrez ensuite comment gérer les pages qui constituent la structure du site : créer les pages, les paramétrer pour la publication, les modifier, les supprimer

Plus en détail

KWISATZ_TUTO_module_magento novembre 2012 KWISATZ MODULE MAGENTO

KWISATZ_TUTO_module_magento novembre 2012 KWISATZ MODULE MAGENTO _TUTO_module_magento Table des matières -1) - :...2-1.1) Introduction :...2-1.2) Description :...3-1.2.1) Schéma :...3-1.3) Mise en place :...4-1.3.1) MAGENTO :...4-1.3.1.1) Les Web Services :...4-1.3.1.2)

Plus en détail

DRUPAL Réalisez des développements professionnels avec PHP (2ième édition)

DRUPAL Réalisez des développements professionnels avec PHP (2ième édition) Introduction 1. Les systèmes de gestion de contenu 11 2. Les avantages de Drupal 15 3. Le fonctionnement de Drupal 17 4. L'environnement de développement 20 5. L'installation de Drupal 25 6. Le passage

Plus en détail

Créez votre premier site web De la conception à la réalisation

Créez votre premier site web De la conception à la réalisation Chapitre 1 : Introduction A. Introduction 17 Chapitre 2 : Les langages A. L objectif 21 B. L HTML 21 1. L état des lieux 21 2. Les éléments HTML 21 3. Les attributs 22 4. Les caractères 23 5. Les espaces

Plus en détail

PHP 5.4 Développez un site web dynamique et interactif

PHP 5.4 Développez un site web dynamique et interactif Editions ENI PHP 5.4 Développez un site web dynamique et interactif Collection Ressources Informatiques Table des matières Table des matières 1 Chapitre 1 Introduction 1. Objectif de l'ouvrage.............................................

Plus en détail

Content Management System. bluecube. Blue Cube CMS V4.3 par Digitalcube

Content Management System. bluecube. Blue Cube CMS V4.3 par Digitalcube Content Management System bluecube V4.3 1 SOMMAIRE Avant-propos Découvrir le CMS Blue Cube Les modules Les clients BLUE CUBE CMS V4.3 par Digitalcube 2 CMS sans bugs 3 Avant-propos Facile à prendre en

Plus en détail

Site web établissement sous Drupal

Site web établissement sous Drupal Site web établissement sous Drupal Etat Date Rédacteur Version Création 12/12/2013 C. Vilport Pôle Web DASI 1.0 Modification 04/02/2014 C. Vilport Pôle Web DASI 1.1 Diffusion aux 06/02/2014 C. Vilport

Plus en détail

Cursus 2013 Déployer un Content Management System

Cursus 2013 Déployer un Content Management System Cursus 2013 Déployer un Content Management System Les critères d évaluation d un CMS Les utilisateurs, après examen de la taille de la base d utilisateurs en France. La communauté, selon son dynamisme

Plus en détail

FASTCREATHEME DOCUMENTATION TECHNIQUE MODULE DEVIS. Documentation technique. commercial@fastcreatheme.com. contact@fastcreatheme.

FASTCREATHEME DOCUMENTATION TECHNIQUE MODULE DEVIS. Documentation technique. commercial@fastcreatheme.com. contact@fastcreatheme. DOCUMENTATION TECHNIQUE MODULE DEVIS 1 PRÉSENTATION DU MODULE De la demande de prix originelle de vos clients ou visiteurs jusqu à la prise de commande, ce module intègre une fonction commerciale indispensable

Plus en détail

Comment installer wordpress. www.bxart.be wp niveau 1

Comment installer wordpress. www.bxart.be wp niveau 1 www.bxart.be wp niveau 1 Installation Introduction Wordpress est un CMS ce qui signifie : système de gestion de contenu (Content Management System). Il y a d autres CMS mais c est de loin le plus populaire.

Plus en détail

Introduction JOOMLA. Fonctionnalités. Avantages. Hainaut P. 2013 - www.coursonline.be 1. Joomla est un système de gestion de contenu CMS open source

Introduction JOOMLA. Fonctionnalités. Avantages. Hainaut P. 2013 - www.coursonline.be 1. Joomla est un système de gestion de contenu CMS open source JOOMLA Introduction Joomla est un système de gestion de contenu CMS open source Il permet la conception rapide de sites Web avec une présentation soignée et une navigation très simple C est l outil idéal

Plus en détail

TD1. Installation de Symfony 2 et Netbeans

TD1. Installation de Symfony 2 et Netbeans I - Introduction : TD1 Installation de Symfony 2 et Netbeans L objet de ce TP est d installer l environnement de travail. Nous commençons par définir des notions de base nécessaires pour comprendre la

Plus en détail

Module pour la solution e-commerce Opencart

Module pour la solution e-commerce Opencart Module pour la solution e-commerce Opencart sommaire 1. Introduction... 3 1.1. Objet du document... 3 1.2. Contenu du document... 3 1.3. Liste des documents de référence... 3 1.4. Avertissement... 3 1.5.

Plus en détail

Tutoriel Drupal version 6 :

Tutoriel Drupal version 6 : 1 Tutoriel Drupal version 6 : Installation en local sous Windows et traduction 2 1. Installation de Drupal en local (sur votre pc) 1.1. Logiciels nécessaires Drupal fonctionne dans un environnement nécessitant

Plus en détail

Manuel d utilisation de l outil collaboratif

Manuel d utilisation de l outil collaboratif Manuel d utilisation de l outil collaboratif Réf OCPD-V2 Page 1 / 24 a mis en œuvre un outil collaboratif qui permet de partager des informations entre collaborateurs. Il permet à des utilisateurs travaillant

Plus en détail

Cliquez sur l icône représentant des livres pour afficher vos classeurs où sont rangés vos documents.

Cliquez sur l icône représentant des livres pour afficher vos classeurs où sont rangés vos documents. AIDE LOGICIEL Logiciel : PROGRELIUM (à partir de la version 2.30) Objet : Classer et ouvrir vos documents Cliquez sur l icône représentant des livres pour afficher vos classeurs où sont rangés vos documents.

Plus en détail

SOMMAIRE. Comment se connecter?

SOMMAIRE. Comment se connecter? SOMMAIRE Comment se connecter? Présentation de l interface Notions sur l espace documentaire Création d un dossier Création d un document Modifier un document Copier ou déplacer des documents Exporter

Plus en détail

Le langage PHP permet donc de construire des sites web dynamiques, contrairement au langage HTML, qui donnera toujours la même page web.

Le langage PHP permet donc de construire des sites web dynamiques, contrairement au langage HTML, qui donnera toujours la même page web. Document 1 : client et serveur Les ordinateurs sur lesquels sont stockés les sites web sont appelés des serveurs. Ce sont des machines qui sont dédiées à cet effet : elles sont souvent sans écran et sans

Plus en détail

Joomla! Création et administration d'un site web - Version numérique

Joomla! Création et administration d'un site web - Version numérique Avant-propos 1. Objectifs du livre 15 1.1 Orientation 15 1.2 À qui s adresse ce livre? 16 2. Contenu de l ouvrage 17 3. Conclusion 18 Introduction 1. Un peu d histoire pour commencer... 19 1.1 Du web statique

Plus en détail

WysiUpStudio. CMS professionnel. pour la création et la maintenance évolutive de sites et applications Internet V. 6.x

WysiUpStudio. CMS professionnel. pour la création et la maintenance évolutive de sites et applications Internet V. 6.x WysiUpStudio CMS professionnel pour la création et la maintenance évolutive de sites et applications Internet V. 6.x UNE SOLUTION DE GESTION DE CONTENUS D UNE SOUPLESSE INÉGALÉE POUR CRÉER, MAINTENIR ET

Plus en détail

Manuel d utilisation du web mail Zimbra 7.1

Manuel d utilisation du web mail Zimbra 7.1 Manuel d utilisation du web mail Zimbra 7.1 Sommaire 1 CONNEXION A LA MESSAGERIE ZIMBRA... 5 1.1 Prérequis... 5 1.1.1 Ecran de connexion à la messagerie... 5 2 PRESENTATION GENERALE DE L INTERFACE ZIMBRA...

Plus en détail

Des contenus pédagogiques standardisés SCORM sur la plate-forme Cognifer

Des contenus pédagogiques standardisés SCORM sur la plate-forme Cognifer Normes et standards FOAD «L interopérabilité pédagogique» Des contenus pédagogiques standardisés SCORM sur la plate-forme Cognifer Manuel du concepteur élaboré par Mokhtar BEN HENDA 2005 Le contenu de

Plus en détail

Installer Joomla. Étape 1 : choix de la langue d installation

Installer Joomla. Étape 1 : choix de la langue d installation CHAPITRE 4 Installer Joomla L installation de Joomla se déroule en sept étapes : 1. choix de la langue d installation ; 2. vérification des prérequis ; 3. présentation de la licence publique générale GNU

Plus en détail

CFADFrancophone.org GUIDE DE JOOMLA 2.5 Dr René-Yves HERVÉ 06-05-2012

CFADFrancophone.org GUIDE DE JOOMLA 2.5 Dr René-Yves HERVÉ 06-05-2012 CFADFrancophone.org GUIDE DE JOOMLA 2.5 Dr René-Yves HERVÉ 06-05-2012 Ce guide est un résumé des principales fonctionnalités du Système de Gestion de contenus «Joomla» (CMS pour Content Management System)

Plus en détail

Saisissez le login et le mot de passe (attention aux minuscules et majuscules) qui vous ont

Saisissez le login et le mot de passe (attention aux minuscules et majuscules) qui vous ont I Open Boutique Sommaire : I Open Boutique... 1 Onglet «Saisie des Produits»... 3 Création d'une nouvelle fiche boutique :... 3 Création d'une nouvelle fiche lieux de retraits :... 10 Création d'une nouvelle

Plus en détail

Procédure pas à pas de découverte de l offre. Service Cloud Cloudwatt

Procédure pas à pas de découverte de l offre. Service Cloud Cloudwatt Procédure pas à pas de découverte de l offre Service Cloud Cloudwatt Manuel Utilisateur 03/07/2014 Cloudwatt - Reproduction et communication sont interdites sans autorisation 1/45 Contenu 1. Introduction...

Plus en détail

Manuel d utilisation du web mail Zimbra 7.1

Manuel d utilisation du web mail Zimbra 7.1 Manuel d utilisation du web mail Zimbra 7.1 ma solution de communication intelligente Sommaire 1 Connexion à la messagerie Zimbra p.4 1.1 Prérequis p.4 1.1.1 Ecran de connexion à la messagerie p.4 2 Presentation

Plus en détail

MANUEL WORDPRESS. Objectif: Refonte d un site web sous Wordpress I PRE-REQUIS: 1 / Créer un backup (sauvegarde) du site:

MANUEL WORDPRESS. Objectif: Refonte d un site web sous Wordpress I PRE-REQUIS: 1 / Créer un backup (sauvegarde) du site: MANUEL WORDPRESS Objectif: Refonte d un site web sous Wordpress I PRE-REQUIS: 1 / Créer un backup (sauvegarde) du site: A/ Traitement de la base de données: Pour cette étape, vous aurez besoin au préalable

Plus en détail

PHP/MySQL avec Dreamweaver CS4

PHP/MySQL avec Dreamweaver CS4 PHP/MySQL avec Dreamweaver CS4 Dreamweaver CS4 Jean-Marie Defrance Groupe Eyrolles, 2009, ISBN : 978-2-212-12551-1 7 Étude de cas : un site marchand Dans ce dernier chapitre, nous allons exploiter Dreamweaver

Plus en détail

Gespx (Logiciel de gestion commerciale) Version 4

Gespx (Logiciel de gestion commerciale) Version 4 Gespx (Logiciel de gestion commerciale) Version 4 Propriété & Usage Tout usage, représentation ou reproduction intégral ou partiel, fait sans le consentement d Im@gin Micro est illicite (Loi du 11 Mars

Plus en détail

Guide de démarrage Débuter avec e-monsite Les termes spécifiques à e-monsite

Guide de démarrage Débuter avec e-monsite Les termes spécifiques à e-monsite Guide de démarrage Débuter avec e-monsite... page 2 Les termes spécifiques à e-monsite... page 2 Le manager... page 2 Les modules... page 3 Les widgets... page 3 Les plugins... page 4 Ajouter du contenu...

Plus en détail

OFFRE DE SERVICE. Pôle national de compétences FOAD (Formation Ouverte et A Distance) https://foad.orion.education.fr/

OFFRE DE SERVICE. Pôle national de compétences FOAD (Formation Ouverte et A Distance) https://foad.orion.education.fr/ OFFRE DE SERVICE TRAVAIL COLLABORATIF POUR ÉCHANGER, COLLABORER ET TRAVAILLER ENSEMBLE EN RESTANT LIBRE DE SON ORGANISATION Pôle national de compétences FOAD (Formation Ouverte et A Distance) https://foad.orion.education.fr/

Plus en détail

Manuel d utilisation de la messagerie. http://zimbra.enpc.fr

Manuel d utilisation de la messagerie. http://zimbra.enpc.fr Manuel d utilisation de la messagerie http://zimbra.enpc.fr ÉCOLE DES PONTS PARISTECH/ DSI JANVIER 04 SOMMAIRE. Connexion à la messagerie.... Présentation générale de l écran d accueil.... Déconnexion...

Plus en détail

Recueil des Fiches Concepteurs : Mise en œuvre d un site SharePoint 2013 Juin 2015

Recueil des Fiches Concepteurs : Mise en œuvre d un site SharePoint 2013 Juin 2015 Recueil des s s : Mise en œuvre d un site SharePoint 2013 Juin 2015 Ce document décrit le paramétrage pour la mise en œuvre des fonctionnalités standard de Microsoft SharePoint 2013. NADAP et SharePoint

Plus en détail

Manuel utilisateur. VPtimeClock 1.6. pour VISUAL-PLANNING TM. Logiciel de pointage des temps de travail en réseau.

Manuel utilisateur. VPtimeClock 1.6. pour VISUAL-PLANNING TM. Logiciel de pointage des temps de travail en réseau. Manuel utilisateur VPtimeClock 1.6 pour VISUAL-PLANNING TM Logiciel de pointage des temps de travail en réseau 05 Décembre 2010 99 avenue Albert 1 er 92500 Rueil-Malmaison France (33) (0)1 41 39 88 31

Plus en détail

Afin d accéder à votre messagerie personnelle, vous devez vous identifier par votre adresse mail et votre mot de passe :

Afin d accéder à votre messagerie personnelle, vous devez vous identifier par votre adresse mail et votre mot de passe : 1 CONNEXION A LA MESSAGERIE ZIMBRA PAR LE WEBMAIL Ecran de connexion à la messagerie Rendez vous dans un premier temps sur la page correspondant à votre espace webmail : http://webmailn.%votrenomdedomaine%

Plus en détail

K-d'école 3.4. Guide de prise en main

K-d'école 3.4. Guide de prise en main K-d'école 3.4 Guide de prise en main Novembre 2011 8, rue Kervégan 44000 Nantes t. 02 40 20 47 95 www.kosmos.fr KOSMOS 2011 GUIDE DE PRISE EN MAIN DE K-D'ECOLE 3.4 SOMMAIRE 1. OBJECTIF DU GUIDE... 3 2.

Plus en détail

Joomla et VirtueMart

Joomla et VirtueMart Valérie Isaksen Avec la contribution de Thierry Tardif Joomla et VirtueMart Réussir sa boutique en ligne Groupe Eyrolles, 2008, ISBN : 978-2-212-12381-4 Table des matières 1. VOTRE PROJET DE BOUTIQUE EN

Plus en détail

Formation au logiciel Typo3, pour les rédacteurs.

Formation au logiciel Typo3, pour les rédacteurs. 1 Formation au logiciel Typo3, pour les rédacteurs. 1 Accéder au système 2 1.1 Configuration du navigateur 2 1.2 Identification 2 2 L interface 2 2.1 Le module Web 3 2.2 Le module Media 3 2.3 Le module

Plus en détail

NVU, Notepad++ (ou le bloc-note), MySQL, PhpMyAdmin. HTML, PHP, cas d utilisation, maquettage, programmation connaissances en HTML, PHP et SQL

NVU, Notepad++ (ou le bloc-note), MySQL, PhpMyAdmin. HTML, PHP, cas d utilisation, maquettage, programmation connaissances en HTML, PHP et SQL Prise en main de NVU et Notepad++ (conception d application web avec PHP et MySql) Propriétés Intitulé long Formation concernée Matière Présentation Description Conception de pages web dynamiques à l aide

Plus en détail

Magento. Magento. Réussir son site e-commerce. Réussir son site e-commerce BLANCHARD. Préface de Sébastien L e p e r s

Magento. Magento. Réussir son site e-commerce. Réussir son site e-commerce BLANCHARD. Préface de Sébastien L e p e r s Mickaël Mickaël BLANCHARD BLANCHARD Préface de Sébastien L e p e r s Magento Préface de Sébastien L e p e r s Magento Réussir son site e-commerce Réussir son site e-commerce Groupe Eyrolles, 2010, ISBN

Plus en détail

Manuel Utilisateur Messagerie

Manuel Utilisateur Messagerie Manuel Utilisateur Messagerie Auteur : CGI Version : 2.2 Droit d auteur Ce texte est disponible sous contrat Creative Commons Paternité - Pas d'utilisation Commerciale - Partage des Conditions Initiales

Plus en détail

Lea service Intranet établissement

Lea service Intranet établissement Lea service Intranet établissement Documentation Administrateur Présentation Le service Intranet établissement est accessible par l onglet Etablissement. Il affiche le site web de l établissement propulsé

Plus en détail

INTEGRATEUR DEVELOPPEUR

INTEGRATEUR DEVELOPPEUR www.emweb.fr INTEGRATEUR DEVELOPPEUR FORMATION ELIGIBLE AU DIF/CIF DURÉE : 700 h de formation PRE REQUIS Avoir un esprit logique Etre motivé(e)! OBJECTIF A l issue de cette formation, vous serez capable

Plus en détail

À la découverte de jquery Mobile

À la découverte de jquery Mobile 1 À la découverte de jquery Mobile jquery Mobile est un ensemble de plug-ins et de widgets de jquery visant à déployer une API multiplates-formes capable de développer des applications Web mobiles. Au

Plus en détail

DATAEXCHANGER DEX VERSION X

DATAEXCHANGER DEX VERSION X GUIDE D INSTALLATION DATAEXCHANGER DEX VERSION X SOMMAIRE Sommaire...- 2-1 PRE-REQUIS...- 4-1.1 Cohabitation avec d anciennes versions DEX...- 4-1.2 Matériel...- 4-1.3 Logiciel...- 4-1.4 Base de données...-

Plus en détail

WordPress : simple et élégant

WordPress : simple et élégant WORDPRESS WordPress : simple et élégant Libre Respectueux des standards Ergonomique Rapide à installer WordPress est un système de gestion de contenu (CMS) qui permet de créer et gérer facilement l ensemble

Plus en détail

OCLOUD BACKUP GUIDE DE REFERENCE POUR WINDOWS

OCLOUD BACKUP GUIDE DE REFERENCE POUR WINDOWS OCLOUD BACKUP GUIDE DE REFERENCE POUR WINDOWS http://ocloud.pripla.com/ Copyright 2014 Private Planet Ltd. Certaines applications ne sont pas disponibles dans tous les pays. La disponibilité des applications

Plus en détail

Développer de nouvelles fonctionnalités

Développer de nouvelles fonctionnalités 19 Développer de nouvelles fonctionnalités Chaque site e-commerce est unique. Bien que Magento soit une application riche, des besoins spécifiques apparaîtront et l ajout de modules deviendra nécessaire.

Plus en détail

Guide de l administrateur de rubriques du site communal d ORCHAISE

Guide de l administrateur de rubriques du site communal d ORCHAISE Guide de l administrateur de rubriques du site communal d ORCHAISE Sommaire Comment est organisé le site?... 1 Comment accéder à l interface privée?... 2 Comment se connecter?... 2 Comment modifier son

Plus en détail

Premières applications. Web 2.0. avec Ajax et PHP. J e a n - M a r i e D e f r a n c e. Groupe Eyrolles, 2008, ISBN : 978-2-212-12090-5

Premières applications. Web 2.0. avec Ajax et PHP. J e a n - M a r i e D e f r a n c e. Groupe Eyrolles, 2008, ISBN : 978-2-212-12090-5 Premières applications Web 2.0 avec Ajax et PHP J e a n - M a r i e D e f r a n c e Groupe Eyrolles, 2008, ISBN : 978-2-212-12090-5 8 Applications Ajax-PHP synchrones Pour commencer simplement, je vous

Plus en détail

Gestion du parc informatique matériel et logiciel de l Ensicaen. Rapport de projet. Spécialité Informatique 2 e année. SAKHI Taoufik SIFAOUI Mohammed

Gestion du parc informatique matériel et logiciel de l Ensicaen. Rapport de projet. Spécialité Informatique 2 e année. SAKHI Taoufik SIFAOUI Mohammed 6, bd maréchal Juin F-14050 Caen cedex 4 Spécialité Informatique 2 e année Rapport de projet Gestion du parc informatique matériel et logiciel de l Ensicaen SAKHI Taoufik SIFAOUI Mohammed Suivi ENSICAEN

Plus en détail

KWISATZ MODULE PRESTASHOP

KWISATZ MODULE PRESTASHOP Table des matières -1) KWISATZ - :...2-1.1) Introduction :...2-1.2) Description :...3-1.2.1) Schéma :...3-1.3) Mise en place :...4-1.3.1) PRESTASHOP :...4-1.3.1.1) Les Web Services :...4-1.3.2) KWISATZ

Plus en détail

BTS SIO. Services Informatiques aux Organisations. Session 2013-2014

BTS SIO. Services Informatiques aux Organisations. Session 2013-2014 BTS SIO Services Informatiques aux Organisations Session 2013-2014 Option : SISR Activités professionnelle N 3 NATURE DE L'ACTIVITE : Contexte : Actuellement American Dental Product n a aucune solution

Plus en détail

Symfony 2. 1.Définition de symfony 2. 2.Installation. 3.Structure. 4.Symfony et les commandes

Symfony 2. 1.Définition de symfony 2. 2.Installation. 3.Structure. 4.Symfony et les commandes Symfony 2 Sommaire : 1.Définition de symfony 2 2.Installation 3.Structure 4.Symfony et les commandes 5.Le fonctionnement : le routeur (les url), les bundles, twig(templates) 6.L architecture de symfony2

Plus en détail

Module pour la solution e-commerce Magento

Module pour la solution e-commerce Magento Module pour la solution e-commerce Magento sommaire 1. Introduction... 3 1.1. Objet du document... 3 1.2. Liste des documents de référence... 3 1.3. Avertissement... 3 1.4. Contacts... 3 1.5. Historique

Plus en détail

Publication sur serveur distant

Publication sur serveur distant DOCUMENTATION Publication sur serveur distant Jahia s next-generation, open source CMS stems from a widely acknowledged vision of enterprise application convergence web, document, search, social and portal

Plus en détail

Backoffice Drupal Formation Administrateurs

Backoffice Drupal Formation Administrateurs Backoffice Drupal Formation Administrateurs Agence Tévolys Dijon 12, Rue Maxime Guillot 21300 Chenove Tél : 03 80 60 83 83 Agence Tévolys Paris 253 Rue Saint Honoré 75001 Paris Tél : 01 44 55 09 84 Plan

Plus en détail

SchoolPoint Manuel utilisateur

SchoolPoint Manuel utilisateur SchoolPoint Manuel utilisateur SchoolPoint - manuel d utilisation 1 Table des matières Présentation de SchoolPoint... 3 Accès au serveur...3 Interface de travail...4 Profil... 4 Echange de news... 4 SkyDrive...

Plus en détail

Administration du site (Back Office)

Administration du site (Back Office) Administration du site (Back Office) A quoi sert une interface d'administration? Une interface d'administration est une composante essentielle de l'infrastructure d'un site internet. Il s'agit d'une interface

Plus en détail

GUIDE D UTILISATION GESTION DU CONTENU SITE INTERNET CANATAL. 1 ère Partie. Modification du Contenu du Site WordPress de Canatal

GUIDE D UTILISATION GESTION DU CONTENU SITE INTERNET CANATAL. 1 ère Partie. Modification du Contenu du Site WordPress de Canatal INDUSTRIES CANATAL INC. GUIDE D UTILISATION GESTION DU CONTENU SITE INTERNET CANATAL 1 ère Partie Modification du Contenu du Site WordPress de Canatal Version 1.0 FR 27 février 2013 Page laissée intentionnellement

Plus en détail

Formation. Module WEB 4.1. Support de cours

Formation. Module WEB 4.1. Support de cours Formation Module WEB 4.1 Support de cours Rédacteur Date de rédaction F.CHEA 08/02/2012 Les informations contenues dans ce document pourront faire l'objet de modifications sans préavis Sauf mention contraire,

Plus en détail

MOODLE : Installation et organisation MASTER IPM 2009-2011_ Méthode et Modèle Plate-forme

MOODLE : Installation et organisation MASTER IPM 2009-2011_ Méthode et Modèle Plate-forme MOODLE : Installation et organisation MASTER IPM 2009-2011_ Méthode et Modèle Plate-forme KOUNDE Koba Pierre Sommaire Introduction I Installation 1- Installation d un serveur de type Apache 2- Installation

Plus en détail

gcaddy Suite Description du produit

gcaddy Suite Description du produit gcaddy Suite Description du produit Version 1.0 www.gweb.be @ info@gweb.be TVA : BE-863.684.238 SNCI : 143-0617856-67 1 / 8 1 Description de gcaddy gcaddy est le module E-commerce de Gweb. Il se présente

Plus en détail

Installation Iconito École Numérique 2010 sous Windows WampServer

Installation Iconito École Numérique 2010 sous Windows WampServer Installation Iconito École Numérique 2010 sous Windows WampServer Outil web libre, module de la suite logicielle enfance Iconito version 1.0 Table des matières Table des matières...2 Avant-propos...3 Objectif...3

Plus en détail

Sommaire. Qu est ce qu un blog? Blog / site : quelle différence? Les plateformes de blog

Sommaire. Qu est ce qu un blog? Blog / site : quelle différence? Les plateformes de blog Sommaire Qu est ce qu un blog? Blog / site : quelle différence? Les plateformes de blog Premiers pas sur Wordpress Créer un compte utilisateur Créer un blog Tableau de bord et administration Interface

Plus en détail

CMS AVERTISSEMENT 14 novembre 2012 Mini tutoriel pour compléments d informations

CMS AVERTISSEMENT 14 novembre 2012 Mini tutoriel pour compléments d informations CMS AVERTISSEMENT 14 novembre 2012 Mini tutoriel pour compléments d informations Publier en ligne via un cms? Stage du 14/11/12 (au CRDP académie Rouen) Je vous souhaite de bons tests Christian CRDP académie

Plus en détail

Installer et débuter avec PostgreSQL

Installer et débuter avec PostgreSQL Dominique Colombani Installer et débuter avec PostgreSQL FOCUS Digit Books Éditeur de livres numériques et papiers Brest infos@digitbooks.fr http://www.digitbooks.fr Digit Books, 2013 Conception des couvertures

Plus en détail

Guide de mise à jour BiBOARD

Guide de mise à jour BiBOARD Guide de mise à jour BiBOARD Version 11.4 13/12/2012 Support BiBOARD E-mail : support@biboard.fr Ce document est destiné à l équipe informatique en charge de la mise à jour de l application BiBOARD. Durée

Plus en détail

Introduction MOSS 2007

Introduction MOSS 2007 Introduction MOSS 2007 Z 2 Chapitre 01 Introduction à MOSS 2007 v. 1.0 Sommaire 1 SharePoint : Découverte... 3 1.1 Introduction... 3 1.2 Ce que vous gagnez à utiliser SharePoint... 3 1.3 Dans quel cas

Plus en détail

Plateforme PAYZEN. Intégration du module de paiement pour la plateforme Magento version 1.3.x.x. Paiement en plusieurs fois. Version 1.

Plateforme PAYZEN. Intégration du module de paiement pour la plateforme Magento version 1.3.x.x. Paiement en plusieurs fois. Version 1. Plateforme PAYZEN Intégration du module de paiement pour la plateforme Magento version 1.3.x.x Paiement en plusieurs fois Version 1.4a Guide d intégration du module de paiement Multiple Magento 1/24 SUIVI,

Plus en détail

Maîtriser le backend

Maîtriser le backend 4 Maîtriser le backend Les nouveaux utilisateurs de Magento sont souvent impressionnés par la qualité de son interface d administration, mais ils en redoutent aussi la richesse fonctionnelle. Connaître

Plus en détail

UltraBackup NetStation 4. Guide de démarrage rapide

UltraBackup NetStation 4. Guide de démarrage rapide UltraBackup NetStation 4 Guide de démarrage rapide Table des matières 1 Fonctionnalités... 3 1.1 Ce qu UltraBackup NetStation permet de faire... 3 1.2 Ce qu UltraBackup NetStation ne permet pas de faire...

Plus en détail

DOCUMENTATION MISE A JOUR ANTIBIOGARDE. V4.0 en v4.1

DOCUMENTATION MISE A JOUR ANTIBIOGARDE. V4.0 en v4.1 DOCUMENTATION MISE A JOUR ANTIBIOGARDE V4.0 en v4.1 Version d Antibiogarde 4.1 Version du document 1.0 Date dernière mise à jour du document 15/06/2010 Retrouvez cette doc à jour sur : http://www.antibiogarde.org/activation/

Plus en détail

Formation à l administration de votre site Internet

Formation à l administration de votre site Internet Rédacteur : B2F Concept Date : 01/08/2012 Destinataire : Mairie de Drumettaz Formation à l administration de votre site Internet Introduction...2 Connexion à l administration...2 Gestion de contenu...3

Plus en détail

Gestion des documents avec ALFRESCO

Gestion des documents avec ALFRESCO Gestion des documents avec ALFRESCO 1 INTRODUCTION : 2 1.1 A quoi sert ALFRESCO? 2 1.2 Comment s en servir? 2 2 Créer d un site collaboratif 3 2.1 Créer le site 3 2.2 Inviter des membres 4 3 Accéder à

Plus en détail