Ce manuel regroupe une série d’articles sur les concepts avancés de Drupal qui ne sont pas couvert dans le manuel du webmestre débutant et sur certains modules contribués.
Drupal dispose de plus de 4000 modules contribués par la communauté. Chacun de ces modules apporte ainsi une nouvelle fonctionnalité à votre site.
Cependant, cette énorme richesse fonctionnelle peut être déroutante pour les débutants. Ce manuel tente de regrouper les ressources disponibles sur le sujet.
Quelques ressources externes :
Vous pouvez aussi ajouter votre propre documentation à la suite de ce manuel.
14/04/2009 : Avec la version 2.0 rc7 du module, celui-ci est livré avec un jeu d’icône et le code à changé, la convention de nommage étant désormais : fb-FILETYPE-icon.png par exemple fb-JPG-icon.png
Le module filebrowser créé un type de contenu permettant de lister le contenu d’un répertoire.
Ce n’est écrit nulle part, mais en jetant un oeil au code du module je me suis rendu compte qu’il prenait en charge l’affectation d’icônes pour les dossiers et les types de fichiers.
Il vous suffit de créer un répertoire /icons/ dans modules/filebrowser et ensuite de placer vos icônes png dans le dossier en respectant la convention de nommage suivante :
file-ext.png ou «ext»est remplacé par l’extension de fichier pour laquelle vous voulez avoir une icône. Pour le répertoire, simple c’est file-folder.png.
Les modules de chat
Un Chat offre les caractéristiques d’une conversation écrite à l’identique de celle des messageries instantanées. Il permet une communication immédiate à plusieurs et peut être considéré comme un forum instantané pour les messages courts. Par contre les messages ne sont normalement pas conservés.
Classiquement, le Chat a deux utilisations, publique ou privé. Public, le Chat sert à converser entre membres d’un site. Privé, la conversation est limitée à un groupe d’utilisateurs ou d’administrateurs. Cette dernière utilisation convient particulièrement à l’enseignement en ligne, la gestion de projet…
Avec le développement des messageries incluant la visiophonie, le Chat peut sembler désuet, mais il conserve plusieurs avantages. Le message écrit est plus lent à rédiger, et donc impose une pus longue période de réflexion entre chaque échange. La conversation écrite conserve son efficacité même si le nombre de participants augmente, alors que la conversation orale tourne à la cacophonie. C’est donc pourquoi le Chat continue d’être utiliser dans des sites collaboratifs. Le choix de l’installation d’un Chat depend donc de son contexte d’utilisation, mais aussi de la disponibilité des autres solutions de communication : forum, messagerie extérieure ou interne, courriel.
Les modules de Chat s’évaluent principalement en fonction de :
- L”usage minimal de la bande passante (généralement grâce aux technologies AJAX).
- Des fonctions d’interface (langues, émoticones…).
- De l’intégration à Drupal (au système de taxinomie, à la gestion des utilisateurs et des droits).
Projets officiels
Chatbox - Shoutbox
http://drupal.org/node/10720
http://drupal.org/node/10720
Les projets de chat les plus anciens, mais à mon avis, ils sont recommandables pour les seules personnes n’ayant aucun problème d’hébergement. Ils n’utilisent pas AJAX et consommeront plus de bande passante que les modules plus récents. Ces modules ont cependant l’avantage d’être compatibles 4.7 et d’être plus matures.
Yshout Ajax Chat
http://drupal.org/node/66026
C’est intégration d’un Chat dans un bloc. Il a le double avantage d’être compatible 4.7 et d’être peu consommateur de bande passante. Par contre l’intégration avec Drupal est limitée au minimum. Même l’apparence devra sans doute faire l’objet d’adaptation en modifiant des fichiers CSS et html. Il demeure cependant simple d’installation et n’utilise pas de base de données.
Phpfreechat
http://drupal.org/node/62389
C’est l’intégration d’un Chat autonome à Drupal (www.phpfreechat.net). Les fonctions de Chat sont vraiment complètes. Le module utilise Ajax pour économiser la bande passante et n’utilise pas de base de données. L’intégration avec Drupal est relativement complète :
- Les chats peut être attribués à du contenu ou un groupe de contenu.
- Les chats peuvent être communs ou séparés.
- Les noms d’utilisateurs sont repris automatiquement (option)
Il n’y a que deux problèmes majeurs :
- Actuellement non compatible 4,7
- Le système de droit de Drupal n’est pas encore implémenté (mais le Chat peut être lui même inclu dans un contenu dont l’accès est limité).
Projets officieux
Ajax Chat
http://cvs.drupal.org/viewcvs/drupal/contributions/modules/chat/
Un Chat en développement qui permet de converser avec un membre ajouté à sa « buddy list ». Il nécessite donc le module buddylist pour fonctionner. Il est difficile de prévoir son évolution. Ce module est complémentaire au formulaire de contact pour les communications à deux.
Chat
Intégration d’un Chat programmé en flash (www.topcmm.com). Une démonstration est disponible à l’adresse suivante : http://webs7ven.com/
Le programme est de qualité, mais l’usage de ce type de Chat reposant sur un moteur extérieur, limite l’intégration à Drupal. Au final, ce type d’approche est relativement similaire à l’usage d’une messagerie extérieure, mais consomme la bande passante de l’hébergement.
Voir aussi :
Chatroom
http://drupal.org/project/chatroom
Tribune
http://drupal.org/project/tribune
Conclusions
Pour l’implémentation d’un Chat simple, Yshout Ajax Chat offre l’avantage de la légèreté, mais l’intégration avec Drupal se limite au minimum. Actuellement, il n’y a pas de solution totalement intégrée à Drupal pour un usage intensif du Chat. PhpFreeChat sera probablement ce futur Chat de référence pour Drupal si son développement se poursuit pour être compatible avec les versions futures de Drupal.
Ce module n’est pas un module agissant directement sur le site web mais plus un module de confort pour l’administrateur.
Il permet à l’administrateur d’accéder en un seul clic au travers d’un menu situé en haut de la fenetre à n’importe quelle partie du menu d’administration.
Paramétrages
Son paramétrage se fait par la partie : Administrer > Configuration du site > Administration menu ( ou admin/settings/admin_menu ).
Ce module n’a pas besoin de paramétrage pour correctement fonctionner, les paramètres par défaut suffisent.
Avantages
La navigation dans le menu est énormément simplifié et le temps a passer dans les différentes pages du menu d’administration s’en trouve d’autant réduit.
Le module permet aussi de connaître le nombre d’utilisateurs utilisant la plateforme drupal, de se déconnecter, de lancer le cron, le système d’update et d’aller directement sur la page d’un module installer.
Astuce
Dans la partie de paramétrage du menu se trouve un bouton permettant de reconstruire complètement le menu extrêmement utile en cas de problème d’arborescence.
Le menu peut être utilisé par des personnes autres que l’administrateur, pour cela il suffit d’attribuer aux rôles de ces utilisateurs les droits access administration menu ( module admin menu )
En bref, une fois ce module installé on se demande comment on pouvait faire sans.
Ce module permet de créer, lister et modifier les types de contenu ou noeud (tel que livre, page, sondage, etc…) au travers d’une interface.
Paramétrages
Ce module n’a pas de paramétrage en lui même afin de le configurer.
L’interface de gestion du contenu se trouve dans Gestion du Contenu > Type de contenu ( admin/content/types )
Avantages
Ce module permet de creer tout type de nouveau noeud (node) avec chacun leur propre catégorie.
Astuces
Il est possible grâce à ce module d’éclater un type en créant de nombreux enfants :
par exemple, il est possible au lieu d’utiliser un type actualités de creer un type actualité drupal, un type actualité drupalfr, un type actualité drupal.org, etc…
Introduction aux thèmes
[edit] Pré requis
Drupal est reconnu pour sa puissance et sa flexibilité, il est ainsi parfois difficile de comprendre comment interagissent les différents éléments qui composent l’application. Même s’il existe de nombreuses façons de réaliser un thème, toutes ne sont pas forcément recommandées. Avoir connaissance des bonnes pratiques permet de minimiser les erreurs et de faciliter la maintenance. Même si vous choisissez de ne pas respecter les règles et de mettre en œuvre votre propre méthode, vous aurez de meilleurs chances de succès en en ayant eu connaissance.
Cela ne veut pas dire que vous devez comprendre Drupal dans les moindres détails pour être capable de créer votre propre thème. En fonction de la complexité du résultat recherché, il vous faudra plus ou moins maitriser les spécificités du système de thème de Drupal.
Le but de ce manuel est d’introduire les notions qui vous permettront de mieux appréhender le fonctionnement de la couche graphique d’une application Drupal. Certains paragraphes nécessiteront des compétences techniques tandis que d’autres seront plus basiques. La complexité des sujets présentés dans les pages suivantes évoluera progressivement : depuis une présentation des concepts que tous les créateurs de thèmes devront maitriser jusqu’à des sujets plus spécifiques et parfois plus techniques.
Afin de tirer parti de ce manuel vous devrez maitriser les concepts suivants :
* xHMTL et CSS
* JavaScript et jQuery (si votre thème nécessite l'utilisation de script)
* La terminologie utilisée dans Drupal
Une connaissance de PHP sera nécessaire pour certains chapitres mais il est possible de s’en sortir sans expertise aucune avec des thèmes purement CSS.
Selon la complexité du cahier des charges de votre thème, la création d’un thème peut être simple ou terriblement complexe. Drupal est très ouvert, il est donc nécessaire d’être prudent sur ce que vous allez tenter de réaliser. Vous devez d’abord penser au cahier des charges du site. Il est beaucoup plus facile de réaliser un thème en ayant des objectifs très précis et spécifiques que de réaliser un thème flexible et généraliste.
Enfin si vous êtes bloqué, lisez la page de dépannage, demandez dans le forum sur les thèmes ou sur IRC @ #drupal-themes. Voyez comment utiliser l’IRC ici.
[edit] Les thèmes : vue d’ensemble
Une pratique courante dans le monde du développement web est de séparer le code et le graphisme d’un site. Il existe de nombreuses bonnes raisons pour agir de la sorte, la plus évidente étant que l’expertise nécessaire pour programmer l’application est très différente de celle nécessaire pour créer une interface belle et efficace. En tant que créateur de Thème, vous pouvez contrôler uniquement l’affichage et la présentation. Seul le cœur de l’application et ses modules peuvent travailler avec les données d’entrée. Par exemple, un module peut mettre en place un formulaire qui aura un aspect standard et qui va traiter les données rentrées par l’utilisateur avant de les sauver dans la base de donnée. Le rôle d’un thème sera « seulement » d’intercepter l’affichage du formulaire afin de le modifier pour l’adapter à la charte graphique du site.
Ce mécanisme d’abstraction est accomplie par la fonction « theme » de Drupal. Elle dirige vers le sous-système de thème. Elle permet aux moteurs de thèmes de fournir une couche optionnelle intermédiaire pour des langages de tags comme PHPTAL ou Smarty. Elle permet aussi aux thèmes de contrôler tout le marquage de présentation. Les moteurs de thèmes sont optionnels, tout comme les langages de tags. PHPTemplate est le moteur par défaut. Comme son nom le suggère, il utilise PHP comme langage pour afficher les variables qu’il associe au marquage xHTML.
Depuis Drupal 6, les contraintes pour la réalisation d’un moteur de thème ont été considérablement réduites.
Les moteurs de thèmes peuvent modifier une sortie venant de l’application ou de l’un de ses modules tandis que les thèmes peuvent intercepter n’importe quelle sortie. Notez que le moteur PHPTemplate ne peux pas intercepter de sorties au contraire des autres moteurs. Il y a cependant un cas spécial où les modules peuvent influencer l’affichage d’une sortie ou intercepter cette sortie mais il s’agit de cas vraiment très spécifiques et ils ne devraient pas impacter l’affichage dans la grande majorité des situations. Par exemple, le module devel le fait dans le but d’aider et assister les développeurs de thème. Plus de détails à venir dans un chapitre séparé.
Dans le cas où votre thème sera mis en forme uniquement par l’intermédiaire de feuille de style vous pouvez ignorer ce qui vient d’être dit. Mais quand le marquage à besoin d’être modifié il est alors important de savoir comment déterminer quelle est la source de la sortie afin de pouvoir la modifier.
* Notez que le cœur de Drupal et que de nombreux modules utilisent toujours des « fonctions de thème » et des « fichiers de gabarit » pour afficher leur marquage de présentation. Ne modifiez jamais des fichiers en dehors de votre répertoire de thème, cela vous posera des problèmes dès lors qu'il s'agira de mettre à jour votre application.
La puissance de l’open source est d’avoir une communauté qui gère les bugs et qui ajoute des nouvelles fonctions. Une fois que vous commencez à modifier le code source, vous créez un système fermé et vous perdez tous les bénéfices associés à la communauté. Drupal fournit toutes les fonctionnalités qui permettent d’intercepter et modifier l’affichage. Si vous avez besoin de modifier un fichier en dehors de ceux du thème, vous êtes soit en train de faire une erreur soit vous avez découvert un bug. Dans le dernier cas, merci de nous fournir un rapport de bug. Ou, encore mieux, donnez nous un patch qui permet de réparer ce problème.
* Pour ceux qui sont familiers avec les précédentes versions du moteur PHPTemplate, presque toutes les fonctionnalités sont mieux intégrées au cœur de l'application Drupal. La fonction de PHPTemplate est maintenant de détecter les fonctions de thème et les gabarits pour les besoins du thème. Il s'éloigne de se qu'on attend classiquement d'un moteur et se rapproche plus d'un assistant à la réalisation de thème. PHPTemplate a été développé initialement par Adrian Rossouw pour la version 4.7 de Drupal. Les changements pour Drupal 6 ont été l'oeuvre de Earl Miles. Le forum de discussion donne plus de détail sur les raisons qui sont sous-jacentes à la création du moteur et la liste suivante nous éclaire sur celles qui ont présidé à la nouvelle orientation du moteur de Drupal 6.
[edit] L’anatomie d’un thème Drupal
Si vous regardez le contenu du répertoire d’un thème phptemplate, vous y trouverez en général les fichiers suivants :
* Un fichier .info obligatoire pour y stocker des paramètres de configuration,
* Des gabarits en .tpl.php pour contrôler ce qui est affiché,
* Des feuilles de styles pour gérer l'apparence visuelle de ce qui est affiché,
* Un fichier template.php qui contiendra le code de fonctions spécifiques au thème afin, si nécessaire, de manipuler et transformer les données,
* Divers autres fichiers : logo, miniature…
[edit] .info (requis)
Ce fichier est obligatoire pour que votre thème soit détecté par Drupal. Son rôle est de configurer certaines éléments de votre thème. Vous pouvez y définir :
* Les méta données,
* L'emplacement des feuilles de styles qui vont contrôler l'affichage,
* L'emplacement des scripts JavaScripts,
* Le nom des différentes régions de vos blocs de contenus,
* Le nom du thème « parent » dans le cas d'un sous-thème (voir plus loin)
* Et plus encore, mais tout le reste est optionnel.
Le nom interne du thème est aussi déduit de ce fichier. Par exemple, si il est nommé « drop.info », alors Drupal considèrera que le thème s’appelle « drop ».
Les version 5 et précédentes de Drupal utilisaient le nom du répertoire qui contenait les fichiers du thème pour en déduire le nom interne du thème.
Les fichier info pour les thèmes sont nouveaux dans Drupal 6. Dans la version 5, les fichiers .info étaient seulement utilisés pour les modules.
[edit] Fichiers de gabarits (template) (.tpl.php)
Chaque élément de contenu (nœud, block, page, etc.) est contrôlé par son propre gabarit. Ce sont ces gabarits qui vont déterminer quels champs de chaque contenu vont être affichés. Pour accomplir leur rôle, ces gabarits sont principalement constitués de textes (pour le contenu statique), de variables PHP (pour le contenu dynamique) et de balises xHTML (pour la structuration du contenu).
Il y a des situations où ils peuvent afficher d’autres types de données -xmls rss par exemple. Chaque fichier .tpl.php manipule l’affichage de données spécifiques au thème et dans certaines situations, il peut manipuler plusieurs fichiers .tpl.php au travers du mécanisme de « suggestions ».
Faites attention à ne pas compliquer inutilement la logique et le contenu de ces fichiers. Dans la plupart des cas, ils ne devraient contenir que des balises xHTML et des variables PHP. Vous pouvez utiliser le fichier template.php pour y intégrer le code plus complexe (voir ci-dessous).
Ces fichiers sont optionnels et s’il n’en existe aucun dans votre thème, l’affichage des contenus sera celui par défaut. En effet, de nombreux gabarits standard existent dans les répertoires de l’application et de ses modules. Ce sont eux qui seront utilisés par défaut. En les copiant dans votre répertoire de thème vous vous assurez que Drupal prendra votre version en compte.
Note : Le « registre de thème » stocke les données de thème en cache Il doit être actualisé lorsque vous ajoutez ou modifiez des fichiers de gabarit ou des fonctions de thème.
[edit] Les feuilles de styles (.css)
Les feuilles de style CSS contrôlent l’apparence visuelle des contenus affichés par les gabarits. A l’image des fichiers de gabarit, elles sont optionnelles car les feuilles de styles standards de Drupal et de ses modules sont actives par défaut. Par contre chaque déclaration placée dans une feuille de style de votre thème interceptera la déclaration standard et sera donc prise en compte.
[edit] Le fichier template.php
Les fonctions spécifiques à votre thème, les fonctions de thème que vous interceptez et toutes autres spécificités doivent être placées ici. Ce fichier va gérer toute la logique conditionnelle et manipuler les données de sortie. Cela n’est pas obligatoire, mais afin d’améliorer la lisibilité des fichiers .tpl.php vous pouvez inclure dans le fichier template.php des pré-processeurs qui vont générer des variables avant quelles soient incluses dans les balises des fichiers .tpl.php.
Le fichier doit commencer par une balise d’ouverture PHP « < ? php », par contre il est recommandé de ne pas inclure la balise de fermeture.
[edit] Les sous-thèmes
Image:Sub-theme_branching.png
Pour faire court, on peut dire que les sous-thèmes se comportent comme n’importe quel autre thème. La seule différence est qu’ils héritent des ressources de leurs thèmes « parents ». Pour créer un sous-thème, il faut indiquer quel est son thème de base dans le fichier .info. Le sous-thème héritera alors de toutes les ressources du thème parent. Il peut y avoir de multiples niveaux d’héritage car un sous-thème peut être le thème de base d’un autre sous-thème. En fait il n’y aucune limite matérielle à cela.
Drupal 5 et les versions précédentes, demandaient à ce que les sous-thèmes soient placés dans des sous-répertoires du thème parent. Ce n’est plus le cas avec Drupal 6.
[edit] Autres
* Le logo et la capture d'écran ne sont pas nécessaires pour faire fonctionner le thème. Ils sont cependant recommandés, surtout si vous souhaitez partager votre thème avec la communauté. La miniature sera affiché dans l'interface d'administration des thèmes et dans celle de gestion des paramètres utilisateurs pour sélectionner un thème. Pour plus d'information, voyez les conseils relatifs aux captures d'écran.
* Afin de fournir plus d'information de paramétrage (logo, recherche, mission, etc.) un fichier "theme-settings.php" peut être utilisé. Ceci est une fonctionnalité avancée. Plus d'information dans la section Paramétrage Avancé du manuel.
* Pour le support du module « color », un répertoire « color » avec un fichier « color.inc » et quelques autres fichiers est nécessaire.
Si vous voulez baser votre travail sur un thème existant, utilisez la méthode des sous-thèmes ou faites une copie et renommez le thème. Il fortement déconseillé de modifier directement Garland ou Minelli parce qu’ils sont utilisés pour les processus d’installation et de mise à jour. Tous les thèmes doivent être installés dans le répertoire « sites/all/themes » afin de les séparer des fichiers standards. Lisez le chapitre sur les installation multi-site pour voir toutes les possibilités d’emplacement.
[edit] Le fichier .info
Dans Drupal 6, les fichiers .info sont désormais obligatoires pour chaque thème. Ce fichier doit se trouver dans le répertoire de votre thème. Si ce fichier est manquant, le thème ne sera pas visible par Drupal. Il doit obligatoirement se terminer par l’extension «.info» Le nom utilisé en interne (sans caractère spécial) du thème est dérivé de ce fichier. Par exemple, si le fichier est nommé «drop.info», alors pour Drupal, le nom du thème sera «drop». Soyez sûr de ne pas utiliser de caractère spécial, car ce nom sera utilisé pour informer Drupal de la manière dont seront formées certaines fonctions PHP. De ce fait, les limitations de nommage des fonctions PHP s’appliquent également au nom de ce fichier : doit démarrer avec un caractère alphabétique, pas d’espace ou ponctuation. Les Underscores sont autorisées mais pas les tirets. Les chiffres sont également autorisés si ce n’est pas le premier caractère.
La syntaxe est similaire aux fichiers INI. Il s’agit d’un fichier texte statique permettant de configurer le thème. Chaque ligne est composée d’une valeur clé à gauche, et d’une valeur à droite, avec un signe égal «=» entre eux. (par exemple : clé = valeur). Les «points-virgules» sont utilisés afin de mettre une ligne en commentaire.
Drupal comprend les clés listées ci-dessous. Si une clé n’est pas présente, Drupal utilisera la valeur par défaut.
* name !
* description *
* screenshot
* version *
* core !
* engine *
* base theme
* regions
* features
* stylesheets
* scripts
* php
name (requis)
* Le nom "naturel" du thème, qui peut désormais être différent de celui du nom "interne".
description (recommandé)
* Courte description du thème. Elle est affichée sur la page de sélection du thème "Administer Site building Themes"
screenshot
* Cette clé optionnelle donne le chemin où Drupal peut trouver une miniature d'illustration du thème. Si cette clé n'est pas renseignée, Drupal utilisera "screenshot.png" dans le répertoire du thème.
* Utilisez cette clé uniquement si vous souhaitez utiliser un fichier non nommé "screenshot.png" ou si vous désirez placer la miniature dans un répertoire autre que la base du thème (par ex. screenshot = images/screenshot.png).
version (recommandé)
* Cette chaine est automatiquement ajoutée par drupal.org quand une nouvelle version est créée et qu'un tarball est créé. Vous pouvez omettre cette chaîne si vous contribuez votre thème sur drupal.org. Sinon, vous pouvez renseigner la version de votre thème.
core (requis)
* Les .info doivent indiquer, impérativement, avec quelle version majeure du core de Drupal ils sont compatibles. La valeur renseignée ici est comparée avec la constante "DRUPAL_CORE_COMPATIBILITY". Si la comparaison est fausse, le thème sera désactivé.
* Ex: core = 6.x
engine (recommandé)
* Le moteur du thème qui sera utilisé. Si aucune chaîne n'est spécifiée, Drupal considèrera que le thème est autosuffisant. La plupart des thèmes devraient utiliser "phptemplate".
base theme
* Les sous-thèmes peuvent déclarer un thème de base. Cela permet un héritage des ressources de la part du thème de base.
regions
* Les régions (pour les blocks) disponibles pour ce thème sont définis en spécifiant ces clés "regions" suivies par le nom interne entre crochets [ ].
* Ex : regions[laRegion] = nom de la région
* Si aucune région n'est définie, les valeurs par défaut seront utilisées.
regions[left] = Left sidebar
regions[right] = Right sidebar
regions[content] = Content
regions[header] = Header
regions[footer] = Footer
Features
* Divers éléments des pages rendues peuvent être activés ou non directement dans le fichier .info. Si ces éléments sont désactivés, les cases à cocher n'apparaitront plus sur la page de configuration du thème.
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
stylesheets
* Par défaut, les thèmes utilisent le fichier style.css de manière automatique. Néanmoins, il est possible de définir d'autre feuilles de style à ajouter.
script
* Permet de définir des fichiers javascript à insérer automatiquement dans votre thème.
php
* Cette chaine définit la version minimum de PHP qui doit être présente sur le serveur afin de supporter votre thème.
* Pour la plupart des thèmes, cette chaine de devrait pas être spécifiée.
[edit] Valeurs par défaut
regions
regions[left] = Left sidebar
regions[right] = Right sidebar
regions[content] = Content
regions[header] = Header
regions[footer] = Footer
features
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
stylesheets
stylesheets[all][] = style.css
scripts
scripts[] = script.js
screenshot
screenshot = screenshot.png
php (minimum support)
DRUPAL_MINIMUM_PHP est une constante. Elle permet d’indiquer la version minimum de PHP qui doit être présente.
php = DRUPAL_MINIMUM_PHP
[edit] Feuilles de style
[edit] Blocs, contenus et régions
Les régions disponibles pour le thème en cours sont définies dans le fichier .info.
Les noms qui y sont définis sont convertis en variables dans le fichier «page.tpl.php» de manière automatique. Par exemple, pour l’entrée «regions[left] = Left Sidebar», on pourra utiliser la variable $left dans le fichier «page.tpl.php». De ce fait, les restrictions de nommage des variables php s’appliquent aux noms internes des régions. Elles ne peuvent contenir que des caractères alphanumériques et des underscores, mais ne peuvent commencer par un chiffre.
Gardez également à l’esprit :
* Qu'il existe des fichiers de template (.tpl.php) pour définir individuellement chaque block.
* Ajouter une région empêche les régions par défaut d'être utilisées. Si vous souhaitez garder les valeurs par défaut en plus de votre nouvelle région, vous devez également ajouter dans le fichier .info les valeurs par défaut.
* L'ordre de définition des régions influencera l'ordre dans lesquelles elles apparaitront dans le back office.
* Le contenu du fichier .info est mis en cache dans la base de donnée, donc si vous le modifiez, drupal ne prendra pas en compte la modification. Pour prendre en compte les changements,
o Utilisez le bouton "clear" sur la page "administer > Site configuration > Performance"
o Aller simplement sur la page de sélection de thème "Administer > Site building > Themes
[edit] Préférences personnalisées d’un thème
Divers éléments d’une page rendue par un thème peuvent être activés ou désactivés sur la page de configuration située dans Administration > Construction du site > Thèmes > nomDuTheme. Par exemple, le slogan peut être supprimé en décochant la case « Slogan du site » sur cette page.
Image:Features_enabled.png
[edit] Fonctionnalités activées
L’état de ces cases à cocher est dépendant des fonctionnalités activées à l’intérieur du fichier .info. Celles-ci doivent être définies avec le mot clé ‘features’ suivi de crochets ouvrant et fermant vides puis de la fonctionnalité elle même, e.g., features[] = la_fonctionnalité. Si rien n’est défini, les valeurs suivantes sont appliquées.
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
Pour désactiver ces fonctionnalités, ajoutez seulement celles que vous désirez dans le fichier .info. Définir seulement les fonctionnalités requises désactivera les autres. Certaines de ces fonctionnalités activeront également un champ de formulaire associé. Par exemple, ‘logo’ activera un champ d’envoi de fichier pour l’image à côté de la case à cocher.
Remarques:
* Le contenu du fichier [[#Le fichier .info[.info]]] est mise en cache dans la base de données. Drupal ne s'apercevra alors plus de vos modifications. (Ne pas confondre cela avec l'enregistrement du thème). Pour le vider, effectuez l'une de ces opérations :
o Cliquez sur le bouton 'Vider' situé dans Administrer > Configuration du site > Performance.
o Avec le bloc devel activé (fourni avec le module devel), cliquez sur le lien « Vider le cache ».
o Visitez tout simplement la page de sélection de thème dans Administrer > Construction du site > Themes.
* hook_features() n'est plus supporté.
[edit] Préférences avancées
Dans la section administration de Drupal, chaque thème a sa propre page de configuration dans admin/build/themes/settings/themeName. Cette page a un formulaire avec des paramètres standards tels que « Configuration du logo » et « Configuration de l’icône de raccourci ».
Dans Drupal 6, les auteurs de thèmes peuvent maintenant personnaliser cette page en ajoutant des champs de configuration au formulaire. Les utilisateurs de Drupal 5 devront avoir installé le module « Theme Settings API » (5.x-2.1 ou supérieur) afin de disposer de cette fonctionnalité et pouvoir poursuivre.
[edit] Ajouter des champs de formulaires pour le réglage de vos paramètres personnalisés
Tout d’abord, créez un fichier theme-settings.php dans le répertoire de votre thème et ajoutez-y la fonction themeName_settings() ou themeEngineName_settings(). Cette dernière est conseillée puisqu’elle permet plus facilement à d’autres utilisateurs de créer des thèmes dérivés du votre. La fonction doit utiliser l’interface de programmation « Forms » pour créer les champs additionnels.
Par exemple, pour ajouter des réglages au thème Garland, la fonction garland_settings() ou phptemplate_settings() doit être placée dans le fichier theme-settings.php du theme.
Si un utilisateur avait précédemment sauvegardé le formulaire de réglage du thème, les valeurs sauvegardées seront passées en paramètres à cette fonction dans la variable $saved_settings. Les champs à ajouter au formulaire doivent être retournés en tant que tableau de l’API« Forms ».
Les commentaires dans le code suivant vous en explique les détails :
<?php
// Un exemple du fichier themes/garland/theme-settings.php.
/**
* Implementation de la fonction THEMEHOOK_settings().
*
* @param $saved_settings
* array Un tableau contenant les réglages sauvegardés pour ce thème.
* @return
* array Un tableau représentant les champs du formulaire.
function phptemplate_settings($saved_settings) {
/*
* Les valeurs par defaut des variables du thème. Assurez vous que $defaults
* corresponde à $defaults dans le fichier template.php.
*/
$defaults = array(
'garland_happy' => 1,
'garland_shoes' => 0,
);
// Fusionne les variables sauvegardées avec leurs valeurs par défaut
$settings = array_merge($defaults, $saved_settings);
// Crée les champs de formulaires additionnels en utilisant l'API « Form »
$form['garland_happy'] = array(
'#type' => 'checkbox',
'#title' => t('Get happy'),
'#default_value' => $settings['garland_happy'],
);
$form['garland_shoes'] = array(
'#type' => 'checkbox',
'#title' => t('Use ruby red slippers'),
'#default_value' => $settings['garland_shoes'],
);
// Retourne les champs de formulaire additionnels
return $form;
}
?>Remarquez que les auteurs de thèmes peuvent créer des formulaires complexes, dynamiques en utilisant les fonctions avancées de l’API « Form » et des fonctionnalités javascript de « JQuery » (auto-completion, groupement de champs rétractibles).
[edit] Récupération des valeurs de configuration dans vos fichiers de thème
Pour récupérer les valeurs de configuration dans les fichiers de thème template.php ou .tpl.php, utilisez simplement theme_get_setting(‘varname’). Consultez l’API Drupal pour plus de détails : [1]
Par exemple :
<?php
$happy = theme_get_setting('garland_happy');
?>[edit] Initialiser les valeurs par défaut
Puisque nous ne pouvons garantir que l’utilisateur se rendra sur la page admin/build/themes/settings/themeName, nous devons nous assurer que les valeurs par défaut de nos paramètres personnalisés soient initialisées.
Les variables de configuration du thème ne sont pas définies tant que nous ne soumettons pas le formulaire admin/build/themes/settings/themeName une première fois. Dans notre fichier template.php nous devons donc vérifier si les variables sont définies ou non. Si elles ne sont pas encore définies, nous devons leur assigner une valeur par défaut. Cela est accompli en récupérant une des variables et en regardant si sa valeur est null. Si elle l’est, nous enregistrons les valeurs par défaut en utilisant variable_set() et forçons un rafraichissement des paramètres dans les entrailles de Drupal avec theme_get_setting(, TRUE).
Ajoutez le code suivant vers le début de votre fichier template.php :
<?php
/<em>
</em> Initialise les réglages du thème
<em>/
if (is_null(theme_get_setting('garland_happy'))) { // <-- changez cette ligne
global $theme_key;
/</
em>
* Les valeurs par defaut des variables du thème. Assurez vous que $defaults
* corresponde à $defaults dans le fichier template.php.
*/
$defaults = array( // <-- changez ce tableau
'garland_happy' => 1,
'garland_shoes' => 0,
);
// Récupère les paramètres par défaut du thème.
$settings = theme_get_settings($theme_key);
// Ne pas sauvegarder les variables toggle_node_info_
if (module_exists('node')) {
foreach (node_get_types() as $type => $name) {
unset($settings['toggle_node_info_' . $type]);
}
}
// Sauvegarde les paramètres par défaut du thème.
variable_set(
str_replace('/', '_', 'theme_'. $theme_key .'_settings'),
array_merge($defaults, $settings)
);
// Force un rafraichissement des paramètres.
theme_get_setting('', TRUE);
}
?>Notez que la variable nommée garland_happy dans la première ligne du code précédent doit être remplacée par le nom de variable d’un de vos paramètres de configuration et que $defaults doit être copié depuis votre fichier theme-settings.php.
[edit] Ajouter de nouveaux paramètres de configuration à une nouvelle version de votre thème
Après avoir publié une version 1.0 de votre thème, vous voudrez éventuellement ajouter de nouveaux paramètres de configuration personnalisés pour la version 2.0. Le procédé est quasiment identique. Cependant, faites attention au code d’initialisation dans la troisième étape :
1. Dans votre fichier theme-settings.php, ajoutez vos nouveaux paramètres de configuration aux variables $default et $form.
2. Dans votre fichier template.php, ajoutez vos paramètres à la variable $defaults dans le code d'initialisation des paramètres du thème.
3. Dans votre fichier template.php, mettez à jour le code d'initialisation pour vérifier l'existence d'un de vos nouveaux paramètres. Par exemple, si vous avez ajouté plusieurs paramètres y compris le paramètre garland_slippers, vous changeriez la première ligne du code d'initialisation du thème, ce qui donnerai :
if (is_null(theme_get_setting('garland_slippers'))) {
Cela assurera que les paramètres par défaut pour les nouveaux paramètres personnalisés soient ajoutés aux valeurs des anciens paramètres personnalisés.
[edit] Intégration du module couleur
Le module Color permet à l’administrateur de changer complètement le jeu de couleurs d’un thème. En sélectionnant une palette de 5 couleurs (aussi bien à partir d’un jeu de couleurs prédéfini ou manuellement), vous pouvez entièrement changer les couleurs d’un thème.
Le module peut altérer la feuille de style et regénérer les images. Toutefois le thème doit fournir plusieurs « hooks » spécifiques afin que cela soit possible et le design doit être créé pour spécifiquement pour s’y prêter.
Ce document explique les bases afin de créer un thème colorable.
[edit] Design
Il est important de réaliser que tous les designs ne se prêtent pas à cette pratique à cause de la façon dont le module color fonctionne.
Image:Color.module.png
Commencez par prendre une image transparente du design (la base), qui inclut tout excepté le fond. Composez ensuite cette image au dessus d’un fond coloré pour en obtenir les versions colorées. Enfin, découpez cette image en plusieurs petites images et sauvegardez les dans des fichiers séparés.
Il faut également adapter le fichier css et changer toutes les couleurs basées sur celles que vous avez définies. Le module change les couleurs en utilisant une palette comme référence. Les couleurs qui n’apparaissent pas literalement sont ajustées à la couleur la plus proche de la palette couleur (aussi bien pour un lien, texte que pour une couleur de fond).
Le maquettage du design dans votre logiciel de retouche d’image va consister à créer un fichier avec un ou plusieurs calques de couleurs de fond en bas et tout le reste qui se fond dessus en haut de la pile. Lorsque vous enregistrerez votre fichier, vous devrez fusionner tous les calques ensemble à l’exception des calques de couleurs de fond qui eux devront être rendus invisibles. Observez le fichier base.png du thème Garland pour en voir un exemple (ouvrez le à l’intérieur de votre logiciel de retouche pour voir les zones et niveaux de transparence. Afin de mieux les visualiser, vous pouvez créer un calque en dessous et le remplir de couleur). Il y a une vidéo qui vous montre comment créer votre propre fichier base.png avec Photoshop.
Tous les fichiers générés durant cette procédure sont stockés dans /files/css et utilisés à la place du répertoire images par défaut. Cela veut dire q’un thème devrait toujours fonctionner avec le jeu de couleur par défaut du thème même sans le module Color.
[edit] En pratique
Prenons Garland comme exemple. Les fichiers le plus importants se trouvent dans le sous répertoire themes/garland/color :
base.png
Ce fichier contient le design de base du thème, qui est composé et découpé en images.
color.inc
Ce fichier contient tous les paramètres nécessaires pour colorer le thème. Voyez plus bas.
preview.css
Ce fichier css est utilisé pour générer un aperçu lorsque vous changez une couleur.
preview.png
Cette image est utilisée pour générer un aperçu lorsque vous changez une couleur.
La présence de color/color.inc fait apparaître un sélecteur de couleur sur la page de configuration du thème. C’est un fichier php classique qui contient un tableau $info avec les valeurs suivantes :
[edit] Jeux de couleurs
<?php
array('schemes' => array(
'#0072b9,#027ac6,#2385c2,#5ab5ee,#494949' => t('Blue Lagoon (Default)'),
'#464849,#2f416f,#2a2b2d,#5d6779,#494949' => t('Ash'),
'#55c0e2,#000000,#085360,#007e94,#696969' => t('Aquamarine'),
'#d5b048,#6c420e,#331900,#971702,#494949' => t('Belgian Chocolate'),
'#3f3f3f,#336699,#6598cb,#6598cb,#000000' => t('Bluemarine'),
'#d0cb9a,#917803,#efde01,#e6fb2d,#494949' => t('Citrus Blast'),
'#0f005c,#434f8c,#4d91ff,#1a1575,#000000' => t('Cold Day'),
'#c9c497,#0c7a00,#03961e,#7be000,#494949' => t('Greenbeam'),
'#ffe23d,#a9290a,#fc6d1d,#a30f42,#494949' => t('Mediterrano'),
'#788597,#3f728d,#a9adbc,#d4d4d4,#707070' => t('Mercury'),
'#5b5fa9,#5b5faa,#0a2352,#9fa8d5,#494949' => t('Nocturnal'),
'#7db323,#6a9915,#b5d52a,#7db323,#191a19' => t('Olivia'),
'#12020b,#1b1a13,#f391c6,#f41063,#898080' => t('Pink Plastic'),
'#b7a0ba,#c70000,#a1443a,#f21107,#515d52' => t('Shiny Tomato'),
'#18583d,#1b5f42,#34775a,#52bf90,#2d2d2d' => t('Teal Top'),
));
?>Cette entrée contient un juste un tableau des jeux de couleurs prédéfinis. Chaque entrée doit avoir 5 couleurs, formatées comme ci-dessus, avec un titre.
Le premier jeu défini est utilisé comme référence et doit correspondre approximativement aux couleurs utilisées par vos images et feuille de style dans votre thème par défaut. Sinon les couleurs finales peuvent différer de ce que l’utilisateur en attendrai. Référez vous à la section « feuille de style » pour plus d’information sur la façon dont les couleurs sont calculées.
[edit] Images à copier
<?php
array('copy' => array(
'images/menu-collapsed.gif',
'images/menu-expanded.gif',
'images/menu-leaf.gif',
));
?>Ce tableau contient une liste des images qui ne doivent pas être modifiées. Elles sont copiées à l’endroit où les images et la feuille de style sont générées.
[edit] Zones de remplissage et dégradés
Pour colorer l’image, une image cible de la même taille que l’image de base est créée, puis remplie avec des zones de couleurs et un dégradé. Pour plus de flexibilité, la localisation de ces zones est définie en spécifiant leurs coordonnées en utilisant (x, y, largeur, hauteur) :
<?php
array('gradient' => array(0, 37, 760, 121));
?>Vous pouvez spécifier un dégradé vertical de deux couleurs.
<?php
array('fill' => array(
'base' => array(0, 0, 760, 568),
'link' => array(107, 533, 41, 23),
));
?>Vous pouvez spécifier des régions pour chacune des couleurs de la palette. La région sera remplie avec la couleur sélectionnée. Les couleurs disponibles sont ‘base’, ‘link’, ‘top’, bottom’ et ‘text’.
[edit] Tranches de l’image
Ensuite, vous devez définir les zones de l’image de base à découper pour chacune des images. De nouveau, vous spécifiez leurs coordonnées de la forme (x, y, largeur, hauteur) à la suite du nom de fichier de l’image, tel qu’utilisé dans la feuille de style. Les découpes du logo et de la capture d’écran sont spéciaux et ont toujours le même nom de fichier. La capture d’écran sera redimensionnée à 150x90 pixels.
<?php
array('slices' => array(
'images/body.png' => array(0, 37, 1, 280),
'images/bg-bar.png' => array(202, 530, 76, 14),
'images/bg-bar-white.png' => array(202, 506, 76, 14),
'images/bg-tab.png' => array(107, 533, 41, 23),
'images/bg-navigation.png' => array(0, 0, 7, 37),
'images/bg-content-left.png' => array(40, 117, 50, 352),
'images/bg-content-right.png' => array(510, 117, 50, 352),
'images/bg-content.png' => array(299, 117, 7, 200),
'images/bg-navigation-item.png' => array(32, 37, 17, 12),
'images/bg-navigation-item-hover.png' => array(54, 37, 17, 12),
'images/gradient-inner.png' => array(646, 307, 112, 42),
'logo.png' => array(622, 51, 64, 73),
'screenshot.png' => array(0, 37, 400, 240),
));
?>[edit] Fichiers
Pour finir, vous devez définir les emplacements des fichiers pour votre thème. Vous avez besoin d’une image et d’une feuille de style pour l’aperçu ainsi que de l’image de base* :
<?php
array(
'preview_image' => 'color/preview.png',
'preview_css' => 'color/preview.css',
'base_image' => 'color/base.png',
);
?>Le module Color va lire le fichier style.css du thème ainsi que les autres feuilles de styles qui sont importées avec l’instruction @import et créer un nouveau fichier style.css. Il va changer les couleurs dans le fichier css en utilisant une des couleurs de la palette de référence choisie, en fonction du contexte :
* Links : la couleur 'link' est utilisée pour les règles qui s'applique aux éléments a.
* Text : la couleur 'text' est utilisée pour les règles écrites sous la forme color:.
* Base : la couleur 'base' est utilisée pour tout le reste.
Toutefois, si une couleur dans la feuille de style correspond exactement à une des couleurs de référence, le contexte sera ignoré et la couleur de remplacement correspondante utilisée à la place.
Image:Color-shift.png
Par exemple, supposez que votre couleur de référence soit dark blue par défaut, mais vous la changez en red. Votre feuille de style par défaut contient light blue et gray purple, toutes deux relatives à cette couleur de référence.
Les couleurs résultantes (mauve et marron) sont similairement différentes de red tout comme les couleurs originales l’étaient de dark blue. En d’autres termes, la différence relative en teinte, saturation, luminance est préservée.
Si vous vous apercevez que le module Color utilise la mauvaise couleur de référence, essayez de séparer les différents morceaux en règles css séparées, chacune dans son propre sélecteur { … }, de telle sorte qu’il ne puisse y avoir de confusion de contexte possible.
Notez que si vous éditez votre feuille de style après avoir changé de jeu de couleur, vous devez de nouveau soumettre votre jeu de couleur pour régénérer la nouvelle version des couleurs relatives.
Si vous souhaitez préserver certaines couleurs dans votre feuille de style, vous devez placer leur règle CSS sous le marqueur suivant :
/*******************************************************************
* Color Module : Don’t touch *
*******************************************************************/
Vous ne pouvez utiliser ce marqueur qu’une seule fois dans votre fichier style.css. Il s’applique globalement, donc si vous l’utilisez à l’intérieur d’une feuille de style importée, toutes les couleurs situées sous l’instruction @import de cette feuille de style seront également préservées.
[edit] Faire correspondre les couleurs
Il est important que les images générées correspondent aux couleurs relatives de la feuille de style générée. Sinon des arrêtes moches peuvent apparaître.
Pour que cela fonctionne, les pixels de l’image de base doivent être de couleur unie dans les zones qui doivent correspondre avec les couleurs définies par la feuille de style. Parce que les zones où apparaissent ces couleurs dans l’image de base ne sont pas connues, une couleur de fondue qui doit être la même pour tout le design est utilisée. Garland utilise le blanc. Notez que l’image de base de Garland inclut des pixels gris et noirs, mais seulement dans les zones où des images sont utilisées comme fonds (par exemple l’entête). Autres que le blanc, le gris et le noir sont aussi de bons candidats.
<?php
array('blend_target' => '#ffffff');
?>Les masochistes peuvent jeter un coup d’œil aux entrailles du module Color, tout particulièrement à la fonction _color_shift() si vous êtes intéréssés par le pourquoi et le comment de ceci.
Finalement, vous devez faire appel au module Color dans votre thème. Pour l’exemple, un thème basé sur le moteur PHPTemplate est utilisé, mais cela s’applique également aux autres moteurs.
Dans votre fichier template.php, ajoutez le code suivant (pour Drupal 6.x) :
<?php
/**
* Override or insert PHPTemplate variables into the templates.
*/
function phptemplate_preprocess_page(&$vars) {
// Hook into color.module
if (module_exists('color')) {
_color_page_alter($vars);
}
}
?>Dans Drupal 5.x, vous aurez besoin de ce code :
<?php
/**
* Override or insert PHPTemplate variables into the templates.
*/
function _phptemplate_variables($hook, $vars) {
if ($hook == 'page') {
// Hook into color.module
if (module_exists('color')) {
_color_page_alter($vars);
}
return $vars;
}
return array();
}
?>Cela va autoriser le module à surcharger le logo, la feuille de style et la capture d’écran de votre thème. Si vous effectuez d’autres changements dans _phptemplate_variables, vous devrez les inclure dans ce code.
[edit] Personnaliser la page de maintenance
La page de maintenance est utilisée quand le site est mis en mode hors ligne. Vous pouvez activer ce mode dans Administrer > Configuration du site > Maintenance du site. Ce mode va également entrainer des échecs d’accès à la base de données. Par défaut, le thème du noyau Minnelli est utilisé dans ce mode même si un autre thème est sélectionné. Pour utiliser votre thème pour la page de maintenance, cela doit être indiqué dans votre fichier « settings.php » situé soit dans « sites/default » ou dans « sites/votre.domaine.com ».
Dans ce fichier, activez le par la variable $conf avec le nom interne de votre thème :
<?php
$conf['maintenance_theme'] = 'nomDuTheme';
?>Ensuite, copiez votre fichier principal « page.tpl.php » et renommez le « maitenance-page.tpl.php » ou copiez le modèle situé dans « modules/system/maintenance-page.tpl.php » dans le répertoire de votre thème et éditez-le de façon à ce qu’il s’accorde à votre site. Vérifiez les changements en mettant votre site en mode hors ligne puis déconnectez-vous.
Pour traiter les erreurs d’accès à la base de données, essayez de désactiver votre base. Tout appel à une fonction qui dépend de la base de données devrait d’abord vérifier qu’elle soit active avec db_is_active. La variable db_is_active peut être utilisée par le modèle.
Pour empêcher les alertes à propos de la connexion à la base de données d’apparaître, vous pouvez également placer un fichier modèle nommé « maintenance-page-offline.tpl.php » et changer la variable $content avec votre message personnalisé. Ce modèle de fichier étant un modèle suggéré basé sur « maintenance-page-offline.tpl.php », les deux doivent exister.
Une feuille de style « maintenance.css » est incluse dans ce mode. Elle est située dans « modules/system/maintenance.css ». Vous pouvez surcharger ce fichier avec les instructions fournies dans la section feuilles de styles.
Notes :
* L'installation et la mise à jour de votre site dépend des thèmes du noyau, Minnelli et Garland. Cela ne peut être changé pour ces modes.
* Le theme registry n'est pas mis en cache lorsque le mode hors ligne est activé.
[edit] Régler les problèmes de votre thème
Malgré tous les efforts que vous consacrerez à construire votre site, la chose la plus importante pour vos utilisateurs est l’aspect de votre site. Gérer les incohérences dans votre thème pour chaque navigateur, chaque module, et pour les thèmes sélectionnables par vos utilisateurs peut être un véritable challenge.
Premièrement vous devez vous familiariser avec les concepts basiques des feuilles de styles en cascade (CSS). Parcourez CSS Discuss ou HTML Dog pour des ressources CSS. Un bon aperçu de la puissance de CSS peut être vu sur le site CSS Zen Garden.
[edit] Validez ! Toujours. Validation XHTML 1.0 Strict.
Vous ne pouvez être sûr en aucune façon de ce qu’un certain navigateur ferait dans certaines situations imprévisibles. Ce qui cause des incohérences. Mais ajouter votre couche à ces incertitudes rend les choses plus difficiles, voire impossibles pour que d’autres vous aident. Ce n’est qu’une fois que vous aurez un code XHTML et CSS valide et que si cela à l’air bon dans des navigateurs respectueux des normes que vous pourrez commencer à debugguer. Trop souvent on entend des designers dire « Mais, si je le rend valide, ça ne rend pas terrible, je ne veux pas tout recommencer à zéro une nouvelle fois ». Dans ce cas, le fait que le designer avait une mise en page correcte était due à un bug ! Débugguer par dessus des bugs n’est simplement pas la bonne option !
Et vraiment : une mise en page propre, valide fonctionnera 90% du temps, aura 9% du temps des corrections faciles à faire et ne requerra des interventions difficiles que 1% du temps. Vraiment !
Si vous souhaitez valider votre site entier vous pouvez utiliser un de ces outils.
[edit] Votre page ne devrait pas s’afficher partout de la même façon
Une autre chose très importante à noter est la nature de HTML et CSS. Ils sont conçus pour s’afficher différemment dans différents endroits. Mon téléphone mobile n’est pas capable d’afficher votre mise en page fantaisiste de 6 colonnes à largeur fixe avec javascript. Et il ne devrait pas l’être. Safari et Konqueror ont décidé de ne pas autoriser certains styles dans les formulaires (pour des raisons de sécurité et d’homogénéité du bureau). Les écrans larges vont redimensionner votre police ce qui peut casser votre mise en page fixe. Des personnes utilisant de vieux écrans auront des tailles de polices définies plus grandes. Des personnes avec de mauvaises connexions désactivent souvent l’affichage des images, ou même les CSS.
Donc gardez à l’esprit que votre style n’est ni plus ni moins qu’un conseil à l’intention les navigateurs pour afficher votre page d’une certaine manière. Ce n’est en aucun cas une loi.
[edit] Les outils pour gérer les incohérences dans votre thème
[edit] Compatibilité multi navigateurs (FireFox, Internet Explorer, Opera, Safari)
Il est difficile de vérifier ses thèmes dans tous les navigateurs. Il y a un certain nombre d’outils qui sont disponibles pour vous aider à voir votre thème dans de nombreux navigateurs.
Sur Windows vous pouvez utiliser Internet Explorer et télécharger Firefox ou Opéra. Sur Linux vous pouvez utiliser Konqueror, un navigateur basé sur KHTML que Safari utilise sur MacOS, Opera, Firefox pour Linux, et Internet Explorer peut être lancé sous WINE. Sur Mac OSX vous pouvez utiliser Safari et télécharger Firefox ou Opera.
[edit] Problèmes graphiques et de couleurs
[edit] Choisir un thème de base
Si vous cherchez un thème pour démarrer, Zen ou Foundation sont de bons thèmes de base pour une personnalisation par CSS. Il y a aussi BlueMarine qui utilise des tableaux pour la mise en page.
[edit] CSS spécifiques aux modules
Certains modules pour Drupal sont fournis avec un fichier CSS par défaut. Vous devriez utiliser un outil tel que la barre d’outil du développeur web pour voir si la feuille de style d’un module style vos éléments et cause problème. Quand vous installez un nouveau module vous pouvez également regarder dans le répertoire d’un module s’il inclut un fichier CSS.
[edit] Débogguer réellement les problèmes dans votre style
Il n’y a pas de solution facile pour débogguer votre thème. Si vous avez du mal vous devriez essayer d’utiliser un thème de base le plus simple possible ou sélectionner un thème connu pour fonctionner et qui soit le plus proche possible de votre but. Apprendre les classes CSS de votre thème est critique pour comprendre comment les changements dans votre fichier CSS vont être appliqués. Essayez de trouver d’autres « themers » en discutant sur IRC, fournissant de la documentation et des tutorials sur ce qu’ils ont fait. Rendez vos thèmes disponibles afin que d’autres puissent l’évaluer et vous faire par de leurs réactions sur ce que vous avez fait. Se faire des amis avec des programmeurs PHP qui peuvent vous aider à comprendre ce que fait le moteur de thème PHP sous-jacent est également très important. Considérez un échange de compétences pour obtenir du soutien.
Traduction de la page écrite par Kieran Lal, et Trae McCombs de CivicSpace Labs avec Theodore Serbinski. Si vous souhaitez contribuer ou aider à rendre le theming dans Drupal plus facile, rejoignez la themes mailing list ou contactez Kieran.
[edit] Convention de codage pour les thèmes
Les auteurs de thèmes devraient prendre soin à écrire du code propre, bien structuré à l’instar d’un codeur pour n’importe quel autre projet. En faisant cela, le code devient plus facile à lire, comprendre et maintenir. Alors que différentes organisations ont différentes conventions, il est habituellement mieux de suivre les standards de Drupal puisque cela aide à la collaboration ou pou demander de l’aide.
* Utilisez 2 espaces pour l'indentation; en lieu et place de l'indentation par tabulation
* Faites correspondre l'indentation des balises ouvrantes et fermantes de longs blocs HTML
* Faites la distinction entre indentation PHP et HTML.
Ne pas faire :
…
<?php
if ($header):
?><?php
print $header;
?>
<?php
endif;
?>…
mais plutôt :
…
<?php
if ($header):
?><?php
print $header;
?>
<?php
endif;
?>…
Cela facilite la recherche des balises ouvrantes et fermantes correspondantes définies avec différentes indentations.
* Préférez du code PHP dans du HTML plutôt que du HTML dans du PHP à l'intérieur de vos modèles. Par exemple,
pas cela :
<?php
if (!$page) {
print "<h2><a href=\"$node_url\" title=\"$title\">$title</a></h2>";
}
if ($submitted) {
print "<span class=\"submitted\">$submitted</span>";
}
?>mais ceci :
<?php
if (!$page):
?>" rel="nofollow"><?php" title="
print $node_url
?>
<?php
print $title
?>
<?php
print $title
?>
<?php
endif;
?>
<?php
if ($submitted):
?><?php
print $submitted
?><?php
endif;
?>Après tout, PHP est un langage de script incorporé au langage HTML - et non l’inverse.
[edit] Soumettre votre thème sur drupal.org
Pour ajouter votre thème à Drupal.org, il doit être en accord avec la GPL. N’incluez pas d’images ou autres travaux sous copyright que vous ne voulez pas voir réutilisés ou même modifiés.
Les thèmes sont gérés de la même manière que le code, dans le dépôt CVS. Vous devrez faire la demande d’un compte CVS. Une fois approuvée, vous serez en mesure de mettre votre thème dans le dépôt CVS de Drupal. Créez un projet et le téléchargement pour celui-ci sera créé automatiquement.
Si vous ajoutez votre thème, des utilisateurs posteront surement des suggestions, remonteront des bugs, et généralement désireront que vous mainteniez le thème à jour pour les versions actuelles de Drupal.
Lisez également les recommandations pour les captures d’écrans.
Vous pouvez trouver plus d’information sur les procédures pour contribuer au code et thèmes et maintenir un projet sur Drupal.org dans le guide du développeur.
Ceci sera l’emplacement des différentes page du manuel de views.
Le travail de traduction est en cours de relecture et nous sommes actuellement en train de transférer progressivement le contenu sur Drupalfr.
Ce travail est un livrable du groupe Documentation - Traduction. Merci à tous.
Le module "Views" peut paraître complexe quand on le découvre. La bonne nouvelle, c'est que l'interface utilisateur sépare les différentes fonctionnalités. Cela signifie que généralement, nous pouvons ignorer toutes les fonctions dont nous n'avons pas besoin. Le secret de la réussite : commencer par des exemples simples, puis compliquer petit à petit.
A cause de la quantité de paramètres proposés, l'interface de création d'une vue peut paraître déconcertante au premier abord, mais en fait, il y a peu de choses à retenir. Le meilleur conseil : Partez en exploration!
L'image ci-dessous, représente l'interface utilisateur du module Views, avec ses nombreux paramètres.
Remarques:
1) Chaque vue est composée de plusieurs "affichages", chacun indiquant l'endroit où la vue s'affichera. Avec Views 1, vous pouviez configurer une vue pour apparaître sous forme d'une 'page' avec son url (chemin), ou sous la forme d'un bloc affiché dans une région de votre thème. Avec Views 2, vous pouvez créer autant d'affichages que vous voulez. L'affichage par défaut est particulier car il contient le paramètrage de base, mais il n'apparait nulle part.
2) Lorsqu'on clique sur un élément de l'interface, un nouveau formulaire s'ouvre. Pour les plus petites résolutions d'écran, vous devrez peut-être faire défiler votre fenêtre vers le bas pour voir le formulaire. Lorsque qu'un formulaire est affiché, le paramètre édité apparait en surbrillance.
3) Dans un affichage autre que l'affichage par défaut, un changement peut intervenir de deux façons différentes: soit la modification touche tous les affichages de la vue, soit elle ne touche que l'affichage sélectionné.
Lorsque vous créez un nouvel affichage, il commence par hériter de tous les paramètres de l'affichage par défaut. "Supplanter" un paramètre indique que sa mise à jour ne concerne que l'affichage sélectionné. L'interface vous l'indique en mettant les éléments en italique et en couleur plus claire. Si vous changez ces valeurs sans supplanter l'affichage, en "Utilisant la valeur par défaut", vous modifiez cette valeur dans l'affichage sélectionné, dans l'affichage par défaut ainsi que dans tous les affichages qui lui sont liés (non surchargés).
Par exemple, si vous ajoutez un filtre "Node: publié" et que vous le régler sur "oui" dans les paramètres de l'affichage de base (pour récupérer les nodes publiés), vous pourriez dans un autre affichage choisir d'afficher aussi les noeuds non publiés. Pour cela vous sélectionnez "Filtres" dans l'affichage concerné et vous cliquez sur "Supplanter". Vous pouvez désormais ôter le filtre "publié" pour cet affichage, sans affecter les paramètres de l'affichage de base ou les autres affichages non surchargés.
4) Certains éléments ont des paramètres additionnels (particulièrement les éléments de style). Normalement, quand on modifie un style qui a des paramètres supplémentaires, un 2ème formulaire apparaît automatiquement.
5) Vous pouvez quitter l'édition d'une vue en toute sécurité pour faire autre chose. Quand vous revenez dans la vue, elle est toujours présente, sauvegardée dans le cache. Sachez cependant, que dans ce cas la vue sera bloquée, ce qui signifie qu'un autre utilisateur ne pourra pas éditer cette vue sans la déverrouiller. S'il débloque la vue, vos dernières modifications sont alors perdues.
Mieux vaut avoir un plan précis pour se former à l'utilisation du module Views. Voici quelques possibilités.
| Fichier attaché | Taille |
|---|---|
| overview-ui-small.png | 43.84 Ko |
| overview-ui-large.png | 81.86 Ko |
Dans cet exemple, nous allons afficher dans un bloc la liste des noeuds qui sont du type «article». Avec cet exercice, vous allez apprendre, pas à pas, les bases pour créer une vue et ainsi vous familiariser avec l’interface utilisateur du module Views.
Allez à Ajoutez une vue. Donnez à votre nouvelle vue le nom ‘articles_recents’, la description ‘Articles récents’, l’étiquette ‘article’, le type ‘Node’ et cliquez sur Suivant.
Vous voilà maintenant dans l’Interface Utilisateur du module Views. Au démarrage, vous éditez les paramètres par défaut. Mais vous pouvez créer d’autres affichages. Dans la colonne la plus à gauche, vous voyez qu’en plus de l’affichage par défaut, vous pouvez choisir divers types d’affichage dans la liste déroulante comme par exemple le type ‘bloc’ qui vous permet de sélectionner des paramètres spécifiques pour afficher cette vue dans un bloc. Dans les autres colonnes, vous pouvez ajouter ou modifier des paramètres en cliquant sur des liens ou sur des icônes. Ces options apparaitront en détail sous la zone principale et peut-être vous devrez faire défiler votre page pour les voir. Les options modifiées apparaissent en gras jusqu’à ce que la vue soit enregistrée.
Cliquez sur le bouton Enregistrer pour enregistrer votre travail.
Finalement, vous devez indiquer à Drupal qu’il doit afficher ce bloc. Aller dans admin/build/block pour configurer le bloc. Recherchez le bloc qui s’appelle Articles récents dans la liste des blocs désactivés et placez ce bloc dans la région souhaitée (en le glissant déplacant ou en utilisant le menu déroulant). Cliquez sur Enregistrer les blocs pour valider vos modifications. Vous pouvez cliquer sur Configurer pour changer le titre du bloc, spécifier une visibilité par rôle, et spécifier sur quelles pages il apparaitra. Si votre bloc doit s’afficher sur la page d’accueil, entrez ‘<front>’.
Dans cet exemple, vous allez créer un bloc contextuel permettant lors de l’affichage d’un article de blog de lister les titres des billets les plus récents rédigés par le même auteur. Nous allons utiliser les arguments du module Views pour filtrer dynamiquement les billets de blog.
Pour faire cet exercice, activez le module Blog et créez quelques billets de blog avec des utilisateurs différents.
Tout d’abord, nous allons créer une vue de type node car ce bloc affichera les titres des billets de blog (un billet de blog est un node). Dans l’interface de Views, cliquez sur Ajouter, puis entrez les propriétés suivantes et cliquez sur Suivant :
Pour une meilleure compréhension, nous allons créer la vue progressivement, et ainsi vérifier le rendu au fur et à mesure. Dans cette section, nous créerons une simple vue pour afficher les titres des billets de blog.
Les filtres sont très utiles pour limiter les résultats d’une vue quand la condition d’affichage est connue à l’avance (par exemple, si notre but est d’afficher les billets de blog, il faut toujours filtrer par type «entrée de blog»). Mais les filtres ne savent pas prendre de décision basée sur le contexte. Dans notre cas, nous ne voulons pas que l’affichage soit le même si notre utilisateur est un «administrateur» ou un simple «membre». Dans ce cas les filtres ne peuvent pas nous aider.
Nous avons heureusement un autre outil à notre disposition : les arguments. Par le biais des arguments, nous pouvons ajouter un contexte à notre vue (le cas typique est d’ajouter des identifiants dynamiques à l’URL). Au moment de l’affichage, le module Views prend ce contexte en considération.
Ajoutons un argument à notre vue et configurons le de telle sorte que l’affichage change en fonction de l’auteur de la publication.
Ainsi, la prévisualisation nous montre bien ce que nous souhaitons obtenir. Il reste cependant un problème : nous ne pouvons pas afficher notre vue dans un bloc ! Corrigeons cela en créant un nouvel affichage.
Il reste encore quelques petites choses à faire pour que notre vue soit parfaite. Par exemple, nous avions dit que notre bloc devait montrer les derniers billets de blog ; mais elles apparaissent ici dans leur ordre de création, les plus anciennes en haut de liste. De plus, les entrées non publiées sont également affichées.
Dans cet exemple, vous allez créer un affichage Flux qui contient tous les noeuds créés et publiés par un utilisateur donné, sachant que le nom du rédacteur est passé dans l’url. Ainsi, vous vous familiariserez avec l’interface du module Views 2 et vous apprendrez comment utiliser un argument pour récupérer le nom d’un utilisateur et l’envoyer au coeur d’une url créé dynamiquement.
Un flux est un format de données accessible par l’intermédiaire d’un lecteur de flux. Un flux peut inclure tout ou partie du contenu de votre site. Il est stocké sous forme de fichiers qui deviennent dès lors accessibles par les lecteurs de flux. Lorsque vous visitez un site, vous avez peut-être remarqué la petite icône de transmission RSS . En cliquant sur cette icône, vous pouvez vous abonner aux informations les plus récentes de ce site. Cela permet à vos visiteurs de rester au courant des dernières mises à jour de votre site. Vous pouvez aussi utiliser ce format pour aggréger ces informations sur d’autres sites. Pour de plus amples informations, veuillez regarder la vidéo de Common Craft sur le RSS en langage simple.
Remarque : un flux RSS est automatiquement créé par Drupal, pour votre site. Mais vous désirez peut-être créer des flux avec des informations spécifiques. Dans notre exemple, nous voulons mettre à disposition une liste de contenus par rédacteur.
Allez à Ajouter une vue. Donnez à votre nouvelle vue le nom ‘flux-utilisateurs’, la description ‘Flux des noeuds par utilisateur’, l’étiquette ‘utilisateurs’, le type ‘Node’ et cliquez sur Suivant.
Vous êtes arrivé dans l’Interface Utilisateur du module Views. Dans un premier temps, vous éditez les paramètres par défaut. Dans la colonne située à l’extrême gauche, vous voyez qu’en complément de l’affichage par défaut, vous pouvez sélectionner d’autres types d’affichages dans la liste déroulante comme par exemple l’option ‘bloc’ qui vous permet de sélectionner des paramètres spécifiques aux vues s’affichant dans des blocs. Dans les autres colonnes, vous pouvez ajouter ou modifier des options liées à la vue en cliquant sur des liens ou sur des icônes. Ces options sont détaillées sous la zone principale et peuvent nécessiter l’utilisation de l’ascenseur pour y accéder. Les options modifiées apparaissent en gras jusqu’à ce que la vue soit enregistrée.
.
.
Dans cet exemple, vous allez créer une vue qui liste les utilisateurs de votre site. Avec cet exercice, vous allez apprendre, pas à pas, les bases pour créer une vue et ainsi vous familiariser avec l’interface utilisateur du module Views.
Aller à Ajouter une vue. Donner à votre nouvelle vue le nom ‘liste_utilisateurs’, la description ‘Une simple liste des utilisateurs’, l’ étiquette ‘utilisateurs’, le type ‘Utilisateur’ et cliquer sur Suivant.
Vous êtes arrivé dans l’Interface Utilisateur du module Views. Au démarrage, vous éditez les paramètres par défaut. Mais vous pouvez créer d’autres affichages. Dans la colonne tout à gauche, vous voyez qu’en plus de l’affichage par défaut, vous pouvez choisir divers types d’affichage dans la liste déroulante comme par exemple le type ‘bloc’ qui vous permet de sélectionner des paramètres spécifiques pour afficher cette vue dans un bloc. Dans les autres colonnes, vous pouvez ajouter ou modifier des paramètres en cliquant sur des liens ou sur des icônes. Ces options apparaitront en détail sous la zone principale et peut-être vous devrez faire défiler votre page pour les voir. Les options modifiées apparaissent en gras jusqu’à ce que la vue soit enregistrée.
A ce stade, vous avez suffisamment d’éléments pour créer une vue correcte. En descendant plus bas dans la page, vous pouvez vérifier le résultat avec un aperçu de votre vue. Si elle n’est pas visible, cliquez sur le bouton Aperçu. Notez que l’aperçu se mets à jour automatiquement lorsque vous modifiez la valeur d’un des paramètres de la vue.
Pour terminer, cliquez sur le bouton Enregistrer pour sauvegarder votre travail. En haut de la page, cliquez sur Voir «Page» pour découvrir votre toute nouvelle vue !
Remarque 1 : Dans cet exemple, nous avons directement créé l’affichage page, et à chaque mise à jour, nous avons cliqué sur le bouton «Mettre à jour la valeur par défaut». Cela veut dire que nous avons créé notre affichage par défaut en même temps que l’affichage page. Plus classiquement, on crée l’affichage par défaut puis les autres affichages, mais la façon de procéder ici a été simplifiée.
Remarque 2 : Nous avons introduit ici la notion d’arguments mais nous nous en sommes servis d’une manière peu visible. Comme aucun argument n’a été passé à la vue, l’affichage du récapitulatif en ordre ascendant par rôle a été activé.
Views 2 est la plus récente version majeure de Views. Elle a été spécialement conçue pour Drupal 6. Views 2 conserve toutes les fonctionnalités cardinales de Views 1, mais avec une interface utilisateur complètement réorganisée et un grand nombre de nouveautés qui étendent largement le jeu des fonctionnalités originelles de Views 1. Ce document est une comparaison point par point de Views 1 et Views 2 du point de vue de l'utilisateur. Il présente les modifications de l'UI (interface utilisateur), les nouvelles façons d'effectuer les anciennes opérations, les nouveautés les plus attrayantes de Views 2 et comment elles corrigent certains défauts de Views 1.
Après avoir installé Views 2, vous remarquerez tout d'abord que l'interface d'administration a été complètement modifiée :
Comparée à l'ancienne interface de Views 1 :
La nouvelle interface d'administration effectue les mêmes tâches que l'ancienne -- cataloguer toutes les vues du système, fournir des liens pour ajouter, importer des vues et accéder aux outils (Views Tools) -- mais avec une présentation plus condensée ; ainsi chaque vue est affichée sur une ligne comme un paragraphe au lieu de l'être sous la forme d'une ligne de tableau comme dans Views 1. En haut de page, un jeu de filtres a été ajouté pour faciliter la localisation des vues lorsque leur nombre devient important.
On peut accéder à l'aide contextuelle en cliquant sur la petite icône bleue représentant un point d'interrogation. Dans Views 2, l'aide contextuelle est rendue disponible par le module Advanced Help (Aide avancée), aussi pensez à installer ce module en même temps que Views 2. La petite icone d'aide bleue est disponible à différents endroits de l'interface graphique de Views 2. En particulier, vous remarquerez sa présence à côté de la description d'un affichage (display), et dans différentes parties de l'éditeur comme les chemins, les menus et ainsi de suite.
Exemple des nouveaux attributs disponibles pour les vues sont visibles dans les filtres d'entête :
Bon, sautons le pas et ajoutons une vue. Pour cet exemple, nous avons créé une vue utilisateur destinée à afficher une liste d'utilisateurs.
La première étape de l'ajout d'une vue consiste simplement à indiquer un nom (seulement des caractères alphanumériques, pas d'espaces), une description, une ou plusieurs étiquettes, et un type de vue.
La configuration de la vue est le deuxième élement dont l'interface a été complètement revue depuis Views 1. Le meilleur moyen de résumer cela est de dire que toutes les parties de l'interface de Views 1 sont toujours présentes... mais à des emplacements différents. Champs, arguments, critères de tri ou flitres, ils sont tous là, mais agrémentés d'un zeste d'Ajax.
Commençons par ajouter quelques champs :
Cliquer sur l'icone [+] située juste après le mot « Champs » fait apparaitre une section située sous les informations de la vue avec tous les champs disponibles. Ils sont groupés par Commentaire, Champ, Node, Révision, Taxonomie et Utilisateur, et probablement quelques autres. C'est un principe de fonctionnement général à l'interface de Views 2 -- cliquer sur un widget ou un lien fait apparaitre, sous les informations de la vue, une section affichant l'interface appropriée.
Lors de l'ajout d'éléments, vous pouvez utiliser le menu déroulant « Groupes » pour n'afficher que la partie des champs disponibles concernée par le goupe sélectionné. Vous pouvez aussi sélectionner « <Tout> » (<All>), qui correspond à l'affichage par défaut lorsque la section apparait. Dans notre exemple, nous sélectionnons le groupe « Utilisateur » et nous ajoutons les champs : Utilisateur : Adresse électronique, Utilisateur : Nom et Utilisateur : Portrait.
Lorsque les champs ont été ajoutés, il apparaissent dans la section « Champs » de l'interface. Chacun des champs ajoutés va être passé en revue successivement. Nous cliquons alors simplement sur Mise à jour, même si nous n'avons effectué aucune modification, et le champ suivant s'affiche à son tour.
Les champs que nous avons ajoutés peuvent être réordonnés en cliquant sur l'icone affichant deux petites flèches, l'une ascendante et l'autre descendante, située à la droite de l'icone utilisée précédemment. Nous pouvons aussi retirer un champ en utilisant la même interface.
A partir de là, vous pouvez glisser les champs vers le haut ou vers le bas en utilisant la petite croix flèchée et en la déplacant comme bon vous semble. Effectuer une modification de n'importe quelle partie de la vue en cliquant sur « Mise à jour » provoque habituellement un rafraichissement de la prévisualisation. Celle-ci est commodément située juste en dessous de l'interface principale.
Maintenant que nous avons configuré quelques champs, nous pouvons porter notre attention aux réglages de base de la vue.
Il est important de remarquer que tous les élements de l'interface dépendent de l'affichage (display) actuellement sélectionné pour la vue. Comme indiqué plus haut, une vue peut avoir de multiples affichages. Juste après avoir créé une vue, le seul affichage disponible est l'affichage par défaut (Defaults). Vous pouvez ajouter de nouveaux affichages en utilisant le bouton « Nouvel affichage », chacun d'eux a une configuration de base complètement différente de celle des autres ; cela vous permet d'avoir autant d'affichages de la vue que vous voulez. Tous ont en commun des éléments comme Critères de tri, Filtres et Arguments mais chacun d'eux a des configurations d'affichage différentes tels que les paramètres Titre, Style, Champs, et Pagination. De plus, chaque affichage que vous ajoutez hérite automatiquement des paramètres de l'affichage par défaut ; vous pouvez donc configurer un noyau de paramètres communs dans l'affichage par défaut et ajouter les paramètres additionnels pour chacun des autres affichages.
Restons fidèles à l'affichage par défaut et modifions quelques réglages. Nous pouvons configurer le Titre en « Vue 1 d'utilisateurs » et le Style en Tableau. Comme indiqué plus haut, les styles de vues dans Viws 2 correspondent plutôt aux types de vues de Views 1.
Dans views 2, les styles de vue définissent la façon dont un affichage de vue apparait. Ces styles sont notablement différents des types dans Views 1 ; en particulier, les types ont été « cassés » ; dorénavant,; le style tout comme le style de ligne s'occupent de parties différentes du rendu.
Nous modifions le style en cliquant sur le style courant situé sur la partie gauche de la zone d'information de la vue.
Les options de style disponibles sont Grille, Liste HTML, Tableau et Non mis en forme. Des styles d'affichage supplémentaires peuvent être ajoutés par des modules disposant de plugins de style pour Views. Choisir un style fait apparaitre un bouton « Paramètres » que vous pouvez cliquer pour configurer le style que vous avez choisi. Dans l'aperçu ci-dessous, nous avons sélectionné et configuré le style Table, qui est utilisé pour produire un rendu plus compact que le précédent.
Le module «Views» permet aux administrateurs et aux créateurs de sites de créer, gérer et afficher des listes de contenu. Chaque liste gérée par le module «Views» est appellée «vue» (view) et son résultat est appelé un affichage (display). Les affichages peuvent être de type bloc ou page, et chaque vue peut avoir plusieurs affichages. Des aides à la navigation, comme le chemin système et un élément de menu peuvent être définis par les affichages de type page. Par défaut, on peut créer des vues pour lister des noeuds (vue de type Node), des révisions de contenu (vue de type Révision du nœud) ou des utilisateurs (vue de type Utilisateur). On peut restreindre l’accès à une vue à des rôles spécifiques.
On ajoute, supprime ou modifie une vue via la page d’administration de Views
Le design du système de Views est puissant et flexible, permettant de spécifier des paramêtres seulement si on en a besoin. Alors qu’une vue avancée peut nécessiter d’utiliser tous les paramêtres pour créer des applications complexes ayant un taux d’interactivité élevé, une simple liste peut être créée avec très peu d’options.
Toutes les vues se basent sur un cadre conceptuel (conceptual framework) qui inclus :
Les champs sont les données qui sont affichées. En ajoutant par exemple Node : Titre, Node : Type, et Node : Date de publication à une vue de type noeud, on obtient le titre, le type de contenu et la date de publication dans les résultats affichés.
Les champs peuvent ne pas apparaître sur tous les affichages, parce que certains plugins n’utilisent pas les champs. Par exemple le plugin de «style de ligne» «Node» affiche le noeud dans sa totalité grâce aux mécanismes habituels de Drupal et n’utilise pas les champs.
En règle générale, le paramétrage des champs devrait pouvoir se passer d’explication. Les champs apparaitront dans l’ordre dans lequel ils ont été disposés avec l’étiquette qui leur a été donnée.
Les relations permettent d’étendre la requête pour inclure des objets qui ne sont pas dans la requête de base. Ce qui rend ce concept un peu difficile à comprendre, c’est que Views utilise déjà quelques relations par défaut, mais sans les afficher. Pour des raisons historiques, il serait maintenant difficile de retirer ces relations par défaut.
Quand des relations sont définies, tous les champs, (y compris les relations elles-mêmes) héritent d’un nouveau paramètre permettant de sélectionner quelle relation ils utilisent. Par défaut ils n’en utilisent pas.
L’exemple typique de la relation qui est disponible par défaut mais qui n’est pas montrée, est celle qui lie le noeud à son auteur via la relation node - utilisateur. Si un noeud est dans une requête, l’utilisateur qui a créé ce noeud est automatiquement accessible dans la vue. [Il est à noter que l’auteur de Views considère que c’est une erreur d’avoir rendu cette relation automatique, mais quand il s’est rendu compte de son erreur, il était déjà trop tard pour la corriger].
Une relation similaire, mais qui elle n’est pas automatique est la révision de noeud. Chaque révision a un auteur, à savoir l’utilisateur qui l’a créée. En ajoutant la relation «Révision du nœud : Utilisateur», tous les champs, critères de tri, filtres et arguments liés à l’utilisateur auteur de la révision deviennent disponibles.
Quand une relation est ajoutée à une vue, tous les champs concernés disposent d’une liste déroulante permettant de sélectionner la relation adéquate. Parmi les options proposées, vous avez la possibilité de choisir «Ne pas utiliser de relation» (défaut). Voici un exemple avec une vue de type commentaire, qui par défaut ne propose aucun champ appartenant au groupe «Node», ni au groupe «Utilisateur» :
Une vue de type commentaire propose les relations «Commentaire : node» et «Commentaire : utilisateur». En sélectionnant «Commentaire : node», tous les champs du noeud auquel le commentaire est attaché sont disponibles. De plus tous les champs utilisateur liés à l’auteur de ce noeud sont également disponibles (via la relation cachée d’un noeud à son auteur). En sélectionnant «Commentaire : utilisateur», vous accédez aux champs liés à l’auteur du commentaire — qui le plus souvent n’est pas l’auteur du noeud !
Dans cet exemple, si vous ajoutez le champ «Utilisateur : nom», l’interface vous propose alors le choix entre une relation de type «Node» ou une relation de type «Utilisateur». La relation «Node» permet comme vu précédemment d’accéder au nom de l’auteur du noeud, alors que relation «Utilisateur» vous permet d’accéder au nom de l’auteur du commentaire. L’une des deux relations doit obligatoirement être choisie pour permettre à Views de choisir quel utilisateur afficher.
La table «files», créée par le module «Upload», illustre un autre exemple de relations. Dans Drupal, les fichiers sont liés aux utilisateurs, mais pas toujours à des noeuds. Cependant, le module «upload» permet aux fichiers d’être attachés à des noeuds via la table «upload». Ceci permet à Views, en partant d’une vue ‘Node’, de proposer le champ ‘fichier attaché’. Mais dans l’autre sens, en partant d’une vue ‘File’, il faut créer une relation via la table «upload» pour extraire les informations au sujet du noeud.
Les arguments sont envoyés à la vue. Ils sont souvent transmis à travers l'URL, mais pas toujours (ne soyez donc pas étonnés quand ce n'est pas le cas). Chaque affichage a sa propre source d'arguments. Les affichages de type "bloc" n'ont aucune source d'argument: ils ne peuvent pas extraire les arguments de l'url et ont souvent besoin d'utiliser du code PHP pour recevoir des arguments. L'argument par défaut peut être utilisé pour envoyer des arguments à une vue "bloc. Voir "Fournir l'argument par défaut" ci dessous.
En général, les arguments sont utilisés pour filtrer les résultats de la vue et en ce sens ils sont très similaires aux filtres. Mais cela n'est pas forcément le cas pour tous les arguments. Les arguments peuvent être utilisés pour toutes sortes de raisons, ce que fait l'argument dépends vraiment de ce que le développeur de l'argument à prévu. Toutefois, les arguments qui sont inclus dans views sont presques tous des filtres.
Une utilisation classique d'un argument consiste a réduire le résultat de la vue à un seul noeud, un seul utilisateur ou terme de taxonomie.
Tous les arguments ont un "joker" qui indique à la vue d'utiliser toutes les valeurs. En pratique, cela revient au même que l'option "afficher toutes les valeurs". L'argument est ignoré et la vue est créée sans argument. Le joker est utilisé dans le titre de la page et dans le fil d'Ariane.
Le choix de l'argument par défaut n'est accessible que si l'action "quand aucun argument n'est fourni" vaut "fournir l'argument par défaut". Dans ce cas, une nouvelle série d'options apparait pour choisir l'argument par défaut. Voici la selection d'arguments possible avec Views (notez que d'autres modules peuvent en ajouter d'autres) :
Gardez en mémoire que la sélection d'un argument par défaut n'aura lieu que si aucun argument n'est fourni. Si vous utilisez un affichage qui n'a pas de source d'argument, comme un bloc, ce sera 100% des cas, mais si vous utilisez un affichage qui extraie les parametres de l'URL, cela n'arrive que dans le cas ou l'url ne contient pas d'argument.
Les arguments peuvent avoir des validateurs qui sont des plugins qui vérifient que les arguments valident une liste de paramêtres. Quand un validateur est sélectionné, il peut proposer des paramêtres, incluant l'action à entreprendre lorsque un argument est présent mais que la validation échoue. Ces actions sont généralement les mêmes que les actions par défaut situées plus haut, excluant la possibilité de fournir une autre valeur par défaut.
Si une vue a une option de menu, comme un onglet, et que l'argument ne passe pas la validation, l'onglet n'apparaitra pas.
Ce système permet d'avoir d'autres validateurs sous forme de plugin, mais par défaut, Views fournit :
Les filtres sont utilisés pour restreindre les résultats retournés par une vue. En clair, si vous ne mettez aucun filtre, la vue retournera l’intégralité des contenus. Ce n’est probablement pas votre but, c’est pourquoi vous avez besoin de filtres.
Voici des filtres fréquemment utilisés :
La liste ci dessus n’est qu’une infime fraction des filtres disponibles dans Views. Elle est destinée à vous donner un ordre d’idée des possibilités offertes par les filtres.
Lorsque l’on crée une vue il est possible de créer différents affichages (défaut, page ou encore bloc) mais il n’est pas possible d’intégrer votre vue dans une page à un endroit spécifique. Pour cela il existe des modules comme insert_views qui permettent d’insérer une vue dans une page en ajoutant une simple ligne de code. Le problème est qu’il faut faire attention à chaque fois que vous éditez votre page que votre vue fonctionne toujours surtout si vous utilisez un éditeur Wisywig. Il existe sinon une autre solution, qui consiste à intégrer votre vue en Php.
Je passe la partie création du module, mais pour réaliser ce qui suit il vous faut l’avoir crée.
Nous allons utiliser la fonction views_embed_views($name, $display_id = ‘default’) qui n’a besoin que d’un seul paramètre (nom de la vue) pour fonctionner.
<?php
$viewname = 'MY_VIEW_NAME' ;
print views_embed_view ( $viewname );
?>Le code ci-dessus nous permet d’afficher la vue portant le nom MY_VIEW_NAME
En lisant la fonction views_embed_views on s’apercoit que celle-ci autorise un deuxième paramètre ($display_id) qui gère l’affichage (exemple : default, page, block, etc) et va nous permettre de choisir le format de sortie. Bien souvent, lorsque l’on crée une vue c’est pour afficher des résultats variables selon un paramètre comme une liste en fonction d’un terme de taxonomie. Ainsi pour passer un argument à notre vue nous allons ajouter un troisième paramètre à notre fonction.
<?php
$viewname = 'liste_des_cours';
$display = 'page';
$view_arg = 'economie';
print views_embed_view ($viewname, $display , $view_arg);
?>Il ne vous reste plus qu’à choisir ou intégrer cette vue.
Ce que nous venons de voir est facile à mettre en place pour afficher le contenu d’une vue, mais cela ne nous laisse que très peu de contrôle sur notre vue. Par exemple views_embed_views n’affichera pas le titre que vous aurez saisi dans votre vue.
Pour aller plus loin nous allons utiliser la fonction views_get_views($name, $reset = FALSE) qui va nous permettre d’accéder à plus d’information.
<?php
$viewname = 'liste_des_cours';
$display = 'page';
$view_arg = 'economie';
// Chargement de notre vue
$view = views_get_view ($viewname);
// On ajoute des paramètres à notre vue
$view->display_handler->set_option('items_per_pages', 4);
$view->display_handler->set_option('offset', 0);
//Exécution de le vue
$view_content = $view->execute_display($display, $view_arg);
//Récupération du titre de notre vue
$view_title = $view->get_title();
?>Comme toujours il existe pas mal de fonctions et de possibilités pour générer une vue, dans la majorité des cas la première solution est la plus utilisée.
Ceux qui ont suivi le lancement du projet Open atrium ( http://openatrium.com/ , un distribution drupal pour créer un intranet) auront sans doute entendu parler du trio de modules context, spaces et surtout features; autour desquels est structuré ce projet.
Il existe encore peu de documentation à ce sujet, voici donc un bref aperçu permettant de saisir dans les grandes lignes l'intéret, et le potentiel énorme de ces modules. Notons tout de même avant toute chose que le module features est plutôt destiné aux professionnels de Drupal.
Voir aussi :
La pierre angulaire d'open atrium est le module features, qui tente d'accomplir deux nobles objectifs : - faciliter le déploiement de projet drupal (réutilisabilité / transportabilité accrues) - faciliter le "staging" ("comment que je mets mon site en ligne à jour sans écraser la base de données et donc perdre le contenu rentré entre temps par mes visiteurs ??" )
En dehors de ces deux objectifs fort louables, on peut se risquer à dire qu'en plus, le paradigme proposé par features n'est pas sans élégance, mais nous y reviendrons.
Features peut être considéré comme une "couche supplémentaire" de Drupal. Jusqu'ici on pourrait théoriser (à la hache) Drupal comme étant constitué en 3 niveaux principaux.
A partir de là, il est intéressant de noter que plus le temps passe, et plus drupal tends à nous fournir des modules qui ne sont que des petites briques, qui combinées à d'autres petites briques, permettent de reconstruire soi-même une macro-fonctionnalité / un besoin utilisateur. Par macro-fonctionnalité, j'entends par exemple : un gestionnaire de tâches, un blog, un forum ...
Par exemple les champs CCK, le module views, le module node reference sont des modules qui ne fournissent aucune fonctionnalité en eux même, en revanche ils vous permettent de créer , avec de l'huile de coude tout de même, un systeme multiblog, un gestionnaire de taches ... bref ce sont des legos techniques à la disposition de votre imagination délirante de drupalien fou. C'est d'ailleurs pour cela que drupal, plus qu'un CMS, est un CMF (content management framework).
Mais une fois toutes les vues, champs cck , blocs etc... crées pour notre macrofonctionnalité qui tue la mort, se pose une question terrible s'il en est : et si je veux refaire cette fonctionnalité sur un autre site ensuite ? il faut refaire toutes les vues, tous les champs CCK, que je replace tous mes blocs un par un ? Votre pomme d'adam s'étreint d'émotion à l'évocation de cette hypothese peu ragoutante.
Halte là ! features vous propose une solution : "enregistrer" et capturer, en quelques clics toute votre travail de configuration dans un module. Il vous suffira ensuite d'installer votre module sur une install vierge de drupal et ô joie ! toutes vos vues , vos champs CCK, vos blocs, vos presets imagecache se recréent tous seuls comme par magie. Features vous permet de "packager" vos configurations puis de les importer sur un autre site. Plus que ça, features fait de son mieux pour que votre configuration puisse en plus vivre "dans le code" uniquement, c'est à dire que votre vue peut parfaitement être utilisable en étant bien au chaud dans un hook, dans le code de votre module. Il n'est pas nécessaire qu'elle soit enregistrée dans une BDD. On retrouve donc doucement l'idée que la base de données doit servir à enregistrer le contenu de l'utilisateur tandis que la configuration reste dans le code.
Le module Features se propose donc d'ajouter un nouveau niveau à Drupal, qui ressemble alors à ceci :
En combinant différents modules, on peut obtenir une fonctionnalité précise que l'on peut packager dans une features. Hélas, la portée de features reste encore relativement limité sur Drupal 6, la liste des modules compatibles étant plutôt restreinte : views, cck, context, panels, imagecache, menu, les droits d'accès (j'en oublie sans doute deux ou trois)
Néanmoins ne jetons pas le bébé avec l'eau du bain : si features est loin d'être la solution idéale, c'est aussi une des solutions les plus prometteuses et élégante de ce côté. De plus, malgré le nombre de module assez restreint supporté, cela reste toutefois suffisant pour construire de très jolies features. Open atrium reste une bonne démonstration des possibilités de ce paradigme. Enfin, il ne faut pas oublier qu'il est tout à faire possible de rajouter du code php dans une features puisqu'il s'agit d'un module comme un autre, si ce n'est que son fichier .info contient des informations permettant d'importer automatiquement des vues, des champs CKK etc...
La notion d'espace est liée à celle de feature : une feature peut être activée, désactivée pour un espace particulier : ainsi si vous utilisez organic groups + spaces, vous pouvez proposer à chaque groupe d'activer ou de désactiver des features selon leur besoins, et cela indépendamment des autres types de groupe. Open atrium fonctionne principalement avec des espaces pour les organic groups et apparemment pour les profils (user-spaces).
Physiquement, la notion d'espace est en fait liée au module "purl" qui permet d'ajouter un préfixe à vos url. Ce préfix permet de déclencher l'espace et tous les paramètres de context ou des vues qui peuvent être sensibles aux espaces.
Exemple : avec user-space, l'url de votre compte devient "space-votrepseudo/user".
La notion d'espace est toute indiquée pour la gestion d'un intranet en particulier et a probablement été spécifiquement conçue pour ce besoin particulier, mais on peut imaginer bien d'autres applications, d'autant que spaces 3 promet (encore) une petite révolution conceptuelle.
Context est un module permettant de facilement regrouper des éléments de configuration d'une feature. Exemple concret : si vous voulez faire une feature de blog, vous souhaitez que fasse partie de votre feature :
Qui n'a jamais révé d'expliquer par exemple simplement à Drupal que la vue listant vos types de contenu news fait partie de la même section du site que vos node news ? Et qu'il est en conséquence logique que votre item de menu "news" soit en surbillance quand vous vous trouvez sur la page de liste de news ? C'est typiquement ce genre de problématique à laquelle s'attaque context.
Context est un module permettant de centraliser et d'exporter tous ces paramètres de configuration et donc devient un élément clef pour composer votre feature. En général, pour composer votre feature vous avez besoin d'un contexte permettant de choisir quel blocs et vue font partie de votre feature, comment ils sont positionnés (plus d'autres paramètres intéressants proposés par context). Nulle obligation de passer par contexte, mais cela facilite la construction de votre feature.
Vous pouvez ensuite exporter dans la feature (en créant la feature dans le menu feature) en prime bien d'autres choses intéressantes comme un type de contenu, des champs CCK, un élément de menu, une permission utilisateur etc...
Vous venez de changer une vue en local et vous souhaitez voir le résultat sur votre serveur de production ? si votre vue fait partie d'une features et que vous utilisez l'excellentissime module drush (si vous ne le connaissez pas, foncez tout de suite le télécharger), il vous suffit de mettre à jour votre features en une ligne de commande : - drush features-update votre_features
pour mettre à jour dans votre code la vue. Plus qu'à commiter sur le serveur de prod pour voir le résultat ! Utiliser drush et features reste le moyen le plus rapide et efficace de mettre le maximum de configuration dans le code et l'exporter / mettre à jour avec facilité. (une ligne de commande drush, y'a pas plus rapide, plus qu'à se préparer une tisane pendant votre "features-update-all").
N’hésitez pas à corriger les informations données ici , je n’ai pas la prétention de faire une véritable comparaison définitive, je donne simplement des pistes de réflexions pour ceux qui hésitent entre les deux.
Cet article ne demande qu’à être amélioré et ajusté par ceux qui connaissent bien le module patterns.
Vous trouvez en fichier attaché au bas de l’article un petit tableau comparatif, surement incomplet pour l’heure
http://drupalfr.org/sites/default/files/comparatif.png
Vous pouvez téléchargez le module patterns ici.
http://drupal.org/project/patterns
Notez enfin qu’il est tout à fait envisageable d’utiliser à la fois patterns et features en même temps sur un site selon le type de routine à automatiser.
Introduction
Patterns est un module très intéressant et ingénieux permettant d’écrire un fichier xml qui permettra, à son import, de configurer automatiquement des pans de votre site avec des informations de configurations très poussées. En rédigeant votre code xml (ou yaml ou php), vous pouvez créer des types de contenus, des champs CCK, des presets image cache, des nodes, des blocks, de la taxonomie, des utilisateurs. Son champ d’action est très large et le degré de précision impressionant. Je vous conseille vivement de lire l’article suivant sur drupalistic pour d’autres renseignements et un exemple sympa de pattern :
http://www.drupalistic.net/module/patterns
Comment fonctionne pattern ? exemple
Pour faire fonctionner pattern, nous devons rédiger un document xml que nous importerons ensuite dans l’administration du module patterns. Un pattern (et le fichier xml) est divisé en trois gande parti : description du pattern, modules requis, actions à effectuer lors qu’on lance le pattern.
cas utilisateur : nous voulons créer automatiquement un type de contenu news, en y ajoutant un champ image field.
Ces quelques lignes permettent de décrire notre pattern. Ils sont indispensables.
<pattern>
<info>
<title>Actualités</title>
<description>Créer une feature actualité sur un site</description>
<author>Colonel Moutarde</author>
<author_email>colonel.moutarde@gmail.com</author_email>
<version>0.1</version>
<category>Features</category>
<core>6.x</core>
</info>
</pattern>Maintenant on doit réfléchir aux module dont nous avons besoin : dans mon cas utilisateur je veux utiliser une champ image avec image field et controler la retaille d’image avec image cache. Image cache dépend de image api, image field dépend de file field et de content. On va aussi inclure le module Image cache UI pour pouvoir retoucher dans une interface utilisateur nos presets au besoins.
J’insére ceci juste après la balise de fermeture , pour déclarer les dépendances à activer :
<modules>
<module>content</module>
<module>imagefield</module>
<module>filefield</module>
<module>imageapi</module>
<module>imagecache</module>
<module>imagecache_ui</module>
<module>views</module>
<module>views_ui</module>
</modules>On entre dans le vif du sujet. Créeons notre type de contenu « news ». Toutes nos actions devront être placés entre les balises actions. Je donne le nom machine et humain du type de conteu, je précise que je veux activer les commentaires, ne pas activer l’upload, que les news soient publiées par défaut, et que ce type de contenu ne soit pas promu sur la page d’accueil.
<actions>
<content>
<name>News</name>
<type>news</type>
<description>Permet de poster des news sur le site</description>
<status>1</status> <!--Publié par défaut-->
<promote>0</promote><!--Promu en page d'accueil par défaut-->
<title_label>Titre de la news</title_label>
<body_label>Corps de la news</body_label>
<has_body>1</has_body>
<comment>2</comment> <!-- Pour que les commentaires soient activés-->
<upload>0</upload>
</content>
</actions>
Si on lance notre pattern, tout fonctionne à merveille et le type de contenu se crée à la perfection. Rédiger un type de contenu s’avère donc un jeu d’enfant. Comme patterns utilise l’API des formulaires de Drupal, on peut controler absolument n’importe quel paramètre du type de contenu : nombre de commentaires par page, type de commentaire,etc, etc…. Avec le module features, nous aurions eu besoin d’implémenter un hook dans le fichier .module pour pouvoir affiner les réglages des commentaires, de l’upload et du status de publication.
Nous sommes toujours au seins des balises actions . J’ajoute un champ filefield avec l’option « image » que me confère le module image_field, je décide que 5 images sont autorisées par article
<field>
<type>filefield</type> <!--Le type de champ, je souhaite un champ fichier-->
<name>image</name> <!-- nom du champ, qui affichera plus tard field_image"-->
<label>Images</label>
<widget>imagefield_widget</widget>
<weight>8</weight>
<file_extensions>jpg jpeg png gif</file_extensions>
<file_path>images</file_path> <!--Dossier où seront rangées les images-->
</field>La syntaxe pour tous ces objets sera tout aussi facile à rédiger, et la finesse de configuration toujours aussi pointue. Même si les premières fois il va falloir réfléchir et tatonner pour trouver les bon noms de paramètres pour le xml.
A compléter : je n’ai pas eu le temps de comprendre comment créer une vue avec patterns. Une chose est sure, sur ce point, le module features a un énorme avantage car il permet d’exporter des vues et de les incorporer à notre feature en un seul clic : tandis que patterns, de par le fonctionnement du module, va vous demander de remplir de nombreuses informations pour reproduire une vue. Features à un très sérieux avantage pour l’instant de ce côté puisqu’il permet en un clic d’exporter une vue en profitant de l’API d’export de views.
Quelle sont les différences entre features et patterns ?
Ils ont un objectif commun : pouvoir réutiliser sur un nouveau site les configuration de modules patiemment créer sur un autre site. Mais pour cela ils utilisent une méthode très différente :
- Patterns s’appuie sur l’API des formulaire de Drupal. C’est à dire qu’à partir du xml que vous lui fournissez, il va soumettre programmatiquement les formulaires de configuration tout comme si vous le faisiez vous même. A part qu’il va beaucoup plus vite que vous :-). Vous obtenez donc le même résultat que si vous aviez fait tout ce travail à la main.
Exemple concret de cette différence : un type de contenu importé par patterns sera enregistré dans la base de données tout comme si vous l’aviez créer vous même à la main. Vous aurez un bouton delete vous permettant de l’effacer. Tandis que le type de contenu sauvegardée par feature sera contenu dans le fichier du module. Le type de contenu n’apparait que si vous activez la feature, vous n’aurez pas de bouton «delete» car ce type de contenu ne sera pas stocké dans la base de données. En revanche tous les élements créer par feature disposerons d’un bouton «revert» permettant de retourner à la configuration originelle donnée par votre feature.
Les avantages de patterns
un large champ d’action et de possibilité. Un haut degré de précision. Pour en faire autant avec features, vous devrez installé le module strongarm et implémenté un hook_strongarm dans le fichier .module de la feature.
possibilité de créer des vocabulaires, des termes, des nodes, des utilisateurs, des roles. Feature ne le fait pas de base. Patterns semble également très souple sur la gestion des blocs.
L’idée de s’appuyer sur l’API des formualaire est ingénieuse : cela permet virtuellement de pouvoir s’adapter à n’importe quel module.
La possibilité d’imbriquer des patterns dans des patterns. Cela permet sans doute de faire des features plus « configurable ». on peut imaginer un pattern qui créer le type de contenu news, le bloc, les tags, sans créer les images avec leurs presets. Ces images pourraient être un autre pattern que l’on peut selon nos besoin inclure ou pas dans notre pattern. On peut donc faire des patterns de patterns. :-)
intégration avec pathauto
Tout au même endroit :-) Tout se trouve exclusivement dans le fichier xml (ou autre format) sans une goutte de code php. Cette homogénéité est plaisante.
j’en oublie surement, libre à vous d’éditer cette liste.
Les inconvénients de patterns
Aucune interface utilisateur pour générer automatiquement votre xml. La page d’administration du module est actuellement incomplète, ne permettant pas de supprimer ( ou de désactiver un pattern ). (en tous je n’y suis pas arrivé)
il est donc beaucoup plus long d’écrire un pattern en xml, et cela demande beaucoup plus de rigueur, que d’utiliser features qui permet parfois en quelques clics de faire quelque chose d’équivalent.
Exporter une vue et ses blocs semble laborieux alors que features peut réaliser cela en un clic.
Pas de bouton « revert » pour l’instant comme sur features, permettant de revenir à l’état antérieur du pattern
Pas de possibilité de désactiver un pattern comme on désactive une feature.
Avis subjectif : Pourquoi je préfère features malgré sans champ d’action apparemment plus réduit
Grande facilité pour importer des vues et leurs blocks
Contrairement à patterns ou on doit rédiger de zero, features requiert simplement que vous créeiez comme à votre habitude vos types de contenus etc… puis vous n’avez qu’à exporter pour obtenir votre feature.
Pouvoir utiliser le module context.
Utilisation possible de features avec le module spaces, même si je n’ai pas encore exploré cette partie. Mais bon, cela donne open atrium :-)
Chaque élément fourni par une features (views, preset d’image cache, champ CCK) dispose d’un bouton « revert ». Si vous n’etes pas satisfait des nouvelles évolutions apportées à votre features, le bouton revert permet en un clic de retrouver l’état orignel de votre vue, de votre champ CCK ou même de toute votre feature.
facilité de mise à jour : il suffit d’uploader un fichier, et en cas de pépin il suffit de réuploader une version précédente du fichier, nous n’avons pas à nous préoccuper de la base de données. Patterns est plus « barbare » : il éxécute des requetes sql et il me paraît donc IMPERATIF de faire un back up and migrate avant tout import d’un nouveau pattern. Or, c’est justement pour éviter de devoir faire des backups constant au moindre changement de la base de données que je suis intéressé par features.
En tant que développeur PHP, features me permet d’implémenter mes propres hooks en additions de la features, cela me donne donc une liberté totale, je ne suis dons pas frustré de certaines limites de features par rapport à patterns.
une certaine confiance en Development Seed : j’aime leur travail de réflexion sur Drupal et les solutions qu’ils apportent. A priori features me parait promis à un plus bel avenir que patterns, mais je peux être dans l’erreur.
| Fichier attaché | Taille |
|---|---|
| comparatif.png | 46.75 Ko |
Avertissement : cet article s'adresse plus particulièrement à des utilisateurs avertis ou des professionnels de Drupal. Il se veut une aide pour prendre en main le trio de modules spaces/context/features dont la documentation reste laconique pour le moment. Module requis pour suivre l'exemple donné dans cet article
Image field http://drupal.org/project/imagefield
Il est fortement conseillé d'utiliser le theme Garland pour suivre cet article; tous les thèmes n'étant pas forcément compatible avec le module context. Je reviens sur ce point en fin d'article.
Il y a peu de temps, la société Development Seed annonçait la sortie d'Open atrium, un intranet bâti sur Drupal et donc la structure repose en grande partie sur trois modules : spaces, context and features. Plus que de simples modules développés uniquement pour l'occasion, spaces context et features se veulent une véritable redéfinition de la manière de développer Drupal. Ces modules apportent en partie une solution aux problématique suivantes que rencontrent ceux qui font de nombreux sites avec Drupal :
On se retrouvent souvent à combiner puis configurer les même modules pour répondre au même besoin. Par exemple peut être que pour chaque nouveau site, vous créez un type de contenu « news », avec un champ CCK « image field », lui même utilisant un preset du module « image cache » afin que votre client puisse poster régulièrement des actualités sur son site, assortie d'une image retaillée à la volée par image cache. Ne serait-il pas pratique de pouvoir « sauvegarder » tout ce travail de configuration pour pouvoir ensuite l'importer sur un autre site sans avoir à tout refaire ? C'est ce que permet features.
Si vous diposez d'un site en ligne, et que vous souhaitiez importer sur celui-ci les dernières fonctionnalités développées dans un environnemt local, vous devrez faire deux choses :
importer en ligne les fichiers qui ont changés écraser la base de données du site en ligne pour la remplacer par celle du site en local
En effet votre base de données locale contient toute la configuration des modules que vous venez de savamment ajuster. Problème : écraser la base de données du site en ligne signifie aussi écraser le contenu (les articles) du site en ligne ! Features propose une alternative à cette manière de procéder en exportant la configuration de vos modules dans un fichier PHP (sous forme de module Drupal que l'on peut activer/désactiver). En uploadant ce fichier sur le serveur, vous pouvez mettre à jour la configuration de vos module sans être contraint d'écraser votre base de données de destination.
Pour créer une fonctionnalité poussée sur un site Drupal, vous allez utiliser (par exemple) une combinaison plus ou moins complexe de champs CCK, de différentes vues, de placement de blocs avec leurs paramètres de visibilité; cela dans le but de répondre à un besoin utilisateur bien défini et facilement formulable tel que « créer une galerie d'images » ou « pouvoir poster une news sur le site ». Pourtant en ouvrant ensuite votre administration de Drupal; rien ne montre clairement que tels champs CCK + tel type de contenu + telles vues + tels blocs + tels modules travaillent ensemble pour permettre la création d'une galerie d'images. Vous êtes le seul à le savoir. Au fur et à mesure que votre site grossit, il devient de plus en plus difficile de s'y retrouver dans une administration devenue un véritable jungle de formulaires de configuration. Tous vos réglages sont physiquement éparpillées aux 4 coins de la base de données sans vous donnez aucune possibilité de vue d'ensemble de votre travail de configuration.
Context et features permettent en partie de retrouver une solution à ce souci de lisibilité. Si vous construisiez votre site en vous basant autant que possible sur ces modules, vous pourrez alors voir dans la page d'administration de features en un coup d'oeil toutes les features que vous avez développé pour le site; et en cliquant sur une feature en particulier vous pouvez observer la composition d'une features qui vous indique avec quels modules elle fonctionne, de quel module elle dépend etc.... De même, la page context permet également facilement de voir quels sont les blocs et type de contenus associés sur une section particulière du site.
Prenons un exemple concret: Imaginons qu'un client, qui utilise Drupal pour son site vitrine, souhaite ajouter sur son site un espace réservé à un petit blog qui décrira au jour le jour l'activité de son entreprise. Pour ce faire, nous allons créer un type de contenu « billet_de_blog », et nous allons créer une vue « blog » avec pour chemin « blog », qui sera chargé de lister les teasers avec pagination de tous nos types de contenus « billet_de_blog ». Pour rendre le tout un peu plus sexy nous allons aussi ajouter :
un bloc avec les dernières commentaires postés sur le blog, en utilisant une vue de type bloc. un bloc « archive » qui va permettre au visiteur de voir tous les articles d'un mois particulier en cliquant sur le nom d'un mois. Une page « archive » fournie par une vue, qui permet de naviguer dans les articles d'un mois donné. (par exemple : voir tous les articles du mois de novembre)
Nous allons aussi utiliser le module image field afin d'ajouter à notre type de contenu un champ CCK qui permettra à notre client d'uploader une image pour chaque article. Pour la vue en archive, utilisez tout simplement celle (désactivée par défaut) que propose le module views, il vous suffit de l'activer pour qu'elle soit opérationnelle ainsi que son bloc avec la liste des mois cliquables. Il vous faudra simplement ajuster le filtre de la vue pour qu'elle ne liste que le type de contenu « billet_de_blog ».
Une fois tout cela crée, nous allons entrer dans le vif du sujet et commencer par placer nos blocs « derniers commentaires » et « archive list » dans la colonne de droite de notre blog. Pour donner l'impression d'un espace homogène sur tout le blog, nous voulons logiquement que ces blocs s'affichent en réalité à trois endroits différents :
sur notre vue listant nos articles
sur nos articles proprement dit lorqu'il sont vus en « full node »
sur notre vue archive
C'est l'assemblage de ces trois entités distinctes qui va définir l'espace de notre blog. Context va justement nous servir à créer une définition de cet espace, et à ensuite placer des blocs dans des régions lorsqu'on se trouve dans cet espace.
Surtout, c'est très important, ne vous rendez PAS dans la page des blocs classique de Drupal pour placer vos blocs car c'est avec le module context qui nous allons gérer désormais leur positionnement : or context ne peut gérer le positionnement d'un bloc que si celui-ci n'est PAS positionné au prélable par la page de gestion classique des blocs.
Installez donc le module context si ce n'est pas déjà fait puis rendez vous dans l'onglet construction du site où frétille maintenant d'impatience un nouveau lien « context ». Ajoutez un nouveau context qui va nous servir à définir notre contexte « blog ». Alors là normalement si c'est la première fois que vous utilisez context vous devriez lever votre sourcil gauche en marmonnant un grognement circonspect à la vue des trois premiers champs qu'on vous demande de remplir pour la création d'un context : « namespace », « attribute» « value ». On boit une gorgée de café et on garde son sang-froid.
En gros imaginez d'abord cela comme un systeme pratique de classement : tous les contextes qui auront un « namespace » et « attribute » identiques seront classés ensemble. Si vous avez une quinzaines de contextes sur un site, ils seront regroupés par espace (namespaces) / attributes identiques. A cela s'ajoute le fait que features pouvant fonctionner de paire avec le module spaces, il semblerait que la convention de nommage « spaces » pour le namespace et « feature » pour attribute permettent au delà du simple classement de tirer parti du module « space », mais je n'en suis pas sûr ...
Le module space mériterait en lui même un article et n'a pas de rapport direct avec notre problématique pour le moment. Toufefois, pour satisfaire les plus curieux, vous pouvez concevoir les « spaces » comme des sections de votre site pour lesquelles vous pourrez activer ou désactiver des features. Chaque espace pouvant activer une feature sans que la même feature sur un autre espace soit activée. C'est ce qui vous permet dans Open Atrium d'activer ou de désactiver de grosses fonctionnalités (blog, casetracker, shoutbox) en fonction d'un organic group; car le module spaces dispose d'une extension spécifique pour organic groups. Donc les espaces sont à imaginer comme des « prises » pour brancher les features, une section du site où elles deviennent valides. Physiquement, les espaces peuvent être visibles grâce à un préfixe d'url ajouté par le module « purl » (requis pour faire tourner spaces).
Mais revenons à notre contexte :
Pour l'instant, un remplissage possible de 3 propriétés de votre contexte serait par exemple :
namespace : « communication » (Le blog est un outil dont le client se servira pour communiquer en temps réel sur la vie interne de sa société.)
attribute : « blog » (peut être mettrez vous plus tard à disposition de votre client d'autres outils de communication, comme une galerie photo ou des podcasts etc...)
value : « partie_publique » (on peut imaginer que vous créiez un autre contexte ensuite qui auront le même namespace et attribute mais avec pour value « partie_admin »; contexte que vous utiliseriez pour offrir au client une page d'admin lui permettant de gérer son blog comme sur un vrai blog de type wordpress).
Vous avez aussi un petit champ description pour exprimer avec une prose condensé l'essence intime de ce contexte à vos yeux. Si vous avez un seul contexte sur votre site, vous auriez tout aussi bien pu marqué dans chacun des champs « blog » et cela aurait tout aussi bien fonctionné. Mais sur un site plus important, il sera bon de rationnaliser comme je viens de le faire vos contextes pour gagner en clarté. De plus, ce travail de formulaire oblige à une certaine clarification / classification des besoins utilisateurs à développer, ce qui ne peut pas faire de mal.
Maintenant on s'attaque au plus fun : configurer votre contexte. Vous allez notamment vous apercevoir à l'usage que context permet de placer/déplacer des blocs beaucoup plus vite que par l'interface classique des blocs, (qui en plus rame particulièrement et s'avère peu ergonomique quand un site dispose de nombreux blocs).
L'interface de configuration de context se divise en trois grandes parties :
les conditions : qu'est ce qui va déclencher l'activation de votre contexte « communication > blog > partie publique « ?
les réactions : qu'est ce qu'il se passe quand ce contexte est actif ? Elles sont assez limitées pour l'instant; on peut désactiver une région entière du template, envoyer 3 nouvelles variables à notre page.tpl.php , rendre un item de menu actif. Les variables sont intéressantes puisqu'elle permettent d'afficher dans votre theme le titre de la section à travers tout le contexte. Dans notre cas, on pourrait afficher « le blog de la société ».
Le placement / la visibilité des blocs dans ce context. Quels blocs va afficher notre contexte et dans quelle région ? Choisissez un bloc dans la partie droite plus cliquez sur « add » dans la partie gauche de la région visée.
Concernant les conditions et les réactions, les développeurs seront ravis d'apprendre que le module context vous proposent une séries de hooks permettant de créer très rapidement et très facilement de nouvelles conditions / réactions pour enrichir context sans hacker le module.
Nous voulons que notre contexte soit actif dans les conditions suivantes :
quand on se trouve sur un type de contenu « billet_de_blog ». cliquez simplement sur « node pages » puis cochez le type de contenu pré-cité.
Quand on se trouve sur la vue « archive » et la vue « blog ». Cliquez sur « views » et sélectionnez les vues. (déjà à ce stade vous devriez déjà vous rendre compte qu'en 4 clics vous faites la même chose, et bien plus rapidement, qu'avec un paté de 10 lignes de php pas lisible dans la configuration de visibilité d'un bloc).
Maintenant choissiez dans les blocs votre bloc « derniers commentaires » ainsi que le bloc « archive list » généré par la vue archives. Et voilà ! En vous rendant sur les types de contenu blog et sur vos vues, vous constaterez la présence studieuse de vos blocs.
Au passage on peut signaler un autre avantage de context qui n'est pas des moindres : si pour une raison X ou Y vous devez afficher ces mêmes blocs sur un autre type de contenu, l'affaire sera réglée en quelques secondes. En passant par l'interface classique des blocs, il vous faudra ouvrir chaque bloc, modifier votre code php dans la visibilité des blocs, ce qui conduit assez vite à la déprime si cela concerne dix blocs.
note importante : pour placer les blocs, il est impératif que votre theme n'utilise pas un override de la fonction « theme_blocks » (dans template.php). Si c'est le cas, le placement des blocks de context ne fonctionnera pas. A noter aussi un conflit avec le module i18n, car il n'est pas possible d'afficher un bloc avec context en fonction de la langue. Toutefois il reste possible de placer des blocs dont l'affichage est indépendant de la langue, à condition toutefois d'allouer un poids supérieur au module context dans la table system.
Pensez aussi maintenant à ajouter votre champ CCK sur le type de contenu « billet_de_blog » afin que l'utilisateur puisse uploader une photo sur son blog.
L'utilisation de context nous a permis en seulement quelques clics de définir des conditions complexes de visibilité pour nos blocs qui demanderait en temps normal un peu de php; tout en offrant en plus une interface (la page d'administration de notre contexte) permettant de voir en un coup d'oeil quels sont les blocs et vues qui travaillent ensemble pour définir notre espace de blog. Mais le plus grand intérêt de toute ceci n'est pas là : en utilisant context nous trouvons surtout le plus fidèle allié du module features, c'est à dire que tous ces réglages vont pouvoir désormais être exportés, et c'est là tout l'intérêt de notre démarche, qui permet de résoudre en partie le probleme de la mise à jour d'un site en ligne Drupal. Bref, tout ceci n'était que la première étape de notre plan machiavélique.
C'est maintenant l'heure de vérité : installez le module features, puis rendez vous dans le menu « construction du site » et cliquez sur le nouveau lien « features ». Comme vous n'avez pour l'instant créer aucune feature, cette page doit être vide, nous allons donc nous empressez d'ajouter une feature pour y remédier. Choisissez le nom de votre feature : ce sera le nom du module que vous obtiendrez ensuite. Indiquez également la version, car vous exporterez sans doute votre feature plusieurs fois au cours de votre développement. Ignorez pour le moment le champ « update feed » : il vous servira quand vous travaillez avec un serveur de features qui s'avera un outil extrement pratique pour stocker de façon ordonnée et sûre vos créations (et qui, si il est en ligne, vous permettra de partages vos features avec les autres utilisateur de Drupal ).
Nous allons définir notre feature; c'est à dire que nous allons expliquer à feature quels sont les éléments composant notre fonctionnalité blog afin qu'il puisse exporter tout ça dans un fichier php (un module); ce qui nous permettra de l'installer ensuite en un seul clic sur n'importe quel installation Drupal sans avoir à recréer manuellement tout ce que nous venons de faire.
Vous devez disposez dans le formulaire de création de feature d'une liste déroulante pour choisir les « objets » faisant partie de votre feature : node, context, views, users etc... Sélectionnez en premier votre context, qui permettra de récupérer automatiquement un grand nombre d'informations concernant notre fonctionnalité blog. Ajoutez-y le type de contenu « blog » afin de récupérer les informations concernant le champ CCK que vous avez ajouté. Vérifiez que tous les éléments liés à votre blog aient bien été détectés et ajoutez ce qu'il manque au besoin. Vous remarquez que l'objet « user » de la liste déroulante vous permet d'exporter la configuration de certaines permissions Drupal ! Cela vous évitera d'avoir à passer par la page permission pour reconfigurer les droits lors de l'installation de votre feature sur un nouveau site ou lors d'une mise à jour.
Enfin, c'est une partie à laquelle il faut être très attentif, vérifiez que toutes les dépendances de votre features ont bien été détectées (c'est à dire les modules dont votre fonctionnalité blog à OBLIGATOIREMENT besoin pour fonctionner), et ajoutez en si vous pensez qu'il en manque une. Sinon, lorsque vous installerez une feature plus complexe, rien ne marchera comme vous l'espérez et rien ne vous indiquera que vous avez tout simplement oublier d'installer puis d'activer un module indispensable à son bon fonctionnement.
Une fois tout cela fait : cliquez sur le bouton « download » et, magie ! Vous pouvez télécharger votre features en tant que module !
Une fois cela fait, décompressez le fichier obtenu (une erreur se produit à la décompression mais pour ma part avec winrar cela n'affecte pas le fonctionnement de la feature, c'est un bug connu actuel qui devrait être résolu à la prochaine release), puis installez le, comme tout module qui se respecte dans votre répertoire modules. Ll'idéal est de créer un sous-dossier dans « sites/modules » permettant de rassembler toutes vos features, histoire de ne pas les confondre avec les modules classiques. Ensuite, il vous reste à activer cette feature; pour cela vous devez vous rendre à nouveau dans construction du site > features; ou vous devez voir maintenant apparaître votre nouvelle feature.
En réalité, ce que vous venez de faire ne change strictement rien au fonctionnement actuel de votre site; si ce n'est que désormais vos vues et contextes dispose de boutons « revert » fort pratiques vous permettant désormais de revenir à tout moment à la configuration contenue dans votre module. A partir de maintenant, si vous commencez à modifier une vue ou un contexte; en vous rendant sur la page feature vous verrez le statut de la feature passer de « defaut » à « overriden »; ce qui indique que vous avez apporté des modifications à votre fonctionnalité entre temps. En installant le module « diff » vous serez même en mesure de visuellement les changements que vous avez apportés par rapport à la feature originelle. Il vous est possible de revenir à l'état de la feature lors de son export en cliquant sur Revert. Si en revanche vous êtes satisfait des améliorations apportées entre temps à votre feature, il ne vous reste à l'exporter à nouveau puis à écraser l'ancien fichier avec le nouveau (en passant par l'onglet update dans la configuration de feature).
Voilà, vous disposez désormais d'une feature « blog » que vous pouvez installer à présent sur une nouvelle installation de Drupal. Celle-ci se chargera de replacer automatiquement vos blocs et de recréer vos vues. Ce petit exemple devrait vous permettre d'imaginer facilement comment tirer parti des modules context et features pour vos sites.
Il est temps maintenant de mesure les implications concrètes de ce que nous venons de faire :
il vous suffit d'installer votre feature sur une nouvelle installation de Drupal pour pouvoir réactiver votre blog tel que vous venez de le configurer, en un seul clic. C'est un temps énorme économisé pour vos prochains sites qui rencontreront un besoin similaire.
vous pouvez désormais mettre à jour le placement des blocs, des champs CCK, views etc.. uniquement en écrasant le fichier de votre module. Il n'est donc plus nécessaire d'exporter votre base de données pour communiquer des changements de configuration de modules.
Vous disposez de la possibilité de revenir à la configuration par défaut de la feature en cas de gros pépins. Donc si vous sabotez involontaire votre super code php qui tue dans l'argument d'une vue, plus besoin de vous défenestrez parce que vous aviez oublié de sauvergarder la base de données ou d'exporter votre vue : cliquez sur « revert ». Il en va de même pour vos contextes.
Vous pouvez partager votre feature avec les autres; donc vous pouvez aussi télécharger les features des autres. On conçoit les avantages qu'un tel module de normalisation des exportations de configuration de modules Drupal se mette en place. Tout le monde y gagnerait.
Vous pouvez facilement faire un versionning dans vos features importantes : En installant un serveur de features (un profil drupal existe permettant de faire cela en 5 minutes), vous pourrez aisément centraliser les différents releases de vos features et entrez des notes primordiales quand à certaines choses importante à notifier pour le bon fonctionnement de la feature. Comme par exemple le theme dont elle dépend. Et puis comme le monde n'est pas parfait, il vous faudra aussi parfois tout de même retoucher deux ou trois paramètres de configuration à la main, features n'étant malheureusement pas compatible avec tous les modules; mais seulement actuellement avec quelques modules clefs pour le développement de site avec Drupal. Il est donc bon de noter sur votre serveur de feature, dans la description, les petits changements qu'il sera peut être nécessaire d'apporter une fois la feature activée pour que celle-ci fonctionne pleinement.
Le module features n'est pas magique et ne peux pas exporter la configuration de n'importe quel module. Actuellement vous ne pouvez vous en servir que pour exporter la configuration de views, les champs CCK, image cache, context (ainsi vous pouvez exporter le positionnement de blocs et leur visibilité). Concrètement, imaginons que vous exportiez votre feature en indiquant une dépendance au module « blog theme ». Blog theme permet à l'utilisateur de votre site de choisir son propre theme pour un blog. Peut être avez vous touché la configuration de blog theme pour indiquez à quel type de contenu s'adaptera le theme du blog. Ce paramètre ne sera pas exporté par features car blog theme n'est pas supporté par feature. Il vous faudra donc retoucher ce paramètre à la main ou, ou bien ajouter dans votre feature un petit module qui sera chargé lors de son activation d'automatisé ces réglages avec quelques hooks et requêtes sql.
Le module context peut facilement être overridé par le theme au niveau du theme_blocks. Or le module context se sert justement de la fonction theme_blocks pour pouvoir placer les blocs dans votre theme. Si context s'aperçoit que le theme utilise déjà un override de la fonction theme_blocks (dans son fichier template.php), alors il laissera la priorité au theme et ne placera plus simplement aucun bloc. Sans vous le dire, ce qui peut surprendre.
J'ai eu à faire à un cas ou la condition « path » refusait de marcher, sans doute un conflit avec un autre module mais je n'ai pas pu trouver lequel ni la raison de ce bug.
Le module context est en conflit avec i18n : de plus, un bloc placé avec context s'affichera à la fois en anglais et en français si ce sont les deux langues utilisées sur votre site.
Ayez aussi bien à l'esprit la chose suivante : un contexte est lié à son theme. C' est un pacte signé par le sang; car context doit connaître les régions d'un theme pour pouvoir placer ses blocs. C'est tout à fait logique mais cela implique que pour vous servir de votre context; vous devez utilisez le thème pour lequel il a été crée; et donc qu'il est dépendant d'un theme en particulier. A noter tout de même également que beaucoup de themes ont en commun les région $left et $right; donc vous avez un une probabilité assez élevé que les blocs que vous avez placé dans la barre de droite se retrouve au bon endroit en utilisant un autre theme.
Autre point : Il n'est actuellement pas possible de choisir pour quel theme activé de Drupal votre contexte s'applique : il s'applique forcément sur votre theme par défaut. C'est très dommage car cela limite la puissance potentielle de ce module, mais cela sera très certainement corrigé dans la prochaine version du module car intrinsèquement il est tout à fait capable de gérer ce point sans problemes. Sur le dernier projet sur lequel j'ai travaillé, j'ai contourné cette limitation en renommant les régions de mon deuxieme theme avec les mêmes noms de régions que celle de mon premier thème. C'est parce que context a besoin de connaître votre theme pour afficher les régions disponibles qu'il n'est pas possible d'afficher actuellement un theme particulier en fonction du context. C'est une demande fréquente mais c'est en fait quasiment un contre-sens pour l'instant étant donné la manière dont le module fonctionne.
Malgré les mises en gardes que je vous adresse, qui sont parfois handicapantes, ne jetez pas trop vite le bébé avec l'eau du bain : ces limitations peuvent ne pas peser très lourd en comparaison des bénéfices apportés par le module: à vous de voir selon les situations. Context est un module encore jeune destiné à évoluer. Mais ça peut valoir le coup, quand vous avez plusieurs manières de procéder pour developper une fonctionnalité; de privilégier les modules exportables par context.
Les moyens suivants permettent comme features d'exporter vos paramètres puis de les importer. Ils ne sont pas forcément antagonistes avec features et peuvent sans doute être complémentaires. Je n'ai pas testé toutes ces possibilités je ne peux donc pas faire une comparaison.
Le profil d'installation drupal. Très puissant mais un peu difficile à appréhender : il est l'outil idéal pour packager votre installation Drupal d'une manière ou d'une autre. Par exemple vous pourriez vous faire un profil d'installation « boutique-en-ligne » qui comprendrait ubercart et tous les modules nécessaires pour réaliser une boutique en ligne. Le profil d'installation se charge principalement d'activer et de paramètrer vos module selon vos instructions. Il vous suffit ensuite de faire une nouvelle installation de Drupal, de copier coller dans un dossier votre nouveau profil d'installation dans le répertoire profil, et de sélectionner le profil «boutique-en-ligne » à la place du profil « drupal ». Le profil d'installation peut surement faire très bon ménage avec le module features :-)
module patterns : pas testé
module deployment pas testé
Pour ma part, si je m'intéresse plus particulièrement aux modules context et features; c'est qu'ils sont utilisés par la société Development Seed et que de ce fait leur avenir et leur maintenance me semble assez sûr.
Dans les articles précédents j’ai expliqué comme combiner le module Features et le module Context pour pouvoir exporter la configuration de vos modules en un seul module que vous pouvez activer et désactiver à votre guise. Toutefois certaines limites apparaissent rapidement. Et si je veux que mon type de contenu « article_sport » ait par défaut ses commentaires désactivés ? Et comment faire pour exporter la configuration des modules non supportés par Features pour le moment ? Sommes-nous condamnés à fabriquer des features avec «seulement» CCK, views, context, image cache ? Que nenni.
Tirer parti du fichier .module de votre feature
En exportant votre feature, vous obtenez un module Drupal en bonne et due forme, si bien qu’il contient comme il se doit un fichier .module. Par défaut ce fichier contient cette unique ligne (dans mon cas, la feature se nomme « pack_reservation_taxi » ).
<?php
include_once('pack_reservation_taxi.features.inc');
?>Cette ligne se charge d’aller cherches les autres fichiers de votre module contenant toute la configuration des modules composant votre features sous forme de tableaux php. Mais au-delà de cette ligne, vous êtes libre d’écrire absolument tout ce que voulez comme code php, comme si il s’agissait d’un module Drupal normal. Lors de votre prochain export, votre code fera partie du fichier .module de votre feature ! Voilà qui ouvre de nouveaux horizons.
C’est donc l’endroit idéal pour vous livrer aux hooks en tout genre qui peuvent vous permettre d’aller plus loin dans les ajustements de votre feature et améliorer son exportabilité. On peut imaginer utiliser le hook_enable (qui se déclenche uniquement au moment de l’activation de votre module, et donc de votre feature dans ce cas) pour lancer une requête sql permettant d’ajuster dans la table system le poids d’un autre module de façon automatisée par exemple.
Mais en utilisant le module Strongarm, qui est utilisé sur l’intranet drupal « open atrium » vous pouvez aussi prendre très facilement le contrôle d’une partie très importante de Drupal : les réglages de base des formulaires de configuration de n’importe quel module.
Un peu de théorie : La table « variable » de Drupal
En vous rendant dans la base de données de votre installation Drupal avec phpmyadmin ou autre, vous pourrez constater la présence d’une table variable. Cette table joue un rôle majeur dans la configuration de vos modules -et donc de votre site. En effet, chaque fois que vous vous rendez dans un formulaire de configuration d’un module, quand vous appuyez sur le bouton enregistrer, c’est dans cette table que sont stockés vos changements. Autrement dit, si nous pouvions exporter dans notre feature certaines variables de cette table, ça nous permettrait de maîtriser la configuration par défaut de n’importe quel module Drupal possédant une page d’administration lors de l’activation de notre feature.
Le module strongarm
C’est très justement ce que se propose de faire le module Strongarm. Ce module ne propose pas d’interface utilisateur, c’est au développeur d’implémenter un hook permettant de spécifier la configuration qu’il souhaite pour tel ou tel module Drupal. Une place toute trouvée pour implémenter ce hook c’est le fichier .module de votre feature :-)
Voici un exemple concret de ce hook que j’ai implémenté dans ma feature « pack_reservation_taxi », pour laquelle je souhaitais que soient désactivés par défaut les commentaires sur deux types de contenus spécifiques. Je souhaitais également que le module « automatic node title » soit automatiquement configuré pour cacher le titre de ces types de contenus et les remplacer par des tokens de mon choix. Plutôt que de refaire cela à la main lors de l’import de ma feature, j’ai implémenté le hook_strongarm, (disponible une fois activé le module Strongarm).
<?php
function pack_reservation_taxi_strongarm() {
$conf = array();
// Désactiver les commentaires sur les types de contenus fiche trajet et vehicule
$conf['comment_fiche_trajet'] = COMMENT_NODE_DISABLED;
$conf['comment_vehicule'] = COMMENT_NODE_DISABLED;
//autonodetitle
$conf['ant_fiche_trajet'] = 1; //cacher automatiquement les titres
$conf['ant_pattern_fiche_trajet'] = '[field_ville_depart-title] > [field_ville_arrivee-title]'; //tokens
return $conf;
}
?>Une fois ce hook implémenté, vous pourrez voir (après avoir vidé le cache de Drupal) sur les types de contenus choisis que les commentaires sont automatiquement forcés à « disabled ». De plus, le module Strongarm vous affiche un message vous indiquant que des champs de ce type de contenus sont « forcés » par Strongarm. Les boutons radios pour changer la configuration des commentaires apparaîtront dans un cadre de couleur et seront grisés : vous ne pouvez plus les changer. Toutefois en vous rendant dans la page de configuration du module Strongarm, vous pouvez décider qu’il reste possible d’overrider ces réglages, en dépit des ordres donnés par votre hook.
En utilisant à bon escient le fichier .module de notre feature et Strongarm, nous disposons donc d’un sérieux arsenal pour contrôler une grande partie de la configuration de vos modules avec peu d’efforts.
Cette documentation regroupe des articles sur l’API des formulaires de Drupal afin d’en faciliter la prise en main.
Si vous êtes habitués au PHP procédural, comprendre comment fonctionne Drupal pour générer les formulaires et traiter leurs données peut être déstabilisant. Voici les deux principales choses dont vous ne devez plus vous préoccupez en utilisant l’API des formulaires de Drupal :
rédiger le html de votre formulaire : Drupal génère lui même de A à Z le html d’un formulaire. Vous devez simplement lui précisez des informations des champs que vous désirez afficher (type, titre, valeur par défaut etc…) via un array().
récupérer les données en utilisant $_POST, $_GET etc… : L’API des formulaires récupère les données et les rend accessibles dans la variable $form_state[‘values’] que vous verrez plus bas.
Gérer un formulaire dans Drupal va en fait se constituer en 4 grandes étapes :
1) Créer une fonction qui va définir les éléments que va contenir votre formulaire
2) Ecrire une fonction de validation des données (permettant par exemple de vérifier que le champ «numéro de téléphone» contient bien uniquement des chiffres)
3) Ecrire une fonction de soumission du formulaire, qui va nous permettre de faire quelque chose des données transmises par le formulaire : les enregistrer dans la base de données par exemple.
4) Afficher le formulaire ! La fonction drupal_get_form() va permettre de générer le html de notre formulaire et de l’afficher.
Voici un exemple de code d’un formulaire très simple. Pour cela j’ai crée un petit module afin de pouvoir afficher ce formulaire sur une page dédiée. Vous trouverez ce module d’exemple attaché à cette page en bas.
n’oubliez pas de vider le cache de Drupal pour que votre nouveau item de menu soit pris en compte ! Sinon votre page ne s’affichera pas.
<?php
/<strong>
* Implémentation de hook_menu. Déclencher l'appel de la fonction (callback) 'exemple_de_page'
* Lorsqu'on se rend sur l'url 'exemple-de-page'
*/
function formexample_menu(){
$items = array();
$items['exemple-de-page'] = array(
'title' => 'Exemple de formulaire', // titre de la page quand on se rendra sur l'url 'exemple-de-page'
'page callback' => 'exemple_de_page', // La fonction appelée lorsqu'on se rend sur l'url exemple-de-page
'access arguments' => array('access content'), //un accès doit obligatoirement être précisé
'type' => MENU_CALLBACK, //indique que cet item de menu n'apparaitra dans aucun menu de Drupal, il est invisible.
);
return $items;
}
/</
strong>
* callback pour notre item de menu défini ci-dessus
*/
function exemple_de_page(){
$output = 'Hello world ! ';
$output.= drupal_get_form('mon_formulaire');
return $output;
}
/**
* Création de notre formulaire en utilisant l'API de Drupal
*/
function mon_formulaire(){
$form = array();
$form['nom'] = array(
'#type' => 'textfield',
'#title' => t('Votre nom'),
'#required' => TRUE,
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('OK'),
);
return $form;
}
/<
strong>
* Fonction de validation du formulaire
* Il suffit d'ajouter _validate à la fin du nom de la fonction mon_formulaire ci-dessus pour que drupal
* trouve cette fonction automatiquement
*/
function mon_formulaire_validate($form, &$form_state){
if($form_state['values']['nom'] == 'John'){
return form_set_error('nom', "Désolé, John, vous n'êtes pas autorisé à vous inscrire sur le site");
}
}
/</strong>
* Fonction de soumission du formulaire : on peut ici insérer les données du formulaire dans la base de données par exemple.
* La encore, la convention de nommage avec _submit permet à drupal
* de retrouver automatiquement la fonction de soumission
*/
function mon_formulaire_submit($form, &$form_state){
drupal_set_message($form_state['values']['nom']);
$form_state['redirect'] = 'node'; // on redirige l'utilisateur sur la page de notre choix !
}
?>
| Fichier attaché | Taille |
|---|---|
| formexample.rar_.txt | 1.07 Ko |
Voir documentation sur l’API des formulaires http://drupalfr.org/node/8337
Nous avons vu précédemment que le html de notre formulaire est généré automatiquement par l’API des formulaires de Drupal. Mais comment faire si nous voulons justement controler la mise en forme html de nos éléments, le présenter par exemple en trois colonnes, chacune étant un div avec un titre ? La réponse est : en utilisant une fonction theme.
Ecrire une fonction de theme
Pour cela nous devons déclarer une nouvelle fonction chargé de mettre en forme notre formulaire. Dans notre exemple, la fonction générant notre formulaire s’appelle «mon_formulaire». Si nous créons une fonction nommée «theme_mon_formulaire», celle ci sera utilisée par le systeme de theme de Drupal pour mettre en forme notre formulaire d’exemple à la place de l’affichage par défaut.
<?php
function theme_mon_formulaire($form){
$output = drupal_render($form['submit']);
$output .= '<div>';
$output .= '<h1>Entrez votre nom ! </h1>';
$output .= drupal_render($form['nom']);
$output .= '</div>';
$output .= drupal_render($form);
return $output;
}
?>Explications :
- La fonction drupal_render() est utilisée pour généré le html d’une partie de notre formulaire. drupal_render($form[‘submit’]) va générer automatiquement le code html pour notre bouton de soumission.
- Notez bien que à la fin nous faisons un drupal_render sur tout le formulaire afin d’être sur qu’aucun élément de notre formulaire n’a été oublié par notre fonction theme : on est ainsi sûr d’afficher tout ce que nous n’avons pas affiché manuellement par drupal_render() et également que les champs cachés dont Drupal a besoin pour traiter un formulaire seront eux aussi bien présents.
Déclarer à Drupal notre fonction theme !
Le code ci-dessus ne modifiera en aucune façon l’affichage de votre formulaire pour le moment. Drupal doit en effet savoir que cette fonction theme existe, la convention de nommage avec ‘theme_+nom_du_formulaire’ n’est pas suffisante sur Drupal 6. Drupal fonctionne avec un «registre de themes» (theme registry) : il s’agit de la liste de toutes les fonctions themes déclarées par les modules.
Il faut donc maintenant que nous informions Drupal de l’existence de notre fonction theme, et pour cela nous devons la déclarer au registre des themes via un hook dans notre module :
<?php
function formexample_theme(){
$themes = array();
$themes['mon_formulaire'] = array(
'arguments' => array(), //notre fonction n'a besoin d'aucun argument, on laisse vide.
);
return $themes;
}
?>Un hook_theme peut contenir plusieurs themes, c’est pour cela qu’il est déclaré en tant que array.
Ici on indique l’existence d’un theme ‘mon_formulaire’, ce qui signifie que Drupal cherchera la fonction «theme_mon_formulaire» pour générer notre html.
Il faut enfin vider le cache de Drupal (site > configuration > performance > vider le cache) afin que drupal rescanne tous les modules pour reconstruire le registre de thèùes en prenant en compte notre nouvelle fonction.
Déclarer une fonction theme alternative pour un formulaire
Il existe une autre manière de déclarer quel fonction theme doit utiliser le formulaire : en la déclarant dans la fonction ‘mon_formulaire’ en ajoutant ceci :
<?php
$form['#theme'] = 'mon_formulaire_alternatif';
?>il faudra ensuit également avertir le theme de registrer de l’existence de cette nouvelle fonction theme via notre hook theme qui ressemblera alors à ceci :
<?php
function formexample_theme(){
$themes = array();
$themes['mon_formulaire'] = array(
'arguments' => array(),
);
$themes['mon_formulaire_alternatif'] = array(
'arguments' => array(),
);
return $themes;
}
?>Après avoir vidé le cache, drupal cherchera la fonction theme_mon_formulaire_alternatif. Celle ci sera cherchée avant la fonction theme_mon_formulaire qui du coup ne sera pas utilisée, si ces deux fonctions themes co-existent.
Le code ci-dessous est simplement un exemple concret de module pour altérer un formulaire et le themer de façon plus poussé que dans les exemples précédents.
Ici le module s’appelle «formulaire_tableau» : le but est simplement d’améliorer la présentation d’un formulaire produit (node/add/tableaux dans ce cas) pour la boutique en ligne ubercart : le formulaire de node étant étant déjà altéré par ubercart, taxonomie, CCK, le résultat final niveau présentation est catastrophique : ici je fais une restructuration complète du formulaire afin d’en controler totalement la présentation et de réordonner les champs de façon logique pour l’utilisateur final ; et également pour remplir de façon automatique le champ référence.
<?php
function formulaire_tableau_form_alter(&$form, $form_state, $form_id){
global $user;
// dans le cas ou on ajoute un produit de type tableau
if($form_id == 'tableaux_node_form'){
// dire d'utiliser la fonction "theme_formulaire_tableau" quand le formulaire sera transformé en html
$form['#theme'] = 'formulaire_tableau';
// créer automatiquement une nouvelle référence ubercart à la création d'un produit
arg(1) == 'add' ? $form['base']['model']['#value'] = nouvelle_reference_tableau() : '';
// Masquer ce champ sauf pour le super admin
$user->uid != 1 ? form['base']['model']['#type'] = 'hidden' : '';
// j'enleve des descriptions qui genent ma présentation
$form['title']['#description'] = '';
$form['taxonomy']['tags'][2]['#description'] = '';
$form['taxonomy']['tags'][3]['#description'] = '';
$form['taxonomy']['tags'][4]['#description'] = '';
$form['taxonomy']['tags'][5]['#description'] = '';
$form['taxonomy']['tags'][6]['#description'] = '';
$form['base']['prices']['sell_price']['#description'] = '';
$form['buttons']['#weight'] = 100; // s'assurer que les boutons de soumission restent bien en bas
}
}
// cette fonction créer une référence automatique pour un nouveau tableau
function nouvelle_reference_tableau(){
// trouver la dernière référence existante, puis ajouter 1
return db_result(db_query_range("SELECT model FROM {uc_products} ORDER BY nid DESC", 0, 1)) + 1;
}
// redonner un visgage humain au formulaire node/add/tableaux et ordonner les champs à notre sauce
// (taxonomie, ubercart, cck)
function theme_formulaire_tableau($form){
drupal_set_title("Ajouter un tableau");
$html .= '<p>Ajouter un nouveau tableau dans votre boutique.</p>';
$html .= drupal_render($form['title']);
$html .= drupal_render($form['taxonomy']['tags'][5]);
$html .= drupal_render($form['base']['dimensions']['width']);
$html .= drupal_render($form['base']['dimensions']['height']);
$html .= drupal_render($form['field_heightc']);
$html .= drupal_render($form['field_widthc']);
$html .= drupal_render($form['field_localisation']);
$html .= drupal_render($form['taxonomy']['tags'][4]);
$html .= drupal_render($form['taxonomy']['tags'][3]);
$html .= drupal_render($form['taxonomy']['tags'][6]);
$html .= drupal_render($form['base']['prices']['sell_price']);
$html .= drupal_render($form['field_source']);
$html .= drupal_render($form['taxonomy']['tags'][2]);
$html .= drupal_render($form['field_disponibilite']);
$html .= drupal_render($form['field_provenance']);
$html .= drupal_render($form['field_image_cache']);
$html .= drupal_render($form['base']['model']);
$html .= drupal_render($form['base']['dimensions']['lenght']);
$html .= '<div style = "display :none">';
$html .= drupal_render($form['base']);
$html .= '</div>';
// J'Ajoute tous les champs qui n'ont pas été énoncé ci dessus !
$html .= drupal_render($form);
return $html;
}
// TRES IMPORTANT : on déclare à drupal notre theme. Sans ce hook,
// le theming ne fonctionnera pas.
function formulaire_tableau_theme(){
$themes = array();
$themes['formulaire_tableau'] = array(
'arguments' => array(), //notre fonction n'a besoin d'aucun argument, on laisse vide.
);
return $themes;
}
?>Allégez vos pages ! Il s’agit d’un cri du coeur. Qui n’a jamais pesté contre les temps de chargement d’une page ?
La position habituelle est de considérer que la bande passante est libérée. Erreur !
La position habituelle est de considérer que la bande passante est libérée. Erreur !
La bande passante est plus maltraitée que jamais. 2 facteurs :
La bande passante corrige facilement le problème posé par les fichiers lourds. Mais ces mêmes fichiers ont progressé en même temps que la bande passante.
Par contre, la bande passante a un impact limité sur le problème du nombre de fichiers. Pour chaque fichier nécessaire à l’affichage de votre page, un navigateur va émettre une requête HTTP GET. Ces requêtes seront chacunes traitées individuellement par le serveur.
Pour chaque requête, le serveur préparera un environnement
d’exécution (réservation mémoire, variables d’environnement, communication inter-processus, etc.) qu’il devra ensuite nettoyer pour permettre la réception de nouvelles requêtes. Ces temps de fonctionnement sont incompressibles. Quelle que soit la taille des informations, il existe toujours une durée minimum de traitement.
Cette durée de traitement a un impact important sur le transfert de petits fichiers.
Or, les pages web sont de plus en plus peuplées de fichiers :
Celles ou ceux qui m’auront suivi jusque là se seront sans doute posé la question : il s’agit d’une situation générale, en quoi cela concerne-t-il Drupal précisément ?
La solution que je vais présenter permet d’alléger les fichiers CSS dans un thème sous Drupal.
Prenons une page au hasard de Drupal.org : http://drupal.org/node/100748
(le sujet importe peu).
Une analyse des fichiers nécessaires à cette page donne les résultats suivants :
Le tout nous donne 68,32 Kio pour 26 fichiers. Les feuilles de style représentent un tiers des fichiers téléchargés et 65% du volume total !
L’idée pour faire perdre du poids aux feuilles CSS est la suivante :
Réaliser ces opérations manuellement n’est ni pratique, ni maintenable. Mais elles peuvent être automatisées dans le cadre de votre thème.
Avec l’aide d’un script PHP, il est possible de réaliser ces opérations à la «volée».
Le script compress_css.php se trouve sur la page suivante et doit être copié dans le répertoire de votre thème.
Pour l’utiliser dans votre thème, éditer le fichier page.tpl.php et insérez le code suivant :
<?php
include 'compress_css.php';
print compress_tout_les_styles($head.$styles);
?>en lieu et place des print $head; et print $styles;
Le script PHP va lire tous les fichiers CSS inclus dans l’entête HTML (balise head), les réunir en un seul, supprimer les élements inutiles et insérer le code pour la nouvelle feuille de style.
Pour exemple, l’utilisation de ce script m’a permis de passer de 50 Kio de CSS à 35 Kio (environ 30% de gain). C’est très appréciable sachant que certains standards d’accessibilité (voir Opquast) recommendent d’avoir une page d’accueil pesant moins de 100 Kio tout compris.
Le script ci-dessous doit être copié dans le répertoire de votre thème pour pouvoir être utilisé.
Le répertoire doit être en écriture pour Apache (généralement 0777) car la version compressé des CSS est écrit dans un fichier *.compress.css (afin de ne pas recompresser les fichiers à chaque fois)
Le script prend en compte le «hack IE», celui qui fonctionne avec les commentaires, de sorte que ces commentaires ne soient pas effacés.
<?php
function compress_css($base,$dir) {
// Lecture du fichier source
$css=file_get_contents($dir.'/'.$base);
// Inclusion des CSS importés
$pattern='/\@import url((.<em>.css));/e';
$replace='compress_css("\1","'.$dir.'")';
$css=preg_replace(
$pattern,
$replace,
$css
);
// Transforme les retours chariots Windows en Unix
$css=str_replace(chr(13),chr(10),$css);
// Supprime les commentaires
$debut_commentaire=strpos($css,'/</em>');
$precedent ='normal'; // Gestion du hack IE
while($debut_commentaire!==FALSE) {
$fin_commentaire=strpos($css,'<em>/',$debut_commentaire+2);
if($fin_commentaire===FALSE) break;
// Gère le hack IE
if(substr($css,$fin_commentaire-1,1)=='\') {
// Le commentaire est un Hack pour IE, on garde le commentaire en le vidant
$css=substr($css,0,$debut_commentaire).
'/</em>*/'.
substr($css,$fin_commentaire+2);
// Le prochain commentaire doit être conservé pour terminer le hack
$precedent='
hack';
} else {
// Si le précédent commentaire était un hack,
// le commentaire actuel doit être gardé pour terminer le hack
if($precedent=='hack') {
$css=substr($css,0,$debut_commentaire).
'/**/'.
substr($css,$fin_commentaire+2);
} else {
// Commentaire normal, on le supprime complètement
$css=substr($css,0,$debut_commentaire).
substr($css,$fin_commentaire+2);
}
$precedent='normal';
}
$debut_commentaire=strpos($css,'
/<em>',$debut_commentaire+1);
}
// Les identifiants se suffisent à eux-mêmes, pas besoin de préciser l'
élément
$pattern='/[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_]+#/';
$replace='#';
$css=preg_replace(
$pattern,
$replace,
$css
);
// Transforme les retours chariots en espace
$pattern='/'.chr(10).'+/';
$replace=' ';
$css=preg_replace(
$pattern,
$replace,
$css
);
// Transforme les espaces multiples en espaces simples
$pattern='/[ '.chr(9).']+/';
$replace=' ';
$css=preg_replace(
$pattern,
$replace,
$css
);
// Supprime les espaces inutiles
$pattern='/[ '.chr(9).']</em>([:;{},])[ '.chr(9).']<em>/';
$replace='\1';
$css=preg_replace(
$pattern,
$replace,
$css
);
// Les points-virgules sont inutiles en fin de block (juste avant l'accolade fermante)
$css=str_replace(';}','}',$css);
// Retourne le CSS compressé
return $css;
}
function
recupere_liste_fichiers_css($styles) {
$liste=array();
// Récupère les @import
$pattern='/\@import "([^;]</em>.css)";/';
$matches=array();
preg_match_all($pattern,$styles,$matches,PREG_PATTERN_ORDER);
$liste=array_merge($liste,$matches[1]);
// Récupère les link rel="stylesheet"
$pattern='/<link rel=["\']stylesheet["\'][^>]<em>href=<a href="[^>"\']+" rel="nofollow">"\'</a>["\'][^>]</em>\/>/';
$matches=array();
preg_match_all($pattern,$styles,$matches,PREG_PATTERN_ORDER);
foreach(
$matches[1] as $url) {
if(substr($url,0,7)=='http://') {
$mon_adresse='http://'.$_SERVER['HTTP_HOST'].'/';
if(substr($url,0,strlen($mon_adresse))==$mon_adresse) {
$url=substr($url,strlen($mon_adresse)-1);
}
}
$liste[]=$url;
}
return
$liste;
}
function
nettoie_styles($styles) {
// Retire les style en @import
$pattern='/<style[^>]*>\@import[^<]*<\/style>/';
$replace='';
$styles=preg_replace($pattern,$replace,$styles);
// Retire les style en link rel
$pattern='/<link rel=["\']stylesheet["\'][^>]*\/>/';
$replace='';
$styles=preg_replace($pattern,$replace,$styles);
return
$styles;
}
function
compress_tout_les_styles($styles) {
$liste=recupere_liste_fichiers_css($styles);
$empreinte=hash('md5',implode('|',$liste));
$fichier_all =dirname(__FILE__).'/'.$empreinte.'.compress.css';
$fichier_all_web=substr($fichier_all,strlen($_SERVER['DOCUMENT_ROOT']);
if(!
is_readable($fichier_all)) {
$total='';
foreach($liste as $fichier) {
$chemin=$_SERVER['DOCUMENT_ROOT'].$fichier;
$total.=compress_css(basename($chemin),dirname($chemin));
}
file_put_contents($fichier_all,$total);
}
$styles=nettoie_styles($styles);
$styles.='<style type="text/css" media="all">@import "'.$fichier_all_web.'";</style>';
return $styles;
}
?>Lorsque l’on crée un contenu sous drupal, celui ci est accessible via une URL de la forme :
http://monsite.com/?q=node/15cela fait ce qu’on lui demande : accéder au contenu. Mais il faut avouer que ce genre d’URL ne donne pas de renseignement sur le contenu que l’on va visiter.
Une pemière étape est d’enlever le « ?q=» en passant en url simplifiée : basiquement, drupal met un « ?q=» entre le nom de base du site et le reste d’une adresse url. On peut activer les url simplifiées en allant dans Administrer»Configuration du site»URLs simplifiées (/admin/settings/clean-urls). Il faut faire un test pour voir si le serveur accepte ces Urls (le serveur doit être en PhP5…).
En savoir plus : clean url sur drupal.org [en]
La seconde étape a pour objectifs d’avoir des URL plus explicites quant à leur contenu (meilleur référencement etc…). Par exemple :
http://monsite.com/titre_du_contenuou encore (pour un blog par ex.) :
http://monsite.com/année/mois/titre_du_contenuOn peut vouloir imaginer toute sortes d’URL qui faciliteraient la navigation sur notre site. Un autre exemple serait d’avoir les URL’s de nos forum de la forme :
http://monsite.com/forum/categorie_du_forum/titre_du_sujetPour arriver à faire cela, nous avons besoin de 2 modules qui sont :
http://monsite.com/?q=node/15, je peux faire en sorte qu’il soit accessible via http://monsite.com/?q=page_de_mon_siteUne fois les modules Path et Pathauto activés, il faut se rendre ici :
http://monsite.com/ ?q=admin/settings/pathauto
à partir de là on peut paramétrer la manière dont seront écrites les URL’s de notre site à l’aide de variables qui peuvent être :
On peut aussi renommer certaines URL’s comme :
http://monsite.com/q=user/2 -> http://monsite.com/membre/nom_du_membre
http://monsite.com/q=user/2/tracker -> http://monsite.com/membre/nom_du_membre/suivi
http://monsite.com/q=image/15 -> http://monsite.com/gallerie/nom_de_la_gallerie/titre_image
http://monsite.com/q=book/2 -> http://monsite.com/livre/titre_de_la_page
http://monsite.com/forum/categorie_du_forum/titre_du_sujet
http://monsite.com/q=blog/16 -> http://monsite.com/blog/annee/mois/titre_du_billetCréer un site Drupal ca peut aller vite, mais à la longue c’est toujours la même chose. On se connecte sur Drupal.org pour télécharger les sources de Drupal et les modules un par un, ce qui prend un temps fou. On peut encore se créer une installation toute prête mais encore faut-il maintenir à jour les modules.
Il existe une autre solution, utiliser Drush. Ce n’est pas une révolution, car cela fait maintenant un petit moment déjà que Drush est disponible mais j’avoue n’avoir jamais eu le temps de m’y plonger.
Drush n’est pas un module pour Drupal, c’est un outil à installer sur votre serveur qui va vous permettre d’administrer vos sites en ligne de commandes.
Parmi les possibilités qu’offre Drush vous allez pouvoir via une simple ligne de commande installer Drupal, activer ou désactiver des modules ou encore télécharger des thèmes.
Depuis quelques temps je l’utilise professionnellement chez mon client, et c’est vraiment un gain de temps. J’ai donc pris un peu de temps chez moi pour comprendre sont fonctionnement.
Pour la suite de la présentation de Drush je vous montrerai comment l’installer sous linux (ubuntu pour l’utilisation de sudo en natif). J’ai auparavant essayé de l’installer sous Windows mais en vain.
<br/>
Comme je viens de l’évoquer, être sous Linux avec apache2, et php 5.2 d’installés.
Pour fonctionner Drush a besoin de la librairie CLI de php (CLI pour interface de ligne de commande en français).
Vous pouvez installer ce paquet via cette commande :
$ sudo apt-get install php5-cli
Drupal (et donc drush) est relativement gourmand en mémoire, il est donc conseillé de modifier tout de suite la limite mémoire de php5-cli, ce qui évitera de rencontrer une erreur à l’installation de modules.
Ouvrir le fichier /etc/php5/cli/php.ini et modifier la valeur de memory_limit. Pour un site qui utilisera peu de modules, il est conseillé de placer cette valeur à 128M. Autrement, fixer la valeur à 256M devrait convenir à la majorité des cas. Si la mémoire est insuffisante, il vous sera alors de retourner dans le fichier pour l’ajuster à vos besoins.
Petite astuce pour trouver rapidement la variable memory_limit : après avoir ouvert le fichier php.ini, taper /memory_limit puis recherchera la chaine de caractère memory_limit.
$ sudo vi /etc/php5/cli/php.ini
## fichier php.ini
memory_limit = 256M ; Maximum amount of memory a script may consume (32MB)<br/>
Téléchargez Drush et dézippez le à l’endroit ou vous voulez. Pour ma part, j’ai choisi de le placer dans le répertoire /opt qui est utilisé pour les applications supplémentaires au système. Ainsi, pour moi, /path équivaut à /opt.
Placez vous dans le répertoire de votre choix
$ cd /path
Téléchargez drush
$ sudo wget http://ftp.drupal.org/files/projects/drush-All-Versions-2.1.tar.gz
Décompressez l’archive
$ sudo tar -xzf drush-All-Versions-2.1.tar.gz
Rendons maintenant le fichier exécutable pour tout le monde
$ sudo chmod a+x /path/drush/drush
Maintenant nous allons créer un lien symbolique vers drush.
$ sudo ln -s /path/drush/drush /usr/bin/drush
img : commande drush install
Drush est maintenant installé et prêt à l’emploi. Pour l’essayer, tapez simplement drush et vous devriez voir la liste des commandes drush disponibles.
$ drush
<br/>
Placez vous dans le répertoire où sont vos sites par exemple /var/www.
Nous allons maintenant installer Drupal avec la commande Drush download ou dl
$ drush dl drupal
Drupal a été téléchargé et déployé à l’endroit où vous êtes.
Placez vous dans votre installation de Drupal pour copier le fichier settings.php.
$ cp sites/default/default.settings.php sites/default/settings.php
$ chmod 666 settings.phpIl ne vous reste plus qu’à effectuer votre installation.
Une fois celle-ci terminée, rendez-vous dans le répertoire sites/all dans lequel nous allons déployer des modules et installer un nouveau thème. Pas besoin de créer les répertoires modules ou thèmes, drush va le faire pour vous.
Il est facultatif de se positionner dans le répertoire sites/all pour y installer un module ou un thème. Par défaut, les modules et thèmes seront téléchargés et installés dans le répertoire sites/all. Si vous voulez l’installer ailleurs (dans un sous-site ou dans le répertoire default), il vous suffira alors de vous y positionner avant de lancer la commande drush (ex : sites/default).
$ drush dl cck views devel
Nous venons de télécharger cck, views et le module devel. Pour vérifier vous pouvez aller sur l’administration de vos modules.
Cela marche aussi pour les thèmes
$ drush dl basic
Par défaut un module téléchargé n’est pas activé alors voici comment faire
$ drush enable views
Vous trouverez la liste complète des commandes de drush sur la page de documentation de drush ou -pour rappel- en tapant $ drush dans la ligne de commande.
<br/>
Drush est un vrai gain de temps pour réaliser vos sites, plus de connexion sur drupal.org, plus de recherche dans la liste des modules. En contrepartie il vous faut connaître le nom des modules que vous voulez installer.
Je vous conseille vivement d’installer Drush et de jouer avec.
Remarque GoZ : Le seul inconvénient à mon goût est le manque de visibilité lors de l’affichage de la liste des modules lorsque le site dispose de nombreux modules. Ceci oblige à jeter un œil à la page de gestion de modules lorsque l’on veut installer un module inconnu afin de voir du premier coup d’œil toutes les dépendances, la description, les modules installés etc.
Could not login with user ID #<em>0</em>.drush -u 1 commandeDrushAExecuterdrush -u 1 pour chaque commande, il est possible de créer un alias (dans ~/.bashrc) par exemple :alias drush1='drush -u 1'source ~/.bashrcSource :
Projet drush
Autres ressources :
module Drupal : Drush : part 1 : comment l’installer et l’utiliser sur biboo.net
Ce glossaire regroupe la plupart des termes employés dans la documentation et l'aide en ligne de Drupal.
Les définitions sont courtes et renvoient souvent à des pages de la documentation (principalement les Concepts généraux de Drupal) ou des posts du forum pour davantage d'explications.
--> vous pouvez faire une recherche dans cette page en tapant dans votre navigateur les touches Ctrl+F ou cmd+F
--> n'hésitez pas à faire une recherche sur tout le site Drupalfr.org en tapant votre mot clé ou phrase d'erreur (par exemple) dans le module de recherche en haut à droite de cette page
NB: ce sigle ^ à coté de chaque paragraphe vous permet de revenir à la liste alphabétique ci-dessous
A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z |
accès: droits. Les droits d'accès permettent de choisir ce que peuvent faire ou voir les utilisateurs anonymes sur le site: voir ou non la front_page, voir et/ou faire des commentaires... Il faut parfois changer ces droits après l'installation d'un module. Les mêmes droits peuvent être réglés pour des utilisateurs authentifiés ou autres types.
accueil: basiquement la première page du site, voir la 2ème si on utilise une front_page. Le logo et un premier lien primaire envoient en général vers cette page. La configuration de cette page est importante, aussi bien au niveau de la forme que du fond: elle doit être attractive, pas trop longue (suivant le type de votre site) et actualisée de temps à autre. Elle peut inclure une brève présentation du site (court "A propos"), les actualités, les derniers billets ou commentaires de blog...
administrateur: c'est le premier compte qui est créé lors de l'installation, correspondant typiquement au webmaster. Si le site est unipersonnel, on peut interdire la création de nouveaux comptes sans approbation: aller dans Droits d'accès>>Paramètres des utilisateurs
article: voir Concepts généraux: article
breadcrumb: Technique de navigation montrant toutes les pages visitées menant à partir de la page d'accueil à la page actuellement vue. Toutes les pages sont liées pour une navigation facile vers l'arrière. Typiquement placé entre le header et le contenu. Le breadcrumb est personnalisable (faire une recherche de module dans drupalmodules.com)
bloc: voir Concepts généraux: bloc
cache: pour afficher vos pages web plus rapidement, certaines données (en général des images, mais aussi des fichiers comme les css) peuvent être mis en mémoire dans un fichiers appelé "cache"; ce peut être le cache de votre navigateur ou celui de Drupal. Quand on met à jour le thème de son site, il peut être utile d'actualiser la page dans le navigateur, vider le cache de ce dernier (firefox: outils>>options>>effacer mes traces>>cocher "cache"), voire celui de Drupal. Pour cela, aller dans administration»configuration du site»performance (/admin/settings/performance)
captcha: système permettant d'éviter les spams (voir ce terme)
CSS: les fichiers .css mettent en forme le fond (contenu html). On les trouvent dans le dossier themes ou sites/all/themes. Des logiciels tels que Notepad++, Gedit ou Smultron permettent de les éditer avec une coloration syntaxique. Sous Windows, on peut aussi utiliser TopStyle Lite.
catégorie: voir Concepts généraux: catégorie
coeur (core): voir Concepts généraux: coeur
commentaire: voir Concepts généraux: commentaire
contenu: type: voir Concepts généraux: type de contenu standard
contenu: créer: créer ses premiers contenus
cron: pour lancer le cron automatiquement et régulièrement, on peut utiliser le module Poormanscron
connexion: bloc de connexion ne s'affiche plus: vérifier sa visibilité dans administrer>construction-du-site>liste (/admin/build/block/list), sinon, aller à l'url www.votresite/user pour vous reconnecter
drupal: A propos | Concepts généraux | Site officiel anglais
e-commerce: voir les principaux modules ubercart et e-commerce
erreur:
Fatal error: Allowed memory size...: mémoire php.ini voir dans php.ini, .htaccess; vérifier en allant sur votre site à l'adresse /admin/reports/status (Tableau de bord): le "Plafond mémoire de PHP" doit être à 32M ou plus.firefox: Firefox est un navigateur, un logiciel qui vous permet de naviguer sur le web. Son respect et son avance sur les standards (css, html...) en font un bon navigateur, mais son principal avantage vient de ses extensions qui le rendent configurable à souhait. Parmi les extensions intéressantes pour les webmasters, on peut citer Firebug, Webdevelopper, Colorzilla...
free: l'hébergement chez Free est déconseillé, autant pour la vitesse des serveurs, l'utilisation des url propres, les fonctionnalités générales... Drupal est performant: il serait dommage de le mettre sur des serveurs diminuant cette performance... Si vous voulez quand même installer Drupal sur Free
footer: pied de page, contenant en général des liens secondaires (parfois rappel de liens primaires du header, lien vers les mentions légales), un copyright... Le footer tendant à être de plus en plus gros, avec de nombreux liens.
formulaire: voir Concepts généraux: formulaire
front-page: page ne s'affichant normalement qu'une fois, à la racine même du site. Différent de la page d'accueil par son url et surtout son thème (c'est l'intérêt). Voir module front_page.
ftp: protocole permettant le transfert de vos fichier sur le serveur (filezilla est un des logiciels libres multi-plateformes, cyberduck pour Mac est assez simple)
hameçon: voir Concepts généraux: hameçon
header: bloc d'entête, contenant généralement la bannière du site ou les liens principaux
hébergement: voir Free, Ovh...
.htaccess: fichier de configuration d'Apache entre autres. Ce fichier est caché (d'où le point devant) et on peut l'oublier lors de transfert de fichiers (ftp, copier/coller...), ce qui peut provoquer des problèmes pour avoir des url simplifiées. Parfois le serveur créé un fichier .htaccess dans le répertoire "files", empêchant de voir nos fichiers (images...). Ne pas hésiter à éditer ce fichier (commenter la 1ère ligne qui devient alors une ligne du type: #SetHandler Drupal_Security_Do_Not_Remove_See_SA_2006_006)
hors-ligne: Drupal offre la possibilité de mettre notre site Hors-service en quelque sorte (Configuration du site>>Maintenance du site), le temps d'une Mise à jour du système, ou d'une réorganisation importante du site par exemple. Attention de ne pas oublier de remettre e site en ligne avant de se déconnecter ! Dans ce cas, il suffit d'aller à la page monsite/user ou monsite/?q=user pour se reconnecter en administrateur
installation de module: voir module:installation
lamp: solution wamp adapté pour linux (voir Ubuntu + Lamp...)
localhost
livre: voir Concepts généraux: livre
mamp: solution wamp adapté pour mac (site officiel); lire la doc sur drupal.org
menu: voir Concepts généraux: menu
méta tags; on peut utiliser le module nodewords pour remplir ces données
mise à jour
module: définition: voir Concepts généraux: module
module: choix ; on se demande souvent quel module pour ? Le site drupalmodules.com est fait pour cela ! On tape des mots-clé (en anglais) et le tour est joué. Voir une liste de modules indispensables.
module: installation (conseils généraux)
multi-domaines/multi-sites: voir le tutoriel
multilingue: mettre son site en plusieurs langue n'est pas une mince affaire. Pour mettre Drupal en plusieurs langues, on peut activer le module "locale". Pour mettre son site en multilingue (donc le contenu), il existe plusieurs solutions:
MySQL: un type basique de base de données. D'autres types existent comme SQLite, PostrgreSQL...
navigation: c'est typiquement un bloc sur la gauche de la page, contenant les principaux liens permettant la navigation du site, pour les visiteurs (Créer du contenu...) et les administrateurs (Administrer...) ou les utilisateurs enregistrés. Le module Admin menu remplace avantageusement (accès aux liens facilité, gain de temps) le bloc de navigation pour les administrateurs.
noeud (= node): voir Concepts généraux: noeud
off line -> voir Hors-ligne
ovh: quelques spécifications pour une installation de Drupal sur ovh en mutualisé
page: voir Concepts généraux: page
panneau: voir Concepts généraux: panneau
php: Hypertext PreProcessor
raport: tableau de bord. Ce tableau de bord (à l'adresse votresite/admin/reports/status) est à regarder régulièrement et présente les mises à jours disponible et les éléments nécessaires à la bonne marche de drupal (voir "register_globals", erreur allowed memory size...)
recherche
register globals: parfois, il faut ajouter dans le fichier caché .htaccess de son site, la ligne SetEnv REGISTER_GLOBALS 0 (pour un hébergement OVH par ex, voir Ovh); cette ligne doit être non commentée (pas de # devant)
[résolu]: si votre question posée sur le forum est résolue, merci d'éditer le titre de votre sur en ajoutant [résolu] devant
rôle: voir Concepts généraux: rôle
sauvegarde: faire une sauvegarde de son site:
sécurité: on peut s'inscrire pour recevoir un mail d'information quand une faille de sécurité est détectée et que cela nécessite une mise à jour (de Drupal et/ou certains modules personnels). Pour s'inscrire, il faut être inscrit à drupal.org, aller sur son profil et souscrire à la newsletter de sécurité dans l'onglet "Edit>>My newsletter". Certains mails peuvent concerner des modules que l'on n'a pas installer: simplement ne pas en tenir compte.
SEO: optimisation pour les moteur de recherche (Search Engine Optimization)
settings.php: ce fichier (/sites/default/settings.php)de configuration est capital pour le fonctionnement de votre site internet ET la mise en place de drupal sur ce même site. Il doit être protégé (en lecture seule) après sa mise à jour. Lors de l'installation de Drupal (6), il faut copier le fichier default.settings.php (et surtout laisser ce fichier de base inchangé, à sa place, sinon l'installation peut buguer, en tournant en boucle sans afficher de message d'erreur par exemple) et le coller à la même place, en le renommant en settings.php. La configuration de ce fichier indique l'emplacement de la BDD (base de données), de même que le login et mot de passe pour s'y connecter, et éventuellement la base url de votre site
spam (ou pourriel): communication électronique non sollicitée, en général dans les formulaires (de contact ou autre) dans un site. L'utilisation de module tel que captcha ou mollom contribuent à éviter de tels spams.
taxonomie: voir Concepts généraux: taxonomie
terme d'un vocabulaire: voir Concepts généraux: terme
thème: voir Concepts généraux: thème
traduction de drupal dans son propre site
traduction de son site: voir multilingue
traduction: participer à la traduction de drupal
Ubuntu + Drupal: voir ce lien dans la doc de la communauté francophone d'Ubuntu (qui tourne sous Drupal !)
Ubuntu + Lamp: voir ce lien dans la doc de la communauté francophone d'Ubuntu (qui tourne sous Drupal !)
upgrade -> voir Mise à jour
url:alias: permet de remplacer les urls (souvent du type /node/xxx) par des urls avec un nom significatif (du type /accueil...); il faut activer le module Path dans le Core-facultatif, puis renommer le urls en allant dans Administrer>>Construction du site>>Alias d'url. Pour infos, on n'utilise pas d'accents ni d'espace dans les url et plutôt des tirets pour séparer des termes (ex: /artiste/nom_prenom)
url simplifiée: basiquement, drupal met un "?q=" entre le nom de base du site et le reste d'une adresse url. On peut activer les url simplifiées en allant dans Administrer>>Configuration du site>>URLs simplifiées (/admin/settings/clean-urls). Il faut faire un test pour voir si le serveur accepte ces Urls (le serveur doit être en PhP5...). En savoir plus: clean url sur drupal.org [en]
utilisateur: voir Concepts généraux: utilisateur
vocabulaire: voir Concepts généraux: vocabulaire
vue: voir Concepts généraux: vue
Ce chapitre regroupe l’ensemble des documentations à revalider, corriger ou supprimer.
Cette méthode n’est plus valable ! Tinymce est maintenant intégré via wysiwyg.
TinyMCE est un module permettant la mise en place d’un éditeur de contenu WYSIWYG. Grâce à lui il devient simple de mettre en page ses contenus, aussi simple que d’utiliser un traitement de texte.
1 La phase classique
Téléchargez le module Drupal : http://drupal.org/project/tinymce
Décompressez le
Envoyez le via FTP dans votre Drupal, dans le répertoire /sites/all/modules où doivent être contenus les modules que vous installez.
2 La phase inhabituelle
Téléchargez le moteur de TinyMCE chez Moxie : http://tinymce.moxiecode.com/download.php
Décompressez le évidement
Envoyez le dans votre module TinyMCE créé lors de la phase 1.
Ce qui vous donnera un chemin comme : /sites/all/modules/tinymce/tinymce
3 Activation
Dans votre interface d’administration de votre site allez dans la construction des modules et activez Tiny
Allez ensuite dans la gestion des utilisateurs et éditez les rôles utilisateurs afin qu’ils puissent se servir de Tiny
Dans la configuration du site faites un tour dans TinyMCE et créez un profil d’utilisation, n’oubliez pas de l’attribuer aux rôles désirés.
Lors de la création de ce profil, dans «Basic Setup» passez «Default state» en true afin d’activer l’affichage par défaut de Tiny.
N’oubliez pas que Tiny met en page grâce aux balises HTML, pour que ce que vos contenus s’affichent tel que désiré le format d’entrée contenus doit être en Full HTML. Pour paramétrer cela par défaut allez dans Administrer > Configuration du site > Formats d’entrée et cochez Full HTML pour que ce format soit fixé automatiquement lors de la création d’un contenu.
D’autre part tous vos contenus créés avant cette modification concerveront leur format d’entrée initial. Il vous faudra donc éditer chaque contenu de ce type pour qu’il accepte le Full HTML.
4 Francisation
Téléchargez le pack contenant la traduction francophone ; http://tinymce.moxiecode.com/language.php
Décompressez la chose vous aurez alors les fichiers de traductions classés selon la même hierachisation que votre «sous-module»
Prennez votre mal en patience et envoyez chaque petit fichier dans le répertoire correspondant.
La tâche est longue, ennuyeuse et si vous faites une erreur d’innatention vous êtes bon pour tout recommencer.
Retournez dans la configuration de TinyMCE via l’administration de Drupal, éditez le profil de sorte que dans «Basic Setup» ce soit le français qui soit activé.
5 Boostez TinyMCE
Un outil supplémentaire permet de «compresser» Tiny et de le rendre plus rapide. Il s’agit de TinyMCE compressor.
ATTENTION : il se peut que cet ajout pose des problèmes sur certaines configurations (disparition de la barre d’outils, cf les nombreux posts plus bas), testez d’abord Tiny sans le compresseur pour vérifier que tout fonctionne correctement, installez le ensuite, si vous rencontrez des problèmes virez le.
Téléchargez TinyMCE compressor PHP ici : http://tinymce.moxiecode.com/download.php
Décompressez et envoyez dans /sites/all/modules/tinymce/tinymce/jscripts/tiny_mce
6 Régler d’éventuels problèmes de lisibilité (facultatif)
Tout est correctement installé mais votre interface texte de Tiny est toute noire et vous ne parvenez pas à lire ce que vous écrivez dans de telles circonstances…
C’est que Tiny se sert du fond de votre site comme fond de zone de saisie. Pas de panique, allez dans Administrer > Configuration du site > TinyMCE. Éditez les profils pour que dans «CSS» le champ «Editor CSS» l’apparence sélectionnez soit «tinyMCE default».
Sauvez les modifications et le problème est résolu.
Enjoy ! ;)
BBcode est un langage de balise simplifié qui permet de mettre en forme du texte et qui n’autorise pas l’exécution de scripts, ce qui en fait un langage de choix pour la publication de contenu sur les sites web.
Drupal ne propose pas le support de bbcode par défaut, mais il existe un module qui permet de combler cette lacune. Nous allons voir comment le mettre en oeuvre.
bbcode dans le répertoire module de votre installation de drupal. Ensuite rendez vous dans Administrer/module pour activez le module bbcode.
BBcode puis validez.
BBcode. La page qui s’affiche liste les différents filtres disponibles et vous devriez voir apparaître la ligne bbcode. Sélectionnez donc le filtre bbcode ainsi que Line break converter puis sauvez vos changements.
BBcode. La page qui s’affiche liste les filtres utilisés dans ce format d’entrée. BBcode doit être en bas de la liste sous «filtre HTML».
Un collection de tutoriels détaillant la réalisation avec drupal d’un besoin précis.
Les flux RSS permettent de récupérer des informations depuis un autre site pour les diffuser sur le votre. C’est très pratique quand l’on souhaite récupérer les news d’un site en particulier. Ici notre but est donc de récupérer un flux RSS puis de l’afficher dans un bloc.
Récupérer le flux RSS
Pour pouvoir gérer les flux RSS sous drupal, nous avons besoin d’activer le module aggregator qui est disponible en standard avec Drupal.

L’activation du module aggregator fait apparaître une nouvelle entrée dans le menu d’administration. Nous allons donc dans administrer/aggregator. Sur cette page, nous allons créer un flux en cliquant sur ajouter un flux.

Cette page va nous permettre de créer notre flux. Il nous faut entrer un nom pour ce flux et l’adresse du flux que nous souhaitons récupérer. L’intervalle de mise à jour est le temps qui s’écoulera entre deux mise à jour du flux sur votre site. Il est préférable de laisser un intervalle d’une heure. Si vous mettez un intervalle plus petit, vous risquez de vous faire rejetter par certains site. En effet sur certains sites, la demande est tellement importante qu’ils rejettent tous les sites qui leurs demande des mises à jour trop fréquente. Validez votre flux, et vous voyez apparaître la liste des flux ainsi que notre flux nouvellement créé. Pour le remplir il suffit de cliquer sur le lien «mise à jour des articles». Voilà notre flux est créé et se mettra à jour toutes les heures. Bien entendu la mise à jour se fait par cron, et donc vous devez avoir configuré cron ou utilisé un module qui se substitue à lui.
Affichage du flux
Actuellement notre flux est créé et accessible via http://votre.site/ ?q=aggregator. Mais nous souhaitons les afficher dans une boite. Nous nous rendons donc dans «administrer/blocs». Et là ô surprise une boite nommé dans notre exemple «flux alertes de sécurité…» a été créé. Il nous reste donc à l’activer et à choisir son emplacement. Il faut savoir que à chaque fois qu’un flux est créé, une boite associée l’est aussi.

Comment ajouter des liens dans le haut du site pour permettre une navigation aisée ? C’est très simple, sous drupal ces liens s’appels «liens primaires» et «liens secondaires». Ils peuvent être configuré en allant dans administrer/thèmes et ensuite dans «configurer». On peut alors soit les configurer dans les «paramètres globeaux» ou alors pour chaque thème si l’on souhaite que les liens soient différent suivant le thème utilisé.
Attention toutefois, certains thèmes ne prennent pas en compte les paramètres globeaux.
Le module Views permet, entre autres, de créer des blocs. Ceux-ci peuvent ensuite être insérés dans la mise en page depuis la page d’administration des blocs (/admin/block).
Malheureusement, les blocs ainsi générés afficheront toujours le même contenu quelle que soit la page sur laquelle ils s’afficheront. Cet article vous propose de créer un bloc dont le contenu sera filtré en fonction de la catégorie du noeud affiché.
Imaginons un site web discutant de football et donnant les résultats pour la France. D’un côté vous avez les équipes de football, chaque équipe étant rattachée à un(*) championnat (L1, L2, Nationale, CFA…) par le biais d’une catégorie «Championnat». De l’autre côté vous avez les résultats sportifs, chaque résultat étant également rattaché à un championnat. Il peut être intéressant d’avoir sur la page d’une équipe les résultats des autres équipes de son championnat.
Avec Views, créons une vue «bloc» qui affiche la liste des résultats sportifs (le but de cet article n’étant pas de vous apprendre à créer des vues, nous ne nous étendrons pas plus sur le sujet). Si nous la collons sur toutes les pages, elle affichera les résultats sportifs de toutes les ligues, indépendamment de la page où elle se trouve.

C’est là qu’interviennent les «arguments» de la vue. Dans la zone «Arguments» de la vue, ajouter un argument «Taxonomie : identifiant de terme». Dans la liste déroulante «Par défaut», sélectionnez «Retour Page non trouvée». Cela aura pour effet de ne pas afficher le bloc sur les pages ne répondant pas aux critères. Laissez les autres valeurs du champs vides.

L’astuce de cet article arrive maintenant. Tel quel, le bloc n’utilise pas les arguments car Views va traditionnellement chercher les arguments dans l’URL. Or, dans le cas d’un bloc, l’URL est réservée au noeud affiché et non au bloc lui-même. Donc pas d’argument.
Il faut utiliser la zone «Code de gestion d’argument».

Copier-coller le code suivant dans cette zone :
<?php
// Ne fonctionne que dans le cas d'une vue 'block'
if($type=='block') {
$vocabulary_id=1; // Vocabulaire rubrique
// Cela fonctionne uniquement sur les pages noeuds
if (arg(0) == 'node' && is_numeric(arg(1)) && is_null(arg(2))) {
// Récupère les termes du vocabulaire désigné pour le noeud en cours
$nid = (int)arg(1);
$terms=taxonomy_node_get_terms_by_vocabulary($nid,$vocabulary_id);
$tids=array();
foreach($terms as $term) {
$tids[]=$term->tid;
}
$ltids=implode(' ',$tids);
// Si la liste des termes n'est pas vide...
if(strlen($ltids)>1) {
$args[0]=$ltids;
}
}
}
?>Note : ne recopiez pas les balises d’ouverture et de fermeture de PHP.
Cet exemple récupère les termes du noeud principal (celui affichant dans le corps de la page) pour les passer en argument, c’est tout ! Pour le réutiliser, déterminez l’identifiant de la catégorie (ici l’ID n°1) et affectez-le à la variable $vocabulary_id.
Pour toute adaptation à vos besoins, le code a besoin uniquement de positionner la variable $args aux bonnes valeurs. Il s’agit d’un tableau indexé 0,1,2,3… où 0 est le premier argument tel qu’il est listé dans la zone «Arguments».
L’exemple prend en compte le cas des valeurs multiples. Pour les transmettre à la vue dans $args, il suffit de les mettre dans une chaîne séparés par des espaces (ex : «10 11 24 12»).
(*) Les puristes me pardonneront cet simplification pour l’exemple.
Le Blog est le «truc» à la mode sur internet depuis quelques mois. J’ai donc décidé de m’y mettre aussi et de voir comment Drupal pouvait m’aidé dans cette tâche.
Je partirais du principe que Drupal est correctement installé. Je m’attacherais donc à la configuration de Drupal pour une utilisation particulière : Le Blog.
Avant de nous lancer dans la configuration, essayons de voir ce qu’est un blog pour mieux cibler nos besoins.
Un blog est avant tout un site personnel où une personne expose ses idées, ses coups de gueules, bref ce qu’elle veut. On veut que les internautes puissent interagir sur le site par l’intermédiare des commentaires. Le but reste d’exposer son point de vue et de le partager, que les internautes puissent réagir.
Pour l’installation de drupal, je vous renvoie au document qui est présent sur ce site et qui traite de cette partie.
Je considère donc que vous avez réussi à installer correctement drupal sur votre serveur et que vous avez crée le premier compte qui servira de compte d’administration.
Par défaut, il n’y a que 6 modules qui sont activé dans drupal :
Donc dans le cas le plus classique, on va désactiver les modules page et story. Par contre on va rajouter les modules blog, search qui permettra à l’internaute de rechercher un mot clé sur votre blog, et je rajouterais le module path qui permet de renommer les liens des billets de notre blog. Par exemple au lieu d’avoir un numéro ce qui est le comportement par défaut de drupal, celui ci peut être nommé mon_premier_billet par exemple. Et aussi le module archive qui permet d’afficher un calendrier sur notre site.
Maintenant que nous avons sélectionné les modules dont nous avons besoin pour faire notre blog, nous allons attaquer la partie concernant les droits d’accès.
Dans un blog, ce qui est intéressant, c’est que les internautes puissent réagir à nos billets. Pour cela il est utile de permettre aux utilisateurs anonymes de pouvoir poster des commentaires.
Dans administrer/utilisateurs cliquez sur l’onglet configurer puis sur droits d’accès. Dans la section commentaires cliquez sur la première et les deux dernières cases. Normalement les deux colonnes doivent être identiques. Ceci a pour effet de permettre aux utilisateurs anonymes de poster des commentaires et de les poster sans approbation de votre part.
Toujours dans la configuration des utilisateurs, vous pouvez retourner sur l’onglet paramètres et choisir si oui ou non vous souhaitez que des personnes crée un compte sur votre site.
Pour avoir une meilleur lisibilité auprès de votre «auditoire», il est nécessaire d’organiser la publication de nos billets en catégories. Le module taxonomie (taxinomie en français) sert à cela.
Allez dans administrer/catégories. Sur cette page, sont listés les différentes catégories qui ont été crées sur ce site. Normalement, cette page doit être vide pour l’instant. Cliquez sur l’onglet add vocabulary.
Comme nom, mettez Sujets, dans Types sélectionnez entrée personnel au blog, puis cochez la case Requis. Ceci aura pour effet de nous obliger à choisir un sujet lorsque l’on voudra poster un billet sur notre blog. Validez vos choix en cliquant sur le bouton Soumettre.
Drupal doit alors vous renvoyer sur la liste des vocabulaires qui ont été crée. Cliquez maintenant sur ajouter un terme et choisissez un nom pour ce terme, ça peut être «Linux», «Littérature», ou tout autre nom de sujet que vous souhaitez aborder dans votre blog. Ajoutez autant termes dans Sujets que de sujets dont vous voulez aborder. (je sais c’est pas facile !)
Bien démarrer avec Drupal… qui n’a pas eu du mal à mettre une image dans son article ?
Et qu’on se le dise une bonne fois pour toute : il n’est pas nécessaire d’installer un quelconque module optionnel pour afficher des images avec Drupal.
Je vous le déconseille car si le site auquel vous vous référez, renomme ou supprime cette image, votre site va la chercher très longtemps (selon le navigateur que vous utilisez)… et votre site sera très lent !
Remarque importante :
Pour utiliser une image présente sur un autre site, vérifier que les droits sont disponibles. Autant vous pouvez généralement afficher sur votre site les logos de tel ou tel logiciel libre (par exemple celui de Drupal), autant une photo personnelle d’un autre site ce n’est pas sûr…
En général, il est conseillé de contacter par courriel le webmaster du site dont vous souhaitez ré-utiliser une image pour lui demander son accord et/ou de consulter les mentions légales du site qui indiquent peut-être les conditions d’utilisation (par exemple en citant l’auteur).
/files<img src="files/images/nom_du_fichier.ext" alt="texte_alternatif" /> Quelque soit le template que vous utilisez, les contenus (pages, articles…) sont généralement codés avec une balise de classe qui est class="node" (un forum c’est un div#forum).
Pour mettre en forme vos images, il suffit donc de modifier ou créer (selon le template utilisé) une ligne .node img.
Par exemple .node img {border: 1px solid #000000;} encadrera les images présentes dans tous vos contenus Drupal d’une bordure de 1px, continue et de couleur noire.
Pour avoir différents rendus des images présentes dans vos contenus sur votre site, vous pouvez ajouter un attribut class au code de l’image.
Par exemple : vous voulez que les images des contenus «articles» aient un rendu différent du précédent. Pour cela, dans les articles, le code html devient <img class="img_articles" src="files/images/nom_du_fichier.ext" alt="texte_alternatif" /> et vous ajoutez une mention css .node img.img_articles {border: 1px solid #ff0000;} qui encadrera les images d’un article d’une bordure rouge.
Bon à savoir…
/files qui peut poser problème… files : il est prévu pour accueillir, réunir tous vos documents type images, documents .pdf etc… files pour organiser votre contenu. Vous gagnerez un temps précieux quand vous souhaiterez trier ou mettre à jour votre site.(article initial http://herisson185.free.fr/ ?q=node/35)
La mise à jour vers la version 5.0 de Drupal est une mise à jour majeure.
Il est donc essentiel de suivre une procédure assez stricte au risque de devoir recommencer l’opération plusieurs fois. Il est également fortement conseillé de partir de la dernière version 4.7 afin de minimiser les problèmes. La mise à jour de 4.6 à 5.0 n’est pas supportée.
Pour réussir cette opération, on pourra s’appuyer sur la checklist suivante :
Le but est d’ici de «déconfigurer» le site le plus possible afin de minimiser les fonctions requises durant la mises à jour. Nous devrions donc avoir maintenant un site très simple, mais contenant toujours l’ensemble du contenu de l’ancien site. Il est donc possible de remplacer les fichiers par leurs nouvelles versions.
La mise devrait bien se passer vu que seuls les modules essentiels sont activés. Si c’est le cas, il sera ensuite possible de reconfigurer le site avec les urls simplifiés, les modules, etc…
Notez que certains modules n’ont pas encore été mis à jour pour Drupal 5 et c’est ce qui pourrait vous retenir de mettre à jour vos sites. Au moment d’écriture de cet article, Les modules codefilter et captcha n’ont même pas de version CVS pour 5, le module image n’est pas encore très stable. Il est de toute façon toujours préférable de vérifier la disponibilité de vos modules préférés avant de faire le grand saut.
Drupal 5 permet l’utilisation de deux thèmes distincts pour la zone publique et la zone administration. Par défaut le thème d’admin est configuré pour refléter le thème publique. Avant de tester votre thème, je conseille de changer le thème d’admin sur garland afin de ne pas se retrouver coincé si votre thème nécessite une mise a jour du code.
Merci à Zmove de m’avoir dépanné sur www.drupal.org.
J’avais beau essayé toutes les combinaisons possibles, je n’arrivais pas à faire passer au sein d’un panel (du type node/%) le terme d’un node comme argument dans une view. ( en clair, j’affichais un node et je voulais que la view sur la barre de droite affiche des contenus en rapport avec le terme principal du node )
Il suffisait en fait de supprimer la view’spane et de la réinsérer.
Ca a l’air de rien comme ça, mais j’ai perdu des heures à me fourvoyer.
J’espère que ça aidera quelqu’un.
(je n’ai pas vérifié si ces informations étaient également valables pour les versions 5 et 6. Je ne pense cependant pas qu’il y ait de gros écarts)
Drupal dispose d’un mécanisme de cache évolué (mise en mémoire d’informations précédemment calculées). Tellement évolué qu’il n’est pas toujours évident d’en comprendre le fonctionnement.
Il faut tout d’abord distinguer 2 niveaux :
N’importe quel module peut utiliser le cache pour son propre usage au moyen des fonctions cache_set et cache_get. N’importe quel type de données peut être stocké dans le cache, que ce soit du code HTML, du XML ou encore des données binaires. Tout module effectuant des calculs ou des requêtes complexes peut tirer parti de ces fonctions.
Le cache de page travaille au niveau supérieur : c’est carrément la page entière et ses entêtes HTTP (headers) qui sont stockées.
Notes :
La page admin/settings permet d’activer ou désactiver le cache de page et d’indiquer la durée de vie minimum d’un élément du cache. Ces deux paramètres ne sont pas liés directement. La durée de vie minimum est utilisée même si le cache de page est désactivé puisque le cache de page n’est qu’une utilisation particulière du cache de Drupal.
Cette durée indique le temps pendant lequel Drupal conservera un objet dans le cache. Tant que cette durée ne se sera pas écoulée, l’objet sera resservi. Si l’objet est redemandé au-delà de cette durée de vie, il sera recalculé.
But : obtenir une hiérarchie de pages accessibles via les liens primaires.
- Accueil
- L'association
-- Statuts
-- Membres
- Projets
-- Connectez-vous
- Liens
- ContactPrenons l’exemple ci dessous :

Nous y voyons en haut un menu contenant 5 liens qui sont : Accueil, L’association, Projets, Liens, Contacts. Le menu utilisé est celui appelé Primary links ou Liens Primaires en Français. Grâce à cela nous auront la possibilité d’afficher notre menu dans le thème de notre site.
Premier exemple : le lien Accueil
Le lien Accueil pointe tout simplement sur la page d’accueil. Pour le créer, nous allons dans administrer/menu, puis on va cliquer sur ajouter un élément de menu
On se retrouve alors avec le formulaire suivant :

<front> renvoi vers la page d’accueil)Il ne nous reste plus qu’à cliquer sur le bouton Soumettre
L’élément Contact à été crée de la même manière. Nous avons mis Contact dans le champ «Titre» et contact dans le champ «Chemin» (le formulaire de contact est habituellement accessible via l’URL http://monsite.com/?q=contact)
Deuxième exemple : l’élément L’association
L’élément L’association est une page crée avec drupal et que l’on va ancrer dans le menu Primary links. Pour cela allons dans créer un contenu/page Nous nous retrouvons alors avec le formulaire classique de création de contenu que nous allons remplir de manière classique. Nous allons aussi nous intéressé au bloc Paramètres de menu (cliquez sur le lien pour ouvrir le bloc si ce n’est pas déjà fait). Et là, ho surprise nous retrouvons exactement le même formulaire que dans notre premier exemple.
Les éléments Projets et Liens ont été crée de la même manière. Nous obtenons donc le menu suivant :
- Accueil
- L'association
- Projets
- Liens
- ContactTroisième exemple : les éléments de second niveau (ou sous-menus)
Nous allons crée une nouvelle page comme précédemment, nous rendre ensuite dans le bloc Paramètres de menu, mettre le titre, la description, et choisir comme Elément parent L’association

Et voilà ! nous avons notre premier sous-menu. Nous pouvons faire de même avec d’autres pages, ou même encore faire des sous-sous-menus…
Nous venons de créer une hiérarchie d’éléments contenus dans le menu Primary links. C’est bien, mais ce qui est encore mieux c’est de les afficher dans un bloc. En effet même si nous pouvons afficher le menu Primary links sur notre site, grâce à notre thème, nous ne pouvons pas accéder aux sous menus.
Première méthode :
La première méthode est la plus simple à mettre en place car elle fait appel à un bloc qui est fourni par drupal.
Nous nous rendons dans administrer/blocs et nous activons le bloc Primary links en cochant la case.

Nous obtenons alors un bloc contenant notre hiérarchie et laissant entrevoir les sous-menus.

Deuxième méthode :
Cette deuxième méthode tiens compte du fait que l’on peut déjà afficher le premier niveau de notre menu par l’intermédiaire du moteur de thème (et de la variable $primary_links pour PHPTemplate). En effet si le premier niveau de notre menu est affiché, à quoi sert il de les afficher à nouveau dans notre bloc. Nous voulons que lorsque nous nous trouvons sur une page de premier niveau, un bloc affiche uniquement les sous menu de cet élément.

Pour obtenir ce résultat rendons nous dans la page d’administration des blocs (administrer/blocs) puis cliquer sur ajouter un bloc. Nous arrivons sur le formulaire de cration d’un bloc, et nous aloons remplir le corps avec le code php suivant :
<?php
$secondary_links
= menu_secondary_links();
if (is_array($secondary_links)) {
$output = "<ul class=\"menu\">";
foreach ($secondary_links as $link) {
$output .= "<li class=\"leaf\">".$link."</li>";
}
$output .= "</ul>";
}
return
$output;
?>remplissez les autres champs (Description, titre) et sélectionnez PHP Code comme format d’entrée. Il ne reste plus qu’à valider et à activer le bloc.

Il reste une denière chose à faire : s’assurer que les paramètres des menus sont correcte. En effet pour afficher notre bloc, nous faisont appel aux liens secondaires. Nous devons, pour obtenir le comportement voulu, configurer les liens secondaires de sortes qu’ils soient des sous menus des liens secondaires. Nous allons donc dans administer/paramètres/menus
et mettre le champs Liens secondaires comme sur la capture.
