Maintenant que nous avons nos outils, il est temps de nous mettre au codage. Là encore, le scénario proposé est le fruit de mes années de développement.
Jusqu'à présent, nous avons identifié les différents cas d'utilisation à coder. Dans l'étape précédente, nous avons défini, puis installé (là, je n'ai pas décrit...), les outils dont nous avons besoin. Le serveur web est opérationnel, la base de données, bien que vide pour le moment, est créée.
Le premier cas d'utilisation à coder est sur la table. La première étape consiste à le découper en modules.
Voici une vision synthétique de l'ensemble des opérations à réaliser pour :
Dans cet exemple, le module affiche d'abord une boite permettant de sélectionner des critères de recherche, puis la liste des personnes correspondantes. La sélection d'une fiche permet d'accéder à son détail, puis de passer en modification. Après modification, on retourne aux critères de recherche.
Pour bien comprendre le fonctionnement, voici un diagramme de séquence qui s'intéresse uniquement à l'affichage de la liste, à partir des critères de recherche préalablement définis. Les critères de recherche sont stockés dans une classe.
Dans cet exemple, le module récupère la liste des critères de recherche, qu'il transmet à la classe Personne. Celle-ci prépare une requête SQL. Les données récupérées sont ensuite transmises à la classe chargée de l'affichage.
Une fois toutes les données transmises, le module déclenche l'affichage de la page web.
Vous pouvez utiliser le même principe pour quasiment toutes les modules.
Ainsi, pour notre cas d'utilisation « saisir une fiche », nous avons au minimum les modules suivants :
Il y a quelques années, je regroupais plusieurs modules en un seul : affichage du formulaire, enregistrement des modifications, et suppression. J'ai arrêté, et suis revenu à une segmentation plus fine. En effet, même si ce n'est pas forcément évident quand on commence le codage, les droits attribués sont différents selon ce qu'on veut faire :
Si vous regroupez tout en un seul module, la gestion des droits va devenir très complexe, et vous aurez du mal à vous intégrer totalement dans votre framework.
De quelles classes avons-nous besoin ? Dans l'exemple précédent, on peut mettre en évidence deux classes propres à l'application :
Le schéma ci-dessus présente quelques classes fournies par le framework PrototypePHP (http://prototypephp.sourceforge.net/) :ObjetBDD, qui s'appuie sur ADODB pour l'accès à la base de données. ObjetBDD est hérité en Personne.
Il n'est pas obligatoire de créer une classe par table de la base de données. On le fait en général pour les tables porteuses d'informations spécifiques, mais ce n'est pas forcément pertinent pour les tables porteuses de relations N-N : elles peuvent parfaitement être traitées par la table principale qui les gère (vous pouvez consulter à ce sujet cet article : http://www.linux-professionnel.net/programmation/base-de-donnees-objet-et-acces-aux-tables ; il ne répond pas tout à fait à cette problématique, mais n'en est pas très éloigné).
En gros, ne confondez pas base de données et modèle objet : même si, au niveau des schémas, ils peuvent se ressembler, dans la pratique, ils fonctionnent différemment.
Avant toute chose, je vous conseille la lecture du livre blanc édité par SMILE : http://www.smile.fr/Livres-blancs/Culture-du-web/Conceptions-d-applications-web. Vous y trouverez de nombreux conseils pertinents.
L'ergonomie d'une application de gestion n'est pas forcément aussi sensible qu'un site marchand. Néanmoins, le respect de certaines règles va permettre à vos utilisateurs de s'y retrouver rapidement, et de savoir l'utiliser avec un minimum de formation.
À contrario, une application « mal fichue » va être difficile à appréhender, et nécessitera une formation particulière, ne serait-ce que pour comprendre comment elle fonctionne. J'ai eu, à ce sujet, une expérience assez désastreuse. Un nouveau logiciel est en cours de déploiement au sein de certaines administrations publiques. Le programme a été construit en recourant à du Javascript, très probablement à partir d'un atelier logiciel probablement performant. Mais l'ergonomie retenue est incompréhensible : en tant qu'informaticien, je n'ai pas été capable d'arriver à la faire fonctionner sans qu'on m'explique comment il fallait l'utiliser ! Imaginez ceux qui n'ont pas l'habitude de manipuler l'outil informatique...
D'une manière générale, il vaut mieux conserver l'ergonomie générale du web et éviter de copier l'interface Windows. Cela peut se traduire ainsi :
Critères > liste > détail fiche > modification
On pourrait continuer longtemps mais, pour résumer : faites simple, évitez les fioritures ou les « astuces », mettez vous à la place de l'utilisateur. Pensez également que tout ce qui est complexe à écrire est complexe à maintenir.
Avec l'arrivée de navigateurs compatibles HTML5, le javascript a pris de l'ampleur, et est de plus en plus associé aux pages web. Mais, là encore, utilisez-le à bon escient, quand il apporte vraiment quelque chose. N'oubliez-pas que si vous intégrez du javascript spécifique dans une page, la maintenance en sera plus complexe.
J'utilise actuellement le javascript pour :
Pour de plus amples informations sur ce que j'ai mis en place, je vous invite à consulter la page suivante : http://www.linux-professionnel.net/programmation/integrer-html-javascript-et-css-dans-une-application-php.
N'hésitez pas à utiliser des bibliothèques Javascript, qui vous éviteront de tout avoir à réécrire. JQUERY (http://jquery.com/) dispose de nombreux modules faciles à rajouter, et est particulièrement riche. Il existe également le couple Prototype/script.aculos.us (http://prototypejs.org/, http://script.aculo.us/) qui est aussi très réputé. Ces deux bibliothèques fonctionnent différemment mais, là encore, c'est une affaire de goût... et de mode.