Bonjour,

tout d'abord je tiens à m'excuser si mon post n'est pas dans la bonne section... ensuite, avant de poster mon sujet j'ai cherché un topic traitant déjà ma problématique mais je n'ai pas trouvé grand chose, alors mille excuses si il a déjà était posté ailleurs...

Bref, je viens vers vous car dans la boite où je travail, on m'a demandé de créer un système d'installation/gestion de plugins pour l'installer sur le cms perso de la société.
D'après ce que l'on m'a expliqué, l'idée serait quelque chose ressemblant à la démarche d’installation/gestion des plugins sous WordPress, Joomla, etc.

Seulement, je ne sais pas trop par où commencer ???!!!

Alors voila ma question, quelqu'un aurait-il une idée ? une piste ? vécu une expérience similaire ?

Je vous remercie d'avance pour votre aide ;-)

5 réponses


beefbridge
Auteur
Réponse acceptée

Salut tout le monde,
Après avoir pas mal étudié comment faisaient un peu tous les cms du marché pour installer/gérer leurs plugins, j'ai enfin mis au point un système qui me permet de faire pareil !

Je vous propose la méthode que j'ai développée, en espérant que cela vous sera utile...

Tout d'abord, partons du principe que votre application maison ait l'architecture suivante :

  • admin
  • class
  • plugins
  • ...

Ensuite, il y a un peu de développement à faire par-ci par là.
Concrètement il faudra :

  • développer un plugin, avec tous ses fichiers
  • développer une class pour traiter les plugins en général
  • et enfin une page sur laquelle les plugins sont gérés.

Commençons par le plugin.
Tout d'abord, votre plugin sera placé dans un répertoire personnel. Ce dernier aura le nom du plugin. Eviter les caractères spéciaux et les espaces, ce sera plus simple pour la suite ;-)
Imaginons que vous ayez besoin d'un plugin permettant de déposer et d'afficher des offres d'emploi pour une entreprise.
Pour gérer tout ça, ce plugin aura besoin de quelques fichiers :

  • un fichier class.php
  • un fichier de description au format xml
  • quelques vues pour l'admin
  • quelques vues pour le front de votre application

Le fichier class.php contient quelques méthodes (par exemple) :

  • installer() : sert simplement à créer, grâce à une requête sql (CREATE TABLE), la table dans la base de données avec tous les champs utiles pour ce plugin
  • ajouter() : sert à insérer une nouvelle offre d'emploi dans la table de données grâce une requête sql (INSERT INTO)
  • modifier() : sert à modifier une offre d'emploi grâce à une requête sql (UPDATE)
  • supprimer() : sert à supprimer une offre d'emploi grâce à une requête sql (DELETE FROM)
  • charger-toutes-offres-emploi() : sert à charger toutes les offres d'emploi enregistrées grâce à une requête sql (SELECT * FROM)
  • chagrer-offre-emploi() : sert à charger une offre d'emploi sélectionnée grâce à une requête sql (SELECT)
  • etc.

Le fichier de description au format xml contient des informations relatives au plugin :

  • le nom
  • la version
  • la description
  • l'auteur
  • etc.

Les vues de l'admin contiennent un formulaire pour ajouter des offres d'emploi sur l'une et un tableau pour les lister sur une autre…

Pour le front, une vue contiendra un tableau pour lister toutes les offres d'emploi, une autre servira à afficher une offre d'emploi en question.

Passons ensuite à la class des plugins en général : plugins.class.php.
Pour que cette class fonctionne correctement, il vous faudra une table "plugins" dans votre BDD afin d'enregistrer tous les plugins utilisés par votre application.
Cette class, placée dans le répertoire "class" de votre application, servira à traiter de façon générale tous vos plugins grâce à différentes méthodes :

  • installer() : sert à enregistrer un nouveau plugin dans la table "plugin" grâce à une requête sql (INSERT INTO)
  • desinstaller() : sert à supprimer un plugin de votre table "plugin" grâce à une requête sql (DELETE)
  • activer() : sert à activer un plugin grâce à une requête sql (UPDATE)
  • desactiver() : sert à désactiver un plugin tout en le gardant installer, grâce à une requête sql (UPDATE)
  • est-activer() : sert à savoir si un plugin est activé ou pas grâce à une requête sql (SELECT)
  • charger-tous-plugin() : sert à lister tous les plugins présents dans votre application (présent dans la table "plugin") grâce à une requête sql (SELECT)
  • charger-plugin() : sert à charger un plugin sélectionné grâce à une requête sql (SELECT)
  • est-installer() : sert à savoir si un plugin, grâce à son nom, est déjà présent dans la table "plugin" donc si il est installé (SELECT)
  • etc.

Enfin, il reste à faire la page sur laquelle vous pourrez gérer votre plugin.
Cette page sera bien entendue placée dans le répertoire "admin".
Comment cette page va-t-elle fonctionner ? c'est assez simple en réalité, il fallait juste y penser ^_^
Tout d'abord, il faut que cette page parcoure votre répertoire "plugin" afin de détecter tous les sous-répertoires contenu dans ce dernier, c'est-à-dire de lister tous vos plugins puisque chaque plugin est placé dans un répertoire, à son nom, qui lui est dédié.
Une fois qu'elle a listé tous les sous-répertoires présents, il faut qu'elle vérifie la présence du fichier description.xml afin de récupérer les informations relatives au plugin (nom, description, version, etc.).
Si ce fichier est trouvé alors on l'ouvre et on récupère les informations importantes (nom, description), sinon on arrête là et on informe l'admin qu'il manque le fichier en question pour continuer.
Une fois qu'elle a récupéré les informations utiles, nous pouvons lister tous les modules conformes et présents dans l'application, grâce à une boucle (foreach) et aux informations récupérées dans le fichier xml.
Dans cette boucle, nous vérifions un par un l'état du plugin : s'il est installé grâce à la fonction est-installer(), s'il est activé ou pas grâce à la fonction est-activer() et en fonction des résultats on affiche des liens permettant telle ou telle action :

  • "installer" qui lancera la fonction installer() de la class plugin.class.php pour installer le plugin
  • "activer" qui lancera la fonction activer() de la class plugin.class.php pour activer le plugin
  • "desactiver" qui lancera la fonction desactiver() de la class plugin.class.php pour désactiver le plugin
    Et si un plugin est activé alors on affichera un lien du genre "gérer" ou "configurer" qui pointera sur l'une des vues de l'admin.

Petite note : il peut être plus rapide de dire qu'à chaque installation d'un plugin, ce dernier soit automatiquement activé ;-)

Et voilà, notre boucle listera les états actuels pour chacun des plugins trouvés dans le répertoire "plugins". Ainsi à chaque fois que vous créerez un nouveau plugin, en reprenant ce schéma, vous aurez juste à placer son répertoire dans le répertoire "plugins" et d'aller sur votre page de gestion des plugins de votre application pour pourvoir l'installer et l'utiliser.

J'espère que j'étais assez compréhensible et clair, si ce n'est pas le cas, n'hésitez pas à me contacter ;-)
Je tiens à préciser que ceci est un système de gestion de plugins que certains trouverons "barbare" ou bancal, peut-être ? Je ne dis pas avoir trouvé LE système parfait. Néanmoins, il reprend le fonctionnement utilisé par certains cms et il fonctionne bien.
Toutefois, si quelqu'un trouve qu'il manque quelque chose, je suis ouvert à la critique constructive ;-)

Suis preneur aussi pour mon cms
pour le moment mes plugins sont chargés dans mes classes mais un système à la cakephp (behavior par exemple) serait plus pratique pour l'évolutivité de l'appli
pour le moment après avoir cherché je n'ai rien trouvé de très utile sur le net

C'est une fameuse question à laquelle on ne peut pas avoir la réponse sans connaître exactement comment fonctionne ton cms, comment il est déployé chez les clients, etc...
Le mieux pour toi serait de regarder comment font les autres : lire le code source de joomla, wordpress ou d'autres cms open-sources et grand public.
Pour te donner une petite idée, de notre côté, notre cms fonctionne avec des sources centralisée : en gros, l'entièreté des classes et modules ne se trouve qu'à un seul endroit sur le serveur, et les clients n'ont que leurs bases de données et leurs feuilles de styles et images qui sont dans leurs dossiers clients.
La configuration propre à chaque client passe par un petit fichier de configuration en json.
Du coup, comme les sources sont au même endroit pour tout le monde, quand un client demande un plugin, il suffit d'indiquer dans son fichier de configuration que ce plugin est actif.
Et lorsqu'un client demande un plugin que nous n'avons pas encore, nous le réalisons dans les sources, et ce plugin est donc virtuellement disponible pour tous les autres clients, dont il suffit d'indiquer, dans le fichier de config, que ce plugin est actif.
Bien entendu, un plugin est par défaut inactif, afin de ne pas avoir à modifier la config de chaque client à chaque nouveau plugin développé.

En général, tu sais qu'un plugin (ou une fonctionnalité au sens large) est construit (dans le code) par un certains nombres de fichiers. Si je prends l'exemple de joomla, on plugin c'est un index.php, un répertoire pour les vues, un autre pour les models, tu as également un contrôleur. Le nom de ces fichiers sont normalisés. Tu sais donc qu'un plugin est au moins composé d'un certain nombre de fichiers et de répertoires (et tu maîtrises leur nom).

À partir de là, tu peux faire ton système de plugins.

Je viens de tester la solution de Grafikart en adaptant à mon système de CMS ça fonctionne plutot bien après je ne sais pas si mon dev est forcément le mieux mais pour faire simple j'ai un dossier plugins dans lequel chaque plugin est dans un dossier portant son nom à l'intérieur de ce dossier j'ai un fichier controller, model, et plugin le premier contient les fonctions de mon plugins, le second les fonctions de la bdd et le dernier contient la fonction d'installation et les différents fonctions utilisées en front ou back... sur le principe le système à l'air plutot bon