Je ressors un chantier que j'avais évoqué il y a quelques temps : la
suppression des catégories du core, ainsi que des méta-données, ainsi que
du plugin tags, au profit d'un plugin "taxonomy".

Les raisons de ce chantier :
* Après tout, une catégorie, c'est une métadonnée comme une autre
* On n'a jamais pu faire un multi-catégories propre sans tout casser,
puisque cela impliquait un changement en base
* Le modèle en base des métadonnées est trop restreint : impossible de
définir l'url d'un tag donné, ou de mettre une déscription à un tag,
impossibilité de hiérarchiser les tags, ...

D'où le ticket #1012, ayant pour but d'harmoniser les 2 dans un plugin
taxonomy. J'avais regardé à l'époque les modèles de drupal et de WP, sans
pour autant être 100% convaincu par l'un des 2. notamment pour la partie
hiérarchie, où il serait dommage d'abandonner le principe de "nested sets"
que dotclear utilise.

J'avais donc opté pour le modèle de données suivants en 3 tables (sauce
_instal.php) :
$_s = new dbStruct($core->con,$core->prefix);

$_s->taxvoc
->blog_id ('varchar', 32, false)
 ->voc_id ('bigint', 0, false)
 ->voc_name ('varchar', 40, true)
 ->voc_url ('varchar', 255, true)
 ->voc_lurl ('varchar', 255, true)
 ->voc_desc ('text', 0, true)
 ->voc_options ('bigint', 0, false)
 ->voc_weight ('bigint', 0, false)
 ->post_type ('varchar', 32, false, "'post'")
 ->primary('pk_voc','voc_id')
;
$_s->taxterm
 ->term_id ('bigint', 0, false)
 ->voc_id ('bigint', 0, false)
 ->term_url ('varchar', 255, true)
 ->term_name ('varchar', 255, false)
->term_desc ('text', 0, true)
 ->term_weight ('bigint', 0, false)
 ->term_lft ('integer', 0, true)
 ->term_rgt ('integer', 0, true)
 ->primary('pk_term','term_id')
;
$_s->taxpost
 ->post_id ('bigint', 0, false)
 ->term_id ('bigint', 0, false)
 ->primary('pk_tp','post_id','term_id')
;

Décryptons :
* Dès qu'on veut définir une manière de classer les billets (catégorie,
tag, autre), on définit un vocabulaire (table taxvoc): on définit alors :
* Son nom (exemple : "tag", ou "catégorie")
* l'url de base ("slug" pour nos amis de chez WP) des pages publiques pour
chacun de ses termes. ex : "tag/"
* l'url de base de la page qui  liste les termes. ex : "tags/"
* ses options, où on indique : si on autorise les valeurs multiples, si on
autorise les hiérarchies de termes
* le post_type associé s'il y en a un

le terme est lui le nom de la métadonnée/tag ou de la catégorie,
appartenant à un vocabulaire. On y retrouve les nested sets chers à
dotclear pour les hiérarchies, le slug pour définir l'url du terme

et on retrouve une table d'association post <-> term.

C'était un début d'ébauche, à discuter, et si certains s'en sentent
l'envie, yapluka :)

--
Bruno
_______________________________________________
Dev mailing list - [email protected] - http://ml.dotclear.org/listinfo/dev

Répondre à