2011-07-30 11 views
5

Utilizo una instrucción PHP Switch para determinar las páginas de mi sitio web. Así que aquí está un ejemplo:?Obtener la lista de casos en la instrucción switch

switch($page) { 
    case "about": 
     $title_name = "About Us"; 
     $page_content = "includes/about-us.php"; 
     include("inner.php"); 
    break; 
    case "services": 
     $title_name = "Services"; 
     $page_content = "includes/services.php"; 
     include("inner.php"); 
    break; 
} 

Y mi estructura de archivos es index.php? Page = aproximadamente que se convierte en sobre/ usando .htaccess /.

Lo que quiero hacer es tomar todas mis páginas en esa declaración de cambio y tomarla automáticamente y ponerla en una lista para que pueda escribirla automáticamente en mi página de pie de página donde tendré todos los enlaces.

Así que en lugar de escribir manualmente en todos los enlaces en el pie de página como: Inicio | Sobre nosotros | Servicios | Preguntas frecuentes, lo extraerá automáticamente en función de las páginas que proporcioné en la declaración Switch.

¿Hay alguna manera de hacerlo? También sería bueno poder agregar automáticamente nuevas páginas y agregará un nuevo caso para la nueva página, y automáticamente creará la página en la carpeta de inclusión.

Si alguien puede señalarme en la dirección correcta, realmente lo agradecería. Según entiendo, no creo que puedas hacer esto con una declaración de cambio, tendría que volver a trabajar de la manera en que llamo a las páginas, ¿verdad?

+0

+1 para una pregunta interesante, aunque dudo si esto es posible en absoluto. También me gustaría ver una respuesta a tu pregunta. – pimvdb

+0

Si quiere leer declaraciones, es imposible. Bueno, es posible, pero de una manera muy fea e inestable. –

+0

@OZ_: ¿te refieres al tokenizer? Tampoco lo recomiendo, excepto uno _realmente_ quiere analizar la fuente (por ejemplo, generación de API o algo así). – KingCrunch

Respuesta

4

No, no es posible hacer utilizando switch - pero se puede almacenar esas informaciones en una matriz:

$page_list = array(
    'about' => array(
     'title' => 'About Us', 
     'content' => 'includes/about-us.php', 
    ), 
    'services' => array(
     'title' => 'Services', 
     'content' => 'includes/services.php', 
    ), 
); 

if(isset($page_list[$page])) { 
    $page_info = $page_list[$page]; 

    $title_name = $page_info['title']; 
    $page_content = $page_info['content']; 

    include("inner.php"); 
} else { 
    // 404 - file not found 
} 

// create links 
foreach($page_list as $link_name => $page_ent) { 
    echo "<a href=\"/{$link_name}/\">{$page_ent['title']}</a><br />" 
} 

// output 
// <a href="/about/">About Us</a><br /> 
// <a href="/services/">Services</a><br /> 
+0

Así es exactamente como lo haría. Switch no es particularmente útil en este caso. – brezanac

+0

¡Impresionante! Esto funcionó muy bien. Sí, cuando comencé, solo quería algo simple que me ayudara a trabajar más rápido y pensé que el cambio sería lo suficientemente fácil y haría el trabajo. Pero esto es genial, muchas gracias. – Drew

+0

¿Hay alguna manera de crear automáticamente una nueva matriz dentro de la matriz $ page_list cuando quiero crear páginas nuevas, a través de un formulario o algo así? – Drew

8
$pages = array('about'=> 'About Us', 'services' => 'Services'); 

if (array_key_exists($page, $pages)) { 
    $title_name = $pages[$page]; 
    $page_content = "includes/$page.php"; 
    include('inner.php'); 
} 

Para su pie de página, puede simplemente recorrer la lista de páginas. Para agregar una nueva página, simplemente agréguela a la matriz y cree el archivo correspondiente.

Pero para responder a su pregunta: No, no puede analizar sentencias de código durante el tiempo de ejecución.

+0

Se está perdiendo lo más importante en la solicitud de OP: generación automática de los enlaces de pie de página. – brezanac

+0

@holodoc. Eso es fácil si tienes una matriz en lugar de un interruptor.Creo que OP debería ser capaz de resolver esto también. – GolezTrol

+0

@holodoc: "Para su pie de página, puede iterar sobre la lista de páginas". Creo que el OP es capaz de darse cuenta de que un simple 'foreach ($ pages as $ id => $ name) {/ * código de pie de página * /}' lo hará – KingCrunch

0

Tiene esto al revés. Lo que desea es tener una matriz de páginas, y luego recorrerla una vez para la declaración de cambio y una vez para el pie de página. O, mejor aún, deshágase de la declaración de cambio por completo y en su lugar utilice una asignación asociativa de páginas de mapeo a la información que pueda necesitar para construir esa página en particular (hay un comportamiento común entre los conmutadores, por lo que sabemos cuál es su página, probablemente pueda construir las URL/etc correctas a partir de eso).

0

Definitivamente no se puede obtener todos los valores de una sentencia switch, que tendrá que rediseñar su código. Por supuesto, hay muchas maneras de lograr esto, pero normalmente hago algo como el siguiente, que es más corto y más fácil de extender que tu método.

<?php 

$pages = array('home', 'about', 'services', 'faq'); 
$titles = array('Home', 'About us', 'Services', 'FAQ'); 

$index = array_search($_POST['p'], $pages); 
if ($index !== false) { 
    $page_content = 'includes/' . $pages[$index] . '.php'; 
    $title_name = $titles[$index]; 
} else { 
    print 'Page not found'; 
} 

?> 

Hope this help.

Cuestiones relacionadas