Pregunta

Uso lo siguiente como controlador (s) de Page/Page de primera línea y está funcionando bien hasta ahora, excepto que dos problemas que enfrentan, que como pueden ver son la matriz de páginas y el interruptor, que en realidad son mucho más largos como los que yo 'he pegado aquí. Cada vez que existe la necesidad de un nuevo controlador de página, tengo que agregarlo a la matriz de $ páginas y cambiar, lo que hace que esa lista sea muy larga. ¿Cómo superaría este problema y ves alguna otra mejora en este código? loadLogic() En los controladores de página se utiliza para obtener funciones en páginas/controlername/lógica/function.php.

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

Controlador de página - {Inicio, Registro, Inicio de sesión, Inicio de sesión, Página1, Página2, Página3} .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';

función 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";

    }
}

Estructura de carpeta:

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
¿Fue útil?

Solución

Para el controlador FrontPage, por qué tantas declaraciones de casos. Ya sabe qué páginas son válidas para incluir y verifica si está en las páginas válidas.

Puedes hacer:

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

Si quería que se hubiera pasado diferentes nombres a $ _get para la ofuscación, junto con diferentes extensiones potenciales, entonces podría hacer:

$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 desea hacer que la variedad de páginas sea más fácil de manejar, puede dividirlo en varias líneas:

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

Oh, también, ya que es feo que la página de inicio sea http://www.domain.com/?p=home, solo haga que el hogar sea el valor predeterminado si el valor para P no está en la matriz o no en una clave de matriz, dependiendo de la cual use.

Asi que:

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

Entonces puede deshacerse de eso si! Isset $ _get ['P'] o $ _get ['P'] == '' en la parte superior. También puede combinar el ISSET y IN_Array/Array_Key_Exists en la misma instrucción IF con un &&. Si la primera evaluación es falsa y golpea un &&, simplemente se detiene y no evalúa el resto, por lo que no hay errores ni nada, y también significa que puede establecer fácilmente una respuesta predeterminada solo una vez, ya que tenerlos anidados significa que significa que Tendría que tener un valor predeterminado para ambos IFS.

Más ediciones. Si realmente quisiera tener un 404 cuando un usuario intente ir a AP = que no es existente en lugar de simplemente ser arrancado a la página de inicio, podría hacerlo en la parte superior:

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

y luego en la estructura if para incluir las páginas, haga un lo contrario si antes de incluir el hogar.php como:

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

Para que si P está configurado pero no se verifica, incluirá 404, pero si no está configurado, se irá a casa.php

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top