URL avec switch()

Résolu
blaz32 Messages postés 179 Statut Membre -  
Pitet Messages postés 2845 Statut Membre -
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

  1. Pitet Messages postés 2845 Statut Membre 530
     
    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
  2. blaz32 Messages postés 179 Statut Membre 10
     
    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
  3. blaz32 Messages postés 179 Statut Membre 10
     
    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
    1. Pitet Messages postés 2845 Statut Membre 530
       
      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