8721 sujets

Développement web côté serveur, CMS

Bonsoir,

Celà fait un moment que j'essaye de développer un bout de code pour pouvoir inclure mes pages quelque soit le dossier, chose qui évite de tout tapper à la main, ou de modifier quand on souhaite déplacer un fichier.

chose comme : includefile('monfichier.php');
cette fonction se débrouille pour inclure monfichier.php quelque soit le dossier / sous dossier où il se trouve.

une idée?!
Pour les classes tu as déjà un système d'autoloading natif en PHP : __autoload() et spl_autoload.

Après c'est pas vraiment compliqué de mettre ça en place pour d'autres type de fichiers si tu as une structure et une manière de nommer tes fichiers qui sont normalisées. Tous les frameworks modernes font ça.

Par contre c'est difficile de tes donner des exemples sans voir ta structure de fichiers et avoir quelques exemples de ce que tu veux faire.
Modifié par jb_gfx (10 Jun 2013 - 21:46)
je développe un "logiciel web" de gestion de personnel, parc automobile et telephone,
j'ai une page index où on s'authentifie, et une page gestion qui elle va inclure les pages selon ce que l'on veut afficher :

www.monsite.gestion.php?page=archives

hors ces pages commes arcgives.php etc sont dans différents dossiers.

l'architecture telle que ci-essous,il y a une page bidon là où il y en aura plusieurs plus tard

upload/50263-Capture.PNG
Modifié par ananka (10 Jun 2013 - 22:07)
ha mais el souci est pas au niveau de l'adresse, mais d'inclure les fichiers, pour ne aps avoir à tapper une ligne par fichier à include, et devoir la modif si je change l'emplacement de mes fichiers.

grosso-modo je veux dire à mon appli : tu m'inclus les fichiers x, y, z, et tu te débrouille pour trouver leur emplacement
L'adresse permet de retrouver l'emplacement du fichier et de l'inclure automatiquement.

Par contre j'aimerais bien savoir pourquoi tu aurais besoin de changer l'emplacement de tes fichiers.
je suis débutant, et à l'avancement de mes traveaux je me rend souvent compte que je tri mal mes fichiers, donc je les déplace.

A savoir que mon souci n'a strictement rien à voir avec l'adresse, car j'ai des fichiers contenant des fonctions dont j'ai besoin, et donc pour utiliser ces fonctions je dois inclure les fichiers en question, c'est pour découper mon code.


à l'heure actuelle j'ai ceci pour inclure mes fichiers :

$fichier_inc = '../inc/';
$fichier_cfg = '../config/';

require $fichier_cfg.'Bdd.class.php';

require $fichier_inc.'log.php';
require $fichier_inc.'generators.php';
require $fichier_inc.'checkmenu.php';

et donc mon but est de ne pas lui demander un chemin, pour inclure un fichier, mais lui donner le nom de mon fichier et qu'il retrouve son chemin tout seul pour l'inclure.
Modifié par ananka (10 Jun 2013 - 22:30)
Modérateur
Bonjour, pour faire ce genre de chose, on met généralement en place ce que l'on appelle une table de routage, dans un fichier php, yaml, ini, etc. :
des données clé/valeurs avec un joli nom et un chemin.

youpie = foo/bar/truc/youpieyoupie.php
chene = arbres/chene.php
etc.

Ensuite une fonction qui va bien se chargera de prendre la commande en paramètre et de charger le fichier.
ça a l'avantage d'être centralisé, tu sais tout de suite ou aller changer, si tes fichiers sont inclus par différents fichiers tu as une définition unique.
Après on peut même s'amuser à parser son arbre et générer ce fichier de routage automatiquement, mais ça devient plus complexe et là ça reviendrait à réécrire un framework Smiley langue
Je vois... en même temps j'avais un peu remarqué quand j'ai vu que tu as changé 3 fois la structure de tes fichiers le temps que je poste ma première réponse.

Franchement si tu n'as pas d'architecture bien pensée, le dernier de tes soucis et de savoir comment charger automatiquement tes fichiers. Un simple chercher/remplacer sur les fichiers de ton projet te permettra de modifier les includes si tu changes ta hiérarchie de fichiers.
kustolovic a écrit :
là ça reviendrait à réécrire un framework Smiley langue


Juste le routeur. Et encore on peut utiliser le routeur d'un framework existant dans son projet, c'est pas vraiment un problème. Moi j'utilise le routeur de Symfony2 sur mon framework maison.
c'est plus ou moins ce que je fais non?
dans mes pages j'appelle un fichier php qui lui appelle tous mes fichiers.

et ce que j'expliquais est que je voulais faire un code qui lui va chercher le fichier dans un dossier et ses sous dossier, ainsi il le trouvera que je le place dans un fichier x ou y


je n'ai pas changé l'architecture, j essayais juste d'expliquer mon architecture, et je m'étais dis qu'un screen serait plus simple
Modifié par ananka (10 Jun 2013 - 22:58)
Exemple que j'ai fait durant un test :



if(isset($_GET["page"])){
                    $file_public = "pages/public/".$_GET["page"].".php";
                    $file_admin = "pages/admin/".$_GET["page"].".php";
                    $file_user_menu = "pages/user_menu/".$_GET["page"].".php";
                    //vérification de l'existance du fichier
                    if(file_exists($file_public)){
                        //Inclusion du contenu de la page
                        include $file_public;
                    }
                    //vérification dans le fichier user_menu
                    elseif(file_exists($file_user_menu)){
                        include $file_user_menu;
                    }
                    //vérification dans le fichier admin
                    elseif(file_exists($file_admin)){
                        include $file_admin;
                    }
                    //Erreur 404
                    else{
                        echo ('fichier innexistant!!') ;
                    }
                }else{
                   include "pages/public/home.php";
                }


ce que j'ai du faire pour 3 pauvres dossiers, donc si j'ai une volée de dossier c'est aps du tout optimisé
Modifié par ananka (10 Jun 2013 - 23:05)
Modérateur
ananka a écrit :
"public/".$_GET["page"].".php";

ça c'est le mal.
On n'inclut jamais un fichier directement avec la variable. C'est exploitable de mille façons.

Au contraire avec une table de routage propre:


$page = $_GET["page"];
if (isset($router[$page]) {
    include $router[$page];
}
else {
    die('pourriture de pirate!');
}

$file = validate_page($_GET['page']) . '.php';

$dirs = array(
  'machin',
  'bidule',
  'truc',
  'muche',
);

foreach ($dirs as $dir) {
  $load_me = '/pages/' . $dir . '/' . $file;

  if (file_exists($load_me)) {
    require $load_me;
    exit;
  }
}

require '404.php';

Modifié par jb_gfx (10 Jun 2013 - 23:18)
<?php
//récupération de la page à charger
$file = validate_page($_GET['page']) . '.php';

//donnée du fichier de niveau 0
$fichiers_0 = 'pages';

//donnée de stockage des sous fichiers niveau 1
$fichiers_1 = array(
  'gestion',
  'panel',
);

//donnée de stockage des sous fichiers niveau 2 (présentes dans gestion ou panel)
$fichiers_2 = array(
  'personnel', 
  'telephone',
  'voiture',
);


    //si on le trouve à la racine
	if (file_exists('pages/'.$file)) { 
	    require 'pages/'.$file;

    //on cherche dans les dossiers	    
	}else{
		foreach ($fichiers_1 as $fichier_1) {
	        //si il est dans un dossier de niveau 1
			if(file_exists('pages/'.$fichier_1.'/'.$file)){
				require 'pages/'.$fichier_1.'/'.$file;
		        exit;
		    //sinon on regarde dans les sous dossiers
			}else{
				foreach ($fichiers_2 as $fichier_2) {
					if(file_exists('pages/'.$fichier_1.'/'.$fichier_2.'/'.$file)){
						require 'pages/'.$fichier_1.'/'.$fichier_2.'/'.$file;
				        exit;
				    //le fichier n'est ni dans le dossier pages,
				    //ni dans les dossiers de niveau 1
				    //ni dans les dossiers de niveau 2
				    //il existe donc pas
					}else{
					//page 404
					}
				}
					
			}
		}  	
	}

?>


me reste plus qu'a gérer l'existence des sous dossier et je pense que ça doit être bon.

vous en pensez quoi?
Modifié par ananka (10 Jun 2013 - 23:47)
Voilà, le travail est fait, et il fonctionne!

par contre kustolovic, pourrai-tu m'expliquer fon $router
stp?


Je vous paste mon code :


if(isset($_GET['page'])){
	//récupération de la page à charger
	$file = $_GET['page'].'.php';

	//donnée du fichier de niveau 0
	$fichiers_0 = 'pages';

	//donnée de stockage des sous fichiers niveau 1
	$fichiers_1 = array(
	  'gestion',
	  'panel',
	);

	//donnée de stockage des sous fichiers niveau 2
	$fichiers_2 = array(
	  'perso', 
	  'telephones',
	  'voitures',
	);

	//si on le trouve à la racine
	if (file_exists($fichiers_0.'/'.$file)) { 
		require $fichiers_0.'/'.$file;

	//on cherche dans les dossiers	    
	}else{
		foreach ($fichiers_1 as $fichier_1) {

			//si il est dans un dossier de niveau 1
			if(file_exists($fichiers_0.'/'.$fichier_1.'/'.$file)){
				require $fichiers_0.'/'.$fichier_1.'/'.$file;
				exit;
			//sinon on regarde dans les sous dossiers
			}else{
				foreach ($fichiers_2 as $fichier_2) {
					if(file_exists($fichiers_0.'/'.$fichier_1.'/'.$fichier_2.'/'.$file)){
						require $fichiers_0.'/'.$fichier_1.'/'.$fichier_2.'/'.$file;
						exit;
						    //le fichier n'est ni dans le dossier pages,
						    //ni dans les dossiers de niveau 1
						    //ni dans les dossiers de niveau 2
						    //il existe donc pas
					}else{
					//page 404
					}
				}		
			}
	    }  	
    }
}else{
	require 'pages/home.php';
}


Modifié par ananka (11 Jun 2013 - 00:17)