URL avec switch()

Résolu/Fermé
blaz32 Messages postés 155 Date d'inscription jeudi 27 juin 2013 Statut Membre Dernière intervention 28 août 2014 - 23 déc. 2013 à 16:47
Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 - 24 déc. 2013 à 10:59
Bonjour, j'essaye de créer un système de vue (dynamique) avec la fonction switch, mais j'ai un bug si le fichier n'existe pas :

Mon fichier Config.php

<?php

//Config -- Default/General
define('DS', DIRECTORY_SEPARATOR);
define('VIEW', 'view');
define('CORE', 'core');
define('PAGES', VIEW.DS.'pages');
define('ERROR', VIEW.DS.'error');
define('DEFAULT_EXT_CTRL', '.php');
define('PARSE', CORE.DS.'parse'.DEFAULT_EXT_CTRL);
define('DEFAULT_VIEW_EXT', '.psv');

//Config -- CSS
define('INDEX', 'index');
define('CSS_EXT', '.css');
define('DEFAULT_CSS', INDEX.CSS_EXT);

//Config test DIRECTORIES
$host = $_SERVER['HTTP_HOST'];
$dest_dir = $host.' @ '.$_SERVER['REQUEST_URI'];

//URL_PARSE
require PARSE;

?>

Mon fichier Parse.php

<?php

$page = (isset($_GET['p']) ? $_GET['p'] : null);
$view_file = PAGES.DS.$page.DEFAULT_VIEW_EXT;

if(isset($page)){
switch ($page) {
case $page:
$page_content = require $view_file;
break;
}
}

if($page == null){
switch ($page) {
default:
$page_content = require PAGES.DS.'home'.DEFAULT_VIEW_EXT;
break;
}
}

?>


J'ai créé les fichiers home.psv et users.psv, mais quand j'entre l'url index.php?p=avion j'ai un message d'erreur, normal car le fichier avion.psv n'existe pas...

Mais ça fait des heures que je teste des conditions du genre :

if(!isset($view_file)){
$page_content = require ERROR.DS.'404'.DEFAULT_VIEW_EXT;
}

Mais rien à faire, toujours le problème de la fonction REQUIRE...

Que faire, merci ;-)

3 réponses

Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 525
Modifié par Pitet le 23/12/2013 à 17:19
Salut,

Pourquoi utiliser un switch si tu n'as qu'une seule condition ?

L'intérêt du switch est de raccourcir une suite de condition comme ceci :
if ($page == 'accueil') {
 ...
} elseif ($page == 'contact') {
 ...
} elseif ($page == 'machin') {
 ...
} // etc..

Par :
switch ($page) {
    case 'accueil' :
        ...
        break;
    case 'contact' :
        ...
        break;
    case 'machin' :
        ...
        break;
    // etc..
}


La façon dont tu utilises tes switch n'as pas d'intérêt puiqu'il n'y a qu'une seule condition et celle si est toujours vrai ($page == $page).


Ton fichier parse.php devrait ressembler à quelque chose comme ceci :
$page = isset($_GET['p']) ? $_GET['p'] : ''; 

switch ($page) {
    case 'home' :
        require('home.psv');
        break;
    case 'users' :
        require('users.psv');
        break;
    default :
        // si la page demandée n'existe pas, afficher une erreur 404
        require('404.psv');
        break;
}


Pourquoi faire compliqué quand on peut faire simple ;)

Attention ! require n'est pas une fonction mais une instruction du langage et ne retourne pas le contenu du fichier :
$test = require('page.html');

est faux.
Pour récupérer le contenu d'un fichier avec require, il faut utiliser les fonctions de bufferisation de sortie (https://www.php.net/manual/fr/ref.outcontrol.php ou sinon utiliser la fonction file_get_contents().

Bonne journée
0
blaz32 Messages postés 155 Date d'inscription jeudi 27 juin 2013 Statut Membre Dernière intervention 28 août 2014 10
23 déc. 2013 à 17:50
Merci, mais je cherche à charger une pages en fonction de l'url, si j'ai un fichier test.psv dans /view/pages/, je l'appelle avec index.php?p=test, et faire pareil, je rajoute un fichier test2.psv, donc, pour l'appeler j'utilise index.php?p=test2 etc...

Sinon, comment puis-je faire ce système autrement, car je veux faire autre chose que nom_du_site/nom_controller/nom_action, mais remplacer par index.php?page= ...

Merci tout de même :-)
0
blaz32 Messages postés 155 Date d'inscription jeudi 27 juin 2013 Statut Membre Dernière intervention 28 août 2014 10
Modifié par blaz32 le 23/12/2013 à 18:13
J'ai trouvé, voici le code qui fonctionne :

Parse.php :

<?php

$page = (isset($_GET['p']) ? $_GET['p'] : null);
$view_file = PAGES.DS.$page.DEFAULT_VIEW_EXT;

if(isset($page)){
if(file_exists($view_file)){
switch ($page) {
case $page:
$page_content = $view_file;
break;
}
}
else{
$page_content = ERROR.DS.'404'.DEFAULT_VIEW_EXT;
}
}

if(!isset($view_file)){

}

if($page == null){
switch ($page) {
default:
$page_content = PAGES.DS.'home'.DEFAULT_VIEW_EXT;
break;
}
}

?>

Et quand je fais index.php?p=canard, il m'affiche le message "Error 404 - Not found : Cette page n'existe pas" (contenu dans le 404.psv) car canard.psv n'existe pas dans /view/pages
0
Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 525
24 déc. 2013 à 10:59
Ton switch est toujours inutile si tu n'as qu'une condition toujours vrai ($page == $page), tu peux donc le supprimer (ton code sera beaucoup plus lisible et donc plus facile à maintenir/faire évoluer) :
<?php

$page = (isset($_GET['p']) ? $_GET['p'] : null);
$view_file = PAGES.DS.$page.DEFAULT_VIEW_EXT;

if(isset($page) && file_exists($view_file)){
	$page_content = $view_file;
else {
	$page_content = ERROR.DS.'404'.DEFAULT_VIEW_EXT;
}

if(!isset($view_file)){

}

?> 


Si $page est définie et que le fichier view correspondant existe : on récupère le contenu de cette page, sinon erreur 404.
Ta deuxième condition ($page == null) est déjà gérée par ton premier if : si $page n'est pas définie alors erreur 404.
0