Bonjour à tous,

Je viens vers vous non pas pour un soucis de ligne de code mais plutôt pour de la méthodologie. Je ne sais pas si je suis au bon endroit pour poster ça, n'hésitez pas à me le dire si ce n'est pas le cas.

Je développe actuellement (pour ma propre utilisation) un système de panneau d'administration. L'intérêt est de gagner du temps pour les sites que je réalise. En effet, je compte l'utiliser à chaque fois qu'un client souhaitera modifier quelque chose sur son site (utilisateurs, coupons de réduction, news, etc.).

Etant donné que chaque client n'a pas les mêmes besoins, je me suis dit que j'allais me pencher sur un système de modules (exemple : un module de gestion des utilisateurs, un module de gestion de news, etc.) afin de pouvoir personnaliser le panneau d'administration en fonction des clients.

Cependant, je ne vois pas comment m'y prendre pour réaliser quelque chose qui puisse être évolutif sans que ça soit le "bordel". Je précise que les modules en question seront aussi développés par moi-même.

J'ai bien essayé de me renseigner auprès de mon ami Google mais ça n'a absolument pas été fructueux, à croire que je suis le seul à vouloir faire ça... (ce dont je doute).

Bien évidemment si je vous pose cette question, c'est parce que je n'ai pas envie de passer par les "usines à gaz" telles que Wordpress, Dotclear, etc.

Voilà, si je n'ai pas été clair, n'hésitez pas à me poser des questions, ce que je cherche c'est vraiment à être éclairé sur la méthodologie de programmation.

Merci d'avance !

EDIT : J'ai fait un dossier "modules" dans ma structure MVC en créant un dossier pour chaque module, étant eux-même de structure MVC.
Le menu liste automatiquement les dossiers pour en faire des boutons et génère les liens du genre "?module=nom-du-module".
Maintenant mes deux questions sont :

  • Suis-je sur la bonne voie ou ma méthode n'est pas bonne ?

  • Si je peux continuer ainsi, comment inclure au mieux les modules dans le corps du panneau d'administration ?

Merci ! :)

15 réponses


Je ne sais pas si c'est la meilleur des solutions mais tu peux toujours coder ton panneau d'administration, cacher une page rien que pour toi qui te permettra de gérer les modules. Ainsi tu codes normalement et tu mets un lien supprimer qui aura pour action de unlink un fichier ou plusieurs fichiers qui correspondront à une partie du site d'administration. Et un lien qui permet d'ajouter les fichiers concernées ? Enfin je ne sais pas trop si c'est faisable en l'état actuel.

Zyber
Auteur

Merci de ta réponse mais en fait ce n'est pas réellement ça que je cherche à faire.

Mon soucis maintenant, c'est vraiment l'inclusion des modules.

L'arborescence est comme ça à l'heure actuelle :

-Models
-Views
-Controllers
-Modules
-> Module1
-> Module2
-> Module3

Et dans chaque dossier de Module, on retrouve la même structure MVC (les dossiers models/views/controllers) avec un fichier index.php qui gère l'appel de tout ça.

Du coup, je ne sais pas trop comment gérer les liens sur les noms de modules dans le menu pour afficher le "contenu" des modules (exemple avec un module de gestion d'utilisateurs, lorsque je clique sur le bouton "Gestion utilisateurs", que ça m'affiche bien le tableau avec les utilisateurs enregistrés).

J'ai bien essayé d'include le index.php du module mais le soucis, c'est qu'on se retrouve avec une redondance de fonctions (entre autres) venant du fait que j'essaye d'inclure un modèle MVC dans un autre modèle MVC.

Je ne sais pas si je suis assez clair, n'hésitez pas à me poser des questions...

Merci beaucoup en tout cas ! :)

Sa me parait plutôt correct.
Par contre pour l'URL ce que tu peux faire c'est: ?module=nom-du-module&site=nom-du-site
après simplement grâce à une config tu récup' les données du sites et tu interagit avec.
Ça me parait être la solution là plus simple à mettre en place et plutôt propre.
D’ailleurs dans ton fichier config je pense que le mieux est de définir les modules utilisables par un site.

EDIT: j'viens de poster le message en même temps que toi
donc ce que tu fait c'est à l'accueil tu choisis le site que tu veux après ça te redirige sur la même url avec en plus le nom du site puis après les modules dispos que tu choisis et enfin l'action à réaliser bien sur en utilisant $_GET et if(isset())

Ah ok je vois un peu ce que tu veux dire, en gros tes modules sont bien codés etc... avec le design pattern Model view controller mais tu ne sais pas comment faire un lien qui redirige vers ces dits modules ? Genre le clic sur Gestions utilisateurs lance le module Gestions utilisateur et t'affiches un tableau avec tout les utilisateurs ?
Ton tableau HTML est déjà fait ? En tout cas si tu as suivis le tutoriel "Développer un site de A à Z" avec la fonction url() présente dans le Router tu peux rediriger un lien vers un fichier. Sinon un lien relatif vers le fichier index présent dans chaque Module et dans le fichier index tu fais une redirection vers la bonne page. Enfin à toi de voir selon ce que tu souhaites faire. Par contre je me demande si c'est propre de faire plusieurs fois le même motif de conception.

La dernière solution consisterai à faire un préfixe et tu rediriges ton lien vers ce préfixe, ainsi comme tu auras déclaré que le prefixe renvoi vers une url x tu devrais pas avoir trop de problème.

Zyber
Auteur

En gros si je suis votre logique, j'aurai en permanence dans la barre d'adresse une variable "$page=la-page-courante" et une variable "$module=le-module-selectionne" ?

Xtr3me : Si par "tableau HTML" tu sous-entends celui de la gestion des utilisateurs (pour reprendre l'exemple), non ce n'est pas encore fait puisque je n'arrive pas à faire l'inclusion correctement.

Je n'ai pas suivi le tutoriel "Développer un site de A à Z" mais du coup si ça ressemble à ce que je veux faire, je pense que je vais le regarder.

Je ne connais pas la fonction "url()" et je ne sais pas si c'est "propre de faire plusieurs fois le même motif de conception", c'est aussi pour ça que je demande conseil car je ne suis pas un pro' du développement PHP, malheureusement. ;)

En revanche, au risque de paraître bête, je ne comprends pas ce que tu veux dire par "préfixe" ?

Merci de votre aide !

EDIT : Je suis en train de regarder le tutoriel en question, le seul soucis c'est que c'est de l'objet alors que moi je programme en procédural... Du coup est-ce qu'il faut que je me mette à l'objet ? Si oui, je sens qu'il va y avoir du boulot...

J'ai pas suivis en entier le tuto donc je pourais pas te dire mais sinon je pense que tu pp structurer ton code comme ça:

<?php
    if(isset($nom-du-site)){
    while{
    echo $nom-du-module + lien
}
}
 if(isset($nom-du-site && $nom-du-module)){
    include($nom du module)
}
?>

et dans nom du module tu met

$site= nom-du-site
$bdd($bdd du site ...)

enfin c'est shématique la mais je pense que tu as compris ^^

Zyber
Auteur

Oui, c'est ce que je fais. Le problème c'est l'inclusion de tout le modèle MVC en fait...

Disons que je ne fais pas comme sur les tutos en question puisque je suis en procédural.

Mais par exemple, j'ai une fonction "gethtml" qui s'occupe d'afficher les pages HTML et de leur envoyer les variables traitées dans le controleur.

Lorsque je suis sur la page d'accueil du panneau d'administration (et donc qu'aucun module n'est appelé), aucun soucis. Par contre si j'appelle un module, ça recharge la fonction "gethtml", et donc ça créé un conflit.

Bien sûr vous allez me dire "supprime là du module puisqu'elle existe déjà dans la structure de base !" mais si je la supprime, j'ai une erreur comme quoi je fais appel à une fonction qui n'existe pas... (ouais je sais, c'est galère :/).

C'est pour ça que c'est un peu "flou" pour moi, je ne m'y prends peut-être pas comme il faut...

Alors pour répondre à tes questions le terme préfixe est "évoqué" dans le tutoriel. En gros tu donnes un nom à une action, tu mets pour admin le préfixe Machin ainsi quand tu taperas machin dans la barre d'adresse tu retomberas directement sur admin.
La fonction url est une fonction crée dans le tutoriel qui permet de faire un "lien" en php.
Tu peux toujours essayer une condition qui te permet de savoir si la fonction gethtml a déjà été chargée et si c'est le cas alors tu supprimes le résultat précédent et affiche le nouveau.
Passe nous un peu de ton code ça peut nous être utile pour t'aider ^^ .

Bonsoir,

Alors bon je prends le fil de la discussion un peu à l'arrache (j'ai lu un peu en diagonale) donc désolé je si vise à côté de la plaque.
Donc pour résumé tu développes (ou tu vas développer) un site où tu voudrais mettre des "modules" alors bon, sans réinventé la roue tu peux t'inspirer de systèmes similaires qui existent dans d'autres frameworks MVC.
Par exemple, sur ZF2, dans chaque modules tu as un fichier "bootstrap" qui permet d'initialiser ton module (configuration, etc...) et qui est tout à fait autonome par rapport à ton application. Ensuite tu mets une référence dans le "loader" vers ton module (en général c'est son nom qui correspond au Namespace) et ZF2 te charges automatiquement le tout.
Après si t'es en procédural tu peux t'inspirer du fonctionnement de "get-simple" qui utilise (un peu comme Wordpress il me semble) des "hooks". Bref si tu veux en reparler je suis sur l'IRC de Grafikart (même pseudo).

Je pense que si tu mettait ta fonction dans un script seul (je pense que c'est ce que tu a fait) et que tu l'appelait en faisant un require<u>-once</u> ça devrait le faire

Zyber
Auteur

Merci à tous de vos réponses !
J'étais absent ces jours derniers, me revoici ! :)

Xtr3me : Je vais essayer de te montrer niveau code comment je fais. Voici en gros le fichier index.php, qui sert à appeler ce qui va constituer ma page :

<?php
//Demarrage session
session_start();
//Page par défaut
$page='login';
//Récupération de la page passée dans l'url
if(isset($_GET'page'])) {
    if((isset($_SESSION'connecte'])) AND (!empty($_SESSION'connecte']))) {
        if($_SESSION'connecte'] == 1) {
            $page=$_GET'page'];
        }
    }
}
//Ouverture du module
if(isset($_GET'module'])) {
    if(!empty($_GET'module'])) {
        $module=$_GET'module'];
        include("modules/".$module."/index.php");
    }
}
//Fichier contenant les fonctions utilisées par toutes les parties
include('controllers/main.php');
//Fichier en tête
include('controllers/header.php');
//Fichier corps
include('controllers/'.$page.'.php');
//Fichier pied
include('controllers/footer.php');
?>

Dans chaque dossier de module, j'ai mis la même structure, ce qui créé des conflits car j'ai des fonctions en doubles.
Je pense notamment à celle qui gère le passage des variables entre le controleur et la vue ainsi que l'affichage de cette dernière.

Exemple dans le controleur de la page d'accueil du panneau d'administration :

echo getHTML('views/accueil.html',$tab);

La fonction getHTML() dans le modèle, la voici :

function getHTML($file,$tableau){
    $contenu=file_get_contents($file);
    $vue=strtr($contenu,$tableau);
    return $vue;
}

Etant donné que les modules reposent sur la même structure, il va de soi que je suis obligé d'utiliser la fonction getHTML() pour l'affichage de mes pages.
Le soucis, c'est que lorsque je clique sur le bouton d'un des modules, voici la belle erreur que j'ai :

Fatal error: Cannot redeclare gethtml() (previously declared in /Applications/MAMP/htdocs/panneau_admin/modules/gestion-des-utilisateurs/controllers/main.php:8) in /Applications/MAMP/htdocs/panneau_admin/controllers/main.php on line 16

Prévisible vous me direz, mais si je supprime la déclaration de cette fonction, il me dit que je fais appel à une fonction inconnue :

Fatal error: Call to undefined function getHTML() in /Applications/MAMP/htdocs/panneau_admin/modules/gestion-des-utilisateurs/controllers/main.php on line 16

Je dois m'emmêler les pinceaux...

CaporalDead : Je n'ai pas compris grand chose de ce que tu m'as dit (bootstrap, loader, Namespace...), désolé je suis un néophyte (enfin ça fait un moment que je fais du PHP mais là je m'attaque à quelque chose d'un peu plus complexe que d'habitude).
Je suis sur le chan IRC ce soir, ainsi que les autres soirs de la semaine pour répondre à ta proposition. ;)

Roboto441 : J'ai essayé ce que tu m'as dit mais ça ne change rien, sûrement dû au fait que même si les fonctions sont identiques, les fichiers inclus sont différents. À moins d'en faire un seul en commun (du genre le module appellerai celui du panneau admin, mais je ne suis pas sûr que ça soit très propre de faire ça étant donné que je veux vraiment séparer les choses au maximum pour que ça reste "propre".

ha mais tu met deux fois ta fonction a deux endroit différents ok, appel la plutôt une seule fois ça ira mieux je pense ^^

daccord avec roboto441 et si tu ne sais pasdans quel fichier est declaré l'autre version de cette fonction, tu pourrai proceder comme suit:

if(!function_exists('getHTML')){
function getHTML($file,$tableau){
    $contenu=file_get_contents($file);
    $vue=strtr($contenu,$tableau);
    return $vue;
}
}

cordialement

Zyber
Auteur

Merci pour vos réponses, j'ai commencé à voir la POO, je pense que ça sera plus simple pour faire ce que je veux (même si c'est un gros morceau que d'apprendre en Objet...).

Je vais tout de même essayer ce que vous m'avez dit, encore merci ! :)

ok tient nous au courant alors ;)