Frage

Ich verwende Folgendes als Frontpage-/Seiten-Controller und es funktioniert bisher einwandfrei, mit Ausnahme von zwei Problemen, mit denen ich konfrontiert bin. Wie Sie sehen können, handelt es sich um das $pages-Array und den Schalter, die tatsächlich viel länger sind als das, das ich habe Habe hier eingefügt.Jedes Mal, wenn ein neuer Seitencontroller benötigt wird, muss ich ihn zum $pages-Array hinzufügen und wechseln, was die Liste sehr lang macht.Wie würden Sie dieses Problem lösen und sehen Sie weitere Verbesserungen an diesem Code? loadLogic() In Seiten-Controllern wird es verwendet, um Funktionen unter „pages/controllername/logic/function.php“ abzurufen.

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!';
    }
}

Seitencontroller – {home,register,login,logout,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';

Funktion LoadLogic():

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";

    }
}

Ordnerstruktur:

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
War es hilfreich?

Lösung

Warum so viele Case-Anweisungen für den Frontpage-Controller?Sie wissen bereits, welche Seiten zulässig sind und prüfen, ob sie in den gültigen Seiten enthalten sind.

Sie können einfach Folgendes tun:

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

Wenn Sie möchten, dass unterschiedliche Namen zur Verschleierung an $_GET übergeben werden, zusammen mit verschiedenen möglichen Erweiterungen, können Sie Folgendes tun:

$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']]);
    }
}

Wenn Sie die Seitenanordnung einfacher verwalten möchten, können Sie sie in mehrere Zeilen aufteilen:

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

Oh, außerdem, weil es irgendwie hässlich ist, eine Homepage zu haben http://www.domain.com/?p=home, machen Sie einfach home zum Standard-Include, wenn der Wert für p nicht im Array ist oder kein Array-Schlüssel ist, je nachdem, was Sie verwenden würden.

Also:

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');
}

Dann können Sie das loswerden, wenn oben !isset $_GET['p'] oder $_GET['p'] == '' steht.Sie können isset und in_array/array_key_exists auch in derselben if-Anweisung mit einem && kombinieren.Wenn die erste Auswertung falsch ist und auf ein && trifft, stoppt sie einfach und wertet den Rest nicht aus, also keine Fehler oder ähnliches, und es bedeutet auch, dass Sie einfach eine Standardantwort einfach nur einmal festlegen können, da die Verschachtelung dies bedeutet Sie müssten für beide Wenns einen Standardwert haben.

Weitere Änderungen.Wenn Sie wirklich eine 404 haben möchten, wenn ein Benutzer versucht, zu einem nicht vorhandenen p= zu wechseln, anstatt nur zur Startseite zu booten, können Sie dies oben tun:

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

und dann unten in der If-Struktur, um die Seiten einzuschließen, ein else if vor dem else include home.php wie folgt ausführen:

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

Wenn p also gesetzt ist, aber nicht ausgecheckt wird, enthält es 404, aber wenn es nicht gesetzt ist, geht es zu home.php

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top