[CMS] Aspirine - Le CMS sans maux de têtes

Présentez ici vos projets hébergés sur LegTux.
Répondre
Avatar du membre
Aspirine
Messages : 1
Enregistré le : 15 oct. 2012 20:05
Compte LegTux : aspirine
Contact :

[CMS] Aspirine - Le CMS sans maux de têtes

Message par Aspirine » 16 oct. 2012 00:08

Bonjour,

Je viens vous présenter un des deux projets sur lesquels je bosse actuellement. Aspirine est donc un CMS (Content Management System pour rappel) et le développer me permet en même temps de créer ma plate forme participative.
Je fais ainsi d'une pierre deux coup puisque des besoins pour celle-ci se transforme en fonctionnalités pour Aspirine, et inversement.

Une présentation dans les règles de l'art s'impose.

:arrow: Genèse
-------------------------------------

Pourquoi encore un CMS ? Et pourquoi se lancer dans un truc pareil juste pour créer un site ? Pourquoi ne pas utiliser un CMS existant ?
Houlala pas tant de questions à la fois s'il vous plait.

En fait mon premier CMS je l'ai commencé en 2006 il s'appelait z'Indek. Je voulais qu'il ne soit qu'un squelette auquel on grefferait des plugins pour élargir ses possibilités. Mais je manquais sérieusement de compétences en php alors....j'ai arrêté. Comme j'avais justement besoin d'un blog a ce moment là, et qu'un mai aussi, ainsi qu'un autre, en quelques soirées j'ai codé z'Blog, mon premier CMS abouti. Bon il était très rudimentaire, en php4 procédural, du code très sale. Mais il y avait quand meme pas mal de trucs sympa, page d'accueil personnalisable, page auteur, categories articles et commentaires, permalink, menu modifiable, recherche, liens favoris, bbcode captcha....c'était quand meme dejà pas mal.
Mais heureusement que peu de personnes l'ont utilisé parce que....c'était vraiment de la merde quand meme.
Pourquoi pas utiliser Wordpress ou Doctlear ? Mais parce qu'on ne construit pas une maison de paille avec une grue de 100 étages bien sur. En d'autres termes, ces deux là sont de vraies usines à gaz. Pourquoi pas Pluxml ou 99Ko ? Parce que le premier je ne comprenais rien a son code, et donc en l'état je ne pouvais pas le modifier, et que le second n'était pas encore là.

Puis la vie m'a appelé ailleurs et mon esprit s'est éloigné de php jusqu'en 2009, ou j'ai eu besoin de reprendre le php pour un boulot. J'ai bien entendu repris zBlog, mais en passant par la case apprentissage de la POO. Fort de ces nouvelles connaissances (à tort) j'ai donc voulu créer quelque chose de plus...complet. Apres tout a ce point là c'était juste un moteur de Blog, rien de transcendantal. Au moins zWeb serait un vrai CMS, avec de vrais contenus divers, un vrai système de plugins, etc. Sauf que non, vraiment, toujours pas les capacités pour le coder. J'ai donc trébuché pendant des années, quittant, revenant, avançant, quittant. En 2011 je repars de zéro et en l'espace de quelques jours zWeb renait de ses cendres, je gribouille des dizaines de pages, je conçois avec minutie les détails de la machinerie. Las, la vie encore m'appelle ailleurs.
Mi-2012, mon autre dada -la philosphie idéologique-, me donne envie de créer un site comme feu un autre l'a été, en beaucoup plus évolué. Et pour ca....je repars de zéro aevc les acquis de zWeb. Un week end suffit à remplir un cahier des grandes lignes du projet, tout est concu : système de contenu, gestion des templates, des plugins, des utilisateurs, des hooks, du menu, fil d'ariane, etc. Depuis je code, et meme si sur mon espace legtux il y a surtout des erreurs de require() et des {VARS} oscures, c'est d'abord parce que le contenu qui est géré par le moteur n'existe pas. Parce que le moteur lui est là, et il fonctionne à merveille. En fait tout marche.

Alors au final pourquoi encore un CMS ? Pourqoi pas Joomla ? SpIP? Dotclear ? Wordpress ? Drupal ?
Parce que mes compétences ne sont toujours pas celles là, parce que je ne veux pas utiliser un outil que je ne maitrise pas. Parce que ces CMS, aussi exceptionnels soient ils, sont toujours des mastodontes et des monstres.
Au moins avec Aspirine, je connais tout sur les bouts des doigts. Je connais ses capacités, je sais comment gérer ses contenus, et surtout j'aime sa simplicité, sa souplesse et ses possibilités.

:arrow: Fonctionnalités
-------------------------------------

Aspirine c'est quoi ?
En tant que CMS voici ce qu'il peut faire.

:!:A. Les pages

De base Aspirine gère 3 pages. L'index, l'admin et la page d'erreur. Elles ne peuvent être supprimées. Il est possible de rajouter autant de pages que voulu bien entendu.
Mais Aspirine gère ses pages d'une facon particulière. En fait, chaque page est associée uniquement à un template html. Dans ce template, on peut donc mettre du statique. Mais on peut assi mettre du dynamique. Comment ?
Grâce aux boites de contenus :

:!: B. Les Boîtes de contenu

C'est un concept que j'ai imaginé, et choisi, quand je cherchais justement comment intégrer plusieurs contenus de nature variées sur une meme page, ou un seul meme sur plusieurs. Par exemple : je veux pouvoir lister les derniers articles du blog sur toutes les pages dans le footer, ou je veux pouvoir mettre un message d'accueil dynamique sur la page d'index. C'est là qu'interviennent les boites de contenu, et les {VARS}.
C'est très simple, je crée une boite de contenu qui va lister ces derniers articles, ou un slider, ou ce fameux message d'accueil dynamique, et je l'appelle quelque chose comme blog_review ou slider ou welcome_bar. Ensuite, dans le template html, je n'ai qu'à mettre {BLOG_REVIEW} ou {SLIDER} ou {WELCOME_BAR}. Dans le panel admin, pour ces contenus je spécifie, la ou les pages ou il doit apparaitre, et automatiquement à l'affichage de la page, le résultat de cette Box (c'est le nom dans le code) se substitue à cette {VAR}.

Il y a 4 types de Boxes :
- coreBoxes
- craftedBoxes
- simpleBoxes
- complexBoxes

Elles sont ici listées dans leur ordre hiérarchique. En fait, chaque type de boites de contenu peut utiliser les {VARS} du type de contenu inférieure. Par exemple vous pouvez appeler une craftedBoxes dans une simpleBoxes, et ces deux la dans une complexBoxes. Mais pas l'inverse. En réalité oui c'est possible, mais il y a risque d'avoir des {VARS} ignorées.

- les coreBoxes sont responsables des {VARS} natives d'Aspirine. Elles permettent d'utiliser partout dans les contenus (mêmes les 3 autres types) des {VARS} comme {USER_NAME} ou {ARIANE_LVL1} ou encore {DATE_HOUR}.

- les craftedBoxes sont elles des contenus créés depuis le panel admin. Elles ont un fichier de configuration spécifique qui définit la requete à utiliser, le(s) sous-template associé(s), et comment intégrer tout ca. Par exemple :

Code : Tout sélectionner

<?php

// - $name    = nom complet du type de contenu
// - $template   = noms du template a charger
// - $req      = requete à préparer pour ce contenu
// - $cache   = noms des cache spécifique à chaque req ci dessus (utilisation de variables tels que {ID} pour définition de nom dynamique
// - $replace   = remplacement des {VARS} du template avec les valeurs des données récupéres + actions dessus si nécessaire
// - $hooks   = méthodes et classes ajoutées qui viennent éditer le contenu apres construction (array('objet1' => 'classe1','objet2' => 'classe2')
// autant d'items au tableau que de hooks dispo pour ce contenu

$config['name']         = 'Review du Forum';
$config['template']      = 'item';
$config['req']         = array(
                     select'   => array('id_content','name_content','id_user','name_user'),
                     'from'   => array('contents'),
                     'join'      => array('users' => 'contents.author_content@users.id_user'),
                     'where'   => array('type_content = "forum"'),
                     'order by'   => array('posttime_content@DESC'),
                     'limit'   => array('0,10')
                  );
$config['cache']      = 'review_forum';
$config['replace']   = array(
                  '{LINK}'       => array('id_content',    array('before@?page=forum&amp;lire=','topermalink@name_content')),
                  '{AUTHOR}'       => array('id_user',    array('switchfield@name_user')),
                  '{NAME}'       => array('name_content',    array('truncate@40@...')),
                  '{FULL_NAME}'    => array('name_content'),
                  '{TOOLTIP}'    => array('id_user',      array('replacevalue@tooltip'))
               );

$config['addafteritem'] = '';
$config['hooks']      = array();
?>

Ce fichier peut être modifié manuellement ultérieurement dans le panel admin, aux risques et périls de l'administrateur, si besoin est.

- les simpleBoxes portent bien leur nom, elles ne sont que du contenu html dans un fichier de config.

- enfin les complexBoxes sont un niveau à part. Elles sont la véritable forme de ce qu'on appelle plus couramment des plugins. Par exemple, Aspirine n'a pas, par défaut, de blog. Pas de prob, codez un blog dans une complexBox, en utilisant l'environnement d'Aspirine comme la mise à jour du fil d'ariane ou l'utilisation des {VARS} des autres types de boxes, et voilà. Il n'y a plus quà :
- créer une page Blog
- ajouter le lien au menu
- mettre la {VAR} correspondante dans le template de la page
Et vous avez un blog sur votre site. Evidemment après, il suffit de compter sur la communauté pour créer des complexBoxes, ou "plugins" pour rajouter une infinité de possibilité.
Mais une complexBoxe peut aussi ne pas etre une page ! Un slider par exemple, peut utiliser une craftedBox pour générer son contenu, et ensuite le traiter dans une complexBox (merci 'extends' de php5), pour l'afficher au sein d'une page ou sur toutes si voulu...

:!: C. Fil d'Ariane

Aussi appelé Breadcrumbs (les fameuses miettes de pain du petit poucet), le fil d'ariane permet au visiteur de pouvoir se situer en tout temps dans la structure du site. En natif, une coreBox gère deux niveaux : l'accueil, et la page. Mais ensuite, les pages et les Boxes sont libres de rajouter trois autres niveaux. Par exemple sur la page d'amin, qui est une complexBox, on rajoute la catégorie sur laquelle on se trouve, et le mode dans lequel on est (par exemple page admin > catégorie configuration > mode base de données). Le dernier niveau est le plus souvent Lecture ou Ecriture ou autre.
Si le script ne détecte pas de troisième niveau en fin d'exécution, il rajoute ce dernier niveau standard automatiquement.

:!: D. Gestions Utilisateurs

Aspirine gère les utilisateurs. Il permet 5 niveaux de droits : Fondateur, Admin, Modérateur, Membre, Visiteur. Il permettra aussi la gestion de groupes. Ces profils sont utilisables partout, les complexBoxes n'ont donc pas a réécrire un système propre, elles n'ont qu'à se baser sur le système donné au départ. Chaque utilisateur a un login, un nom affiché, un email, un avatar. Après, si un plugin veut rajouter un truc, il est libre de le faire. A noter qu'une messagerie rudimentaire est prévue aussi.

:!: E. Système de templates

Le contenu est entièrement séparé du décor. Il suffit de changer le skin et d'y rajouter les {VARS} pour avoir un site fonctionnel mais complètement différent en un clic. Chaque contenu ayant aussi son propre sous-template, il est facile de modifier facilement le design.

:!: F. Les Hooks

A leur manière, ils sont un peu comme des plugins, et un peu comme des hacks. On les trouve aussi dans presque tous les CMS, ils permettent de modifier une donnée après coup, en lui rajoutant ou enlevant des données, voire en la remplaçant entièrement. Dans pluxml par exemple cette fonctionnalité est assez poussée, elle est appelée a chaque "étape" de la création de la page. Avec Aspirine, c'est plus rudimentaire, un hooks n'est appelé qu'après génération d'un contenu, ce qui est déjà largement suffisant pour procéder à quelques modifications substantielles.

:!: G. Système de cache

Si il y a une chose qui est grandement facilité par les Boxes c'est bien ça ! Puisque qu'à une {VAR} est associé un contenu, il devient très simple d'associer un fichier de cache à un contenu aussi. Lorsqu'un contenu fait appel à la BDD, il vérifie d'abord qu'un fichier de cache n'existe avec ces données. Le forum peut par exemple avoir un "sujet_24.cache" et le slider est stocké évidemment dans "slider.cache". Si le contenu est mis à jour, le cache est effacé. Ce système de cache permet de soulager grandement les serveurs qui hébergent le script, en laissant tranquille MySQL. Un contenu est enregistré dans un fichier de cache sous forme d'array serializé, ceci pour éviter d'avoir du html dur peut être obsolète, et toujours garder cette séparation entre fond et forme.

:!: H. Base de Données via PDO

Dernier point que je tenais à aborder, l'accès à la base de données. J'ai pour l'occasion créé une classe de gestion assez basique pour l'instant, via PDO, qui gère la connexion, les requetes, le retour des données, etc. Par exemple, au lieu d'écrire un SELECT truc, machin FROM bidule WHERE etc etc, c'est un tableau d'argument qui est passé, empêchant les erreurs de syntaxe. Les données récupérées de la BDD sont traitées elles aussi, et mises en forme dans un tableau a plusieurs dimensions pour pouvoir y accéder librement via un foreach ou un curseur numérique/nominatif. Pour le moment cette classe ne gère que mysql. Le but final de cette classe, qui se scindera en plusieurs je pense, sera de pouvoir gérer plusieurs SGBD, comme POSTGRES par ex. L'avantage pour les développeurs est évident : aucunement besoin de modifier leur code pour garder la compatibilité : c'est la classe qui se charge de faire les modifications sur la syntaxe finale pour etre correctement interprétée par le SGBD ciblé.


:arrow: Etat des lieux
-------------------------------------

Pour l'instant, il reste énormément à faire. Si le coeur d'Aspirine est déjà présent, nombre de ses fonctionnalités sont absentes ou incomplètes. La classe de gestion des utilisateurs est obsolète et devra etre revue, la classe de BDD est à compléter, et l'admin n'est pas terminée (et c'est un sacré morceau). Mais même lorsque tout ceci sera terminé, il faudra alors s'atteler a créer les plugins nécessaires a la popularité du projet, un site statique c'est sympa, mais un site avec un blog, un forum, une galerie etc, c'es mieux déjà. Et tout ca, meme si ce ne sont "que" des complexBoxes a coder....c'est du boulot.


:arrow: Au final
-------------------------------------

Merci d'avoir lu jusque là et j'espère que le projet vous séduit ;)

Draco
Messages : 6
Enregistré le : 14 févr. 2014 02:15
Compte LegTux : addpaea

Re: [CMS] Aspirine - Le CMS sans maux de têtes

Message par Draco » 08 déc. 2015 08:42

3ans plus tard t'en est où ? :o
j'aimerais le voir et le tester ;)

Répondre