Résumé
Dans ce billet, nous décrivons certains des problèmes auxquels font face les projets logiciels de grande envergure ou complexes qui utilisent les outils d'extension de types de contenu CCK de Drupal. Nous proposons ensuite une solution sous la forme de CoCKTaiL, un langage de haut niveau pour les types CCK ainsi que les éléments d'interface et les relations qui s'y rattachent. Les outils et les applications possibles seront décrits dans des travaux futurs.
Introduction
Le Content Construction Kit (CCK) de Drupal est une fonctionnalité puissante, très appréciée des développeurs Drupal, qui s'en servent pour définir rapidement les types de données et les relations de leurs applications. À l'aide d'une interface, les développeurs peuvent facilement créer de nouveaux types de contenu en précisant des champs, des widgets d'interface, des relations, et plus encore.
La possibilité de créer de façon interactive de nouveaux types et les interfaces qui les accompagnent fait gagner beaucoup de temps dans les premières étapes de nombreux projets de développement Drupal.
Pour les projets de plus grande envergure, toutefois, la nature du processus de conception et de mise en œuvre des types CCK rend difficiles l'évolution et la maintenance des projets qui comprennent des composants CCK, et ces difficultés contribuent au coût du cycle de vie des grandes applications Drupal.
Parmi les défis :
- spécifier les types CCK de façon succincte et précise
- importer et exporter les types CCK et les données vers et depuis des instances Drupal
- versionner les changements à la configuration CCK des instances Drupal
- migrer les données entre différentes versions d'applications Drupal, et/ou vers des sites Drupal ou hors de ceux-ci
- comprendre et manipuler le modèle de données d'applications complexes fondées sur CCK
- valider les implémentations CCK par rapport à des exigences externes
- créer et modifier des structures de types fondées sur CCK de façon rapide, précise et reproductible
- générer automatiquement des types CCK et le code qui les soutient à partir de descriptions de haut niveau
- et bien d'autres...
Exemples de problèmes avec le CCK actuel
Hé, qui a changé la définition CCK?
Si vous avez travaillé en équipe à la construction d'un site comportant beaucoup de types CCK, vous avez peut-être eu le bonheur de découvrir qu'une définition de type avait mystérieusement changé. Le temps de découvrir qui a fait le changement et pourquoi, et quel est l'impact sur votre code, une demi-journée s'est écoulée.
Il nous faut les définitions CCK du site X, mais avec un nouveau userref dans tous les types et des titres différents pour certains types!
« Bien sûr, pas de problème. On va exporter les champs un par un, puis les importer et faire les changements sur place. » Pendant ce temps, le temps passe...
On m'a remis un magnifique diagramme entité-relation qui précise tous les types dont nous avons besoin, leurs champs et leurs relations... et maintenant?
Ne serait-ce pas bien de pouvoir traduire cela en une spécification de haut niveau qui générera le CCK pour vous?
Présentation de CoCKTaiL
Une solution possible à plusieurs de ces problèmes serait une représentation « de haut niveau » adéquate des types CCK, pour la description, la modélisation, l'échange et l'automatisation de la conception et de la construction, rédigée dans un langage de types formel.
J'ai travaillé sur un tel langage, que j'ai appelé CoCKTaiL (pour CCK Type Language); l'un de mes objectifs a été de m'assurer que CoCKTaiL :
- permet des définitions complètes et précises des types CCK, des éléments d'interface, etc.
- est compact
- est indépendant du langage d'implémentation
- est une représentation textuelle (fonctionne avec le contrôle de versions et les outils d'édition de texte)
- possède une syntaxe (hors contexte) formellement spécifiée pour la génération et l'analyse automatiques
- les options « nulles » correspondent à des valeurs par défaut raisonnables
- est lisible et rédigeable par un humain
- est familier? (quels sont les équivalents?)
- est extensible, pour gérer les extensions de CCK
- ajouter des productions à la grammaire, des extraits et des règles au générateur de code
- chaque module de type CCK inclurait des extensions (hooks?)
- est bien soutenu par des outils :
- un analyseur syntaxique
- un validateur
- un « mélangeur » CoCKTaiL (UML -> CoCKTaiL)
- un générateur de types CCK (CoCKTaiL -> code CCK)
- un décompilateur de code CCK (CCK -> CoCKTaiL)
- est une cible appropriée pour la traduction automatique vers et depuis UML : (p. ex. UML -> CoCKTaiL -> code CCK, et aller-retour?)
Exemples
Voici un exemple de ce à quoi pourrait ressembler une définition de type spécifiée au moyen de CoCKTaiL. (Comparez la facilité de taper ceci au temps nécessaire pour le générer au moyen de l'interface utilisateur de CCK.)
// CoCKTaiL Type definition for Client info
type 'Client info' {
description 'Basic information about a client';
title_label 'Name';
body_label 'Description';
status false;
comment 2;
group 'Contact info' {
style fieldset;
description 'Contact info for Client';
display_label inline;
field text 'Street address 1' {}
field text 'Street address 2' {}
field phone 'Home phone' {}
field phone 'Mobile phone' {}
}
field textarea 'Notes' {}
}
Prochaines étapes
Dans mon prochain billet, je décrirai une grammaire formelle (LALR(1)) qui décrit CoCKTaiL, ainsi que quelques outils que j'utilise pour développer un validateur, un générateur de code et d'autres outils.