Question

J'utilisant ce qui suit comme Frontpage / Page Contrôleur (s) et cela fonctionne bien jusqu'à présent, sauf deux problèmes que je suis face à qui, comme vous pouvez voir sont le tableau de pages $ et le commutateur, qui sont en réalité beaucoup plus longtemps que celui que j'ai collé ici. A chaque fois il y a un besoin pour un nouveau contrôleur de page que je dois l'ajouter à un tableau de pages $ et pour changer ce qui rend cette liste très longue. Comment voulez-vous résoudre ce problème et ne vous vois pas d'autre amélioration de ce code? loadLogic() dans les contrôleurs de page, il est utilisé pour obtenir des fonctions sous pages / nomducontroleur / logique / function.php.

Frontpage Controller - index.php:

include 'common/common.php';
if(!isset($_GET['p']) OR $_GET['p'] == ''){
    $_GET['p'] = 'home';
    header('Location: index.php?p=home');
}

$pages = array('home','register','login','logout','page1','page2','page3');

$_GET['p'] = trim($_GET['p']);

if(isset($_GET['p'])){
    if(in_array($_GET['p'], $pages)){
        switch ($_GET['p']) {
            case 'home':
                include 'home.php';
                break;
            case 'register':
                include 'register.php';
                break;
            case 'login':
                include 'login.php';
                break;
            case 'logout':
                include 'logout.php';
                break;
            case 'page1':
                include 'page1.php';
                break;
            case 'page2':
                include 'page2.php';
                break;
            case 'page3':
                include 'page3.php';
                break;
        }
    }else{
        echo '404!';
    }
}

Page Controller - {la maison, inscrivez-vous, connectez-vous, fermez la session, page1, page2, page3} .php:

include 'tpl/common/header.php';
contentStart();

if(isset($_SESSION['logged'])){
    loadLogic('dashboard');

}else{
    loadLogic('nologin');

}


//Display login form in logic page instead links
//
if(!isset($_SESSION['logged'])){
    contentEnd();
    loadLogic('nologinForm');
}else{
  contentEnd();
  include'tpl/common/rcol.php';

}
include 'tpl/common/footer.php';
loadLogic fonction ()

function loadLogic($logic) {
    $path = dirname(__DIR__) . '/pages';

    $controller = preg_split('/&/',$_SERVER['QUERY_STRING']);
    $controller = trim($controller[0],"p=");
    $logicPath = 'logic';
    $logic = $logic . '.php';
    $err = 0;
    $logicFullPath = $path.'/'.$controller.'/'.$logicPath.'/'.$logic;

    if($err == '0'){
        include "$logicFullPath";

    }
}

Structure de dossier:

projectName
  |
   ---> common
  |
   ---> pages
  |   |
  |    --->home
  |   |
  |    --->register
  |   |
  |    --->login
  |   |
  |    --->logout
  |   |
  |    --->page1
  |   |
  |    --->page2
  |   |
  |    --->page3
  |
   ---> tpl
  |   |
  |    ---> common
  |
   --> home.php
  |
   --> register.php
  |
   --> login.php
  |
   --> logout.php
  |
   --> page1.php
  |
   --> page2.php
  |
   --> page3.php
Était-ce utile?

La solution

Pour le contrôleur frontpage, pourquoi tant de déclarations de cas. Vous savez déjà ce que les pages sont valides pour inclure et de vérifier si elle est dans les pages valides.

Vous pouvez simplement faire:

if(isset($_GET['p']))
{
    if(in_array($_GET['p'], $pages))
    {
         include($_GET['p'] . '.php');
    }
}

Si vous voulez à avoir des noms différents passés à _GET $ pour l'obscurcissement, ainsi que des différentes extensions possibles, alors vous pourriez faire:

$pages = array('home'=>'index.php','register'=>'registerpage.htm','page1'=>'one.html');

if(isset($_GET['p']))
{
    if(array_key_exists($_GET['p'],$pages))
    {
          include($pages[$_GET['p']]);
    }
}

Si vous voulez faire le tableau de pages plus facilement gérables, vous pouvez le diviser en plusieurs lignes:

$pages = array(
'home'=>'index.php',
'register'=>'registerpage.htm',
'etc'=>'/home/user/public_html/directory/etc.php'
);

Oh, aussi, car il est un peu laid d'avoir la page d'accueil soit http: // www. domain.com/?p=home, juste faire la maison soit la valeur par défaut comprennent si la valeur de p est pas dans le tableau ou non une clé de tableau, en fonction de laquelle vous souhaitez utiliser.

if(isset($_GET['p']) && in_array($_GET['p'],$pages)) //You can combine these like this as well, same functionality.  If p isn't set, it won't even try the in_array()
{
    include($_GET['p'] . '.php');
}
else
{
    include('home.php');
}

Ensuite, vous pouvez vous débarrasser de cela, si! Isset $ _GET [ 'p'] ou $ _GET [ 'p'] == '' en haut. Vous pouvez également combiner les isset et in_array / array_key_exists dans la même instruction if avec un &&. Si la première évaluation est fausse et il frappe un && il arrête juste et n'évalue pas le reste, donc aucune erreur ou quoi que ce soit, et cela signifie aussi que vous pouvez facilement définir une réponse par défaut une seule fois, comme les ayant des moyens imbriqués vous devriez avoir une valeur par défaut pour les deux ifs.

Plus de modifications. Si vous voulez vraiment avoir un 404 lorsqu'un utilisateur tente d'aller à un p = qui est non au lieu de simplement existant se botté à la page d'accueil, vous pouvez le faire en haut:

if(isset($_GET['p']))
{
$fourohfour = true; 
}

et puis vers le bas dans la structure Si pour inclure les pages, faire une autre si, avant l'inclure autre home.php comme:

else if(isset($fourohfour))
{
    include('404.php');
}

Alors que si p est défini, mais ne vérifie pas, alors il comprendra 404, mais si elle n'est pas réglé, il ira à Home.php

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top