Modèle conceptuel de données

Hiérarchie des noeuds
Tout tourne autour de l'entité recursive "Node" qui a un rôle central. Elle décrit l'assemblage d'une page web à la manière du DOM mais en plus simple. Chaque entrée correspond à une partie du HTML.
Il devient possible de modifier la construction d'une page. Vous trouvez que le fil d'Ariane (breadcrumb) est inutile à côté du menu et vous préféreriez qu'il se trouve dans le pied de page? Remplacer juste son parent par le footer.

Noeuds communs et spécifiques à une page
Un noeud peut faire partie d'une ou d'aucune page (relation 0,1). Si le champ "page_id" vaut NULL, le noeud sera commun à toutes les pages (il s'agit de head, header, main, footer, nav et breadcrumb). Dans le cas contraire (blocs de page, articles), on le retrouvera en plusieurs exemplaires dans la table avec des données différentes. Je ne suis pas complètement satisfait de ce fonctionnement mais ça fonctionne.
Il y a une relation 1,1 entre Node et NodeData qui est justifiée par le fait que les données y ont des natures différentes. Node détermine l'assemblage du HTML et NodeData fait ce que son nom suggère. De la même manière, Article contient le contenu HTML des articles générés par TinyMCE et est reliéaux entrées post et news dans Node, un article est donc déplaçable et supprimer son noeud n'en supprime pas le contenu.
Le champ "position" dans Node permet de déterminer l'ordre d'affichage d'éléments de même parents. Tous les noeuds sont affectés par ce réglages à l'exception des articles de type "news" qui affichés par ordre chrono ou antichronologique. Le système de pagination fonctionne avec les deux manières d'order les articles.
Hiérarchie des pages
l'Entité Page est elle-aussi récursive. Deux classes utililitaires Menu et Path permettent: la première d'instancier les classes Page imbriquées qui serviront à générer le menu en lisant toutes les entrées pour lesquelles "in_menu" vaut 1 (c'est à dire la plupart), la seconde d'obtenir le chemin d'une page sous la forme d'un tableau PHP et d'une chaine de caractère (regardez dans la barre d'adresse).

