2010-09-05 27 views
21

He estado aprendiendo sintaxis para PHP y practicándolo. Vengo de un fondo .NET así que las páginas maestras siempre me facilitaron las cosas cuando se trataba de encabezados y pies de página.PHP incluye las mejores prácticas pregunta

hasta ahora tengo un mainHeader.php y mainFooter.php que tienen mi menú de la cabeza y el pie de página html. He creado un mainbody.php y en la parte superior pongo

<?php include "mainHeader.php" ?> 

y del pie de página puse

<?php include "mainFooter.php" ?> 

Esto funcionó perfectamente y me hizo sonreír porque mis páginas se reunieron todos muy bien. el cabezal principal tiene mi <html> y <body> y mi mainFooter tiene mis etiquetas de cierre para esos.

¿Es esta una buena práctica?

+0

Esos nombres de archivo debe ir entre comillas, no? – BoltClock

+0

Sí, de lo contrario evaluarán como definición de cadena concatenada, emitirán una advertencia e incluirán 'mainHeaderphp' y' mainFooterphp' (sin puntos). – aularon

+0

gracias. sí, están entre comillas, simplemente no los escribí aquí. – drpcken

Respuesta

47

Incluyo mis puntos de vista de mis controladores. También defino ubicaciones de archivos para facilitar el mantenimiento.

config.php

define('DIR_BASE',  dirname(dirname(__FILE__)) . '/'); 
define('DIR_SYSTEM', DIR_BASE . 'system/'); 
define('DIR_VIEWS',  DIR_SYSTEM . 'views/'); 
define('DIR_CTLS',  DIR_SYSTEM . 'ctls/'); 
define('DIR_MDLS',  DIR_SYSTEM . 'mdls/'); 
define('VIEW_HEADER', DIR_VIEWS . 'header.php'); 
define('VIEW_NAVIGATION', DIR_VIEWS . 'navigation.php'); 
define('VIEW_FOOTER', DIR_VIEWS . 'footer.php'); 

ahora tengo toda la información que necesito simplemente mediante la inclusión de config.php.

controller.php

require('../config.php'); 
include(DIR_MDLS . 'model.php'); 

$model = new model(); 
if ($model->getStuff()) { 
    $page_to_load = DIR_VIEWS . 'page.php' 
} 
else { 
    $page_to_load = DIR_VIEWS . 'otherpage.php' 
} 

include(VIEW_HEADER); 
include(VIEW_NAVIGATION); 
include(DIR_VIEWS . $page_to_load); 
include(VIEW_FOOTER); 
+0

¡Gracias! Esto es extremadamente informativo y ya he implementado algo similar. – drpcken

+0

Pregunta rápida: ¿estás usando un marco? Estoy intentando codeigniter y me pregunto si es necesario que defina esta información de directorio en config.php? – drpcken

+0

eso no es usar mi propio "marco". no tiene que hacer eso con el codificador de encendido – Galen

3

La buena práctica hoy en día es el uso de un motor de plantillas, como smarty. Para toda la aplicación considere usar un framework, como codeigniter.

+9

no podría estar más en desacuerdo sobre smarty – Galen

+0

Sí, lo sé. Estoy teniendo malos momentos con eso :) fue solo el primer ejemplo de un motor de plantillas que se me pasó por la cabeza. Y después de sugerir utilizar un marco, no pensé que el ejemplo del motor de plantillas importara tanto, así que no pensé mucho sobre eso. Gracias por los comentarios de todos modos:) – aularon

+2

No me gusta mucho smarty, pero la idea de usar un motor de plantillas es genial. Excepto con PHP ... ya que PHP ya es un motor de plantillas, es un poco raro. Aún así, el patrón tipo MVC es mucho mejor ... um ... ¡usemos un framework! Pero las plantillas h20 son geniales para PHP. –

5

También puede hacerlo al revés. Tener una página principal con encabezado/pie de página e incluir solo el cuerpo.

<!DOCTYPE html> 
<html lang="en"> 
    <head> 
     ... 
    </head> 
    <body> 
     <?php include $page ?> 
    </body> 
</html> 
+2

Ahh Puedo ver cómo esto sería útil para generar datos dinámicos. ¡Muchas gracias! – drpcken

3

Lo que estás haciendo está bien hasta que empiece a usar "Vistas" o "Plantillas" en cuyo caso ya no organizar su contenido HTML dentro del "controlador" o "acción" en funcionamiento.

En su lugar se carga una vista y rellenarla con los valores que deja a todo el ordenamiento fuente HTML a la vista y no su archivo PHP.

$view = new View('layout.php'); 
$view->header = $header; 
$view->content = 'This is the main content!'; 
$view->footer = $footer; 
print $view; 

que luego se carga el archivo de diseño que se ve algo como esto:

<!DOCTYPE html> 
<html lang="en"> 
    <head> 
     ... 
    </head> 
    <body> 
     <div id="header"><?php print $header; ?></div> 
     <div id="content"><?php print $content; ?></div> 
     <div id="footer"><?php print $footer; ?></div> 
    </body> 
</html> 
+0

Esto es genial. Simplemente se preguntó cómo podría organizar Views y sus equivalentes HTML. –

+0

¡Por qué no había pensado en esto! Esto es genial. –

0

Este es un método perfectamente bien, siempre y cuando su sitio no superan el umbral de 20 páginas. Sin embargo, aconsejo utilizar include() en el estilo de la función, no como constructo, y colocar estas plantillas en una subcarpeta separada. Si no hay código PHP en ellos, también use una extensión de archivo .htm (htm designar html parcial).

include("template/main/header.htm"); // would still parse PHP code! 

La desventaja de este enfoque es que algunos terminan inyectando HTML a través de variables globales. $HEAD='<link...>'; include("../header.htm"). Lo cual no es malo per se, pero puede acumular rápidamente cruft.

0

me gusta usar funciones para imprimir los encabezados y pies de página en lugar de incluye.Puedes afinar el alcance de la variable mejor de esa manera.

+0

¿Esa es tu respuesta? –

3

Para resumir todo lo anterior.
Esa es una buena forma de usar includes, pero no se olvide de usar una página de plantilla para los contenidos de la página.

basado en parte en Galen y Balus':

page.php

require $_SERVER['DOCUMENT_ROOT'].'/../config.php'; 
$data = get_data(); // assume we get all required data here. 
$pagetitle = "This is a sample page"; 
$template = "page.tpl.php"; 
include "main.tpl.php"; 

main.tpl.php

<!DOCTYPE html> 
<html lang="en"> 
    <head> 
     <title><?php echo $pagetitle?></title> 
    </head> 
    <body> 
     <?php include $template ?> 
    </body> 
</html> 

page.tpl.php algo como esto:

<h1><?php echo $pagetitle?></h1> 
<?php if (!$data): ?> 
No news yet :-(
<?php else: ?> 
<ul> 
<? foreach ($data as $row): ?> 
<li><a href="news.php?id=<?php echo $row['name']?>"><?php echo $row['name']?></a></li> 
<?php endforeach ?> 
</ul> 
<?php endif ?> 
0

Para sitios pequeños, include/include_once y require/require_once son geniales, no he construido un sitio sin ellos en años. Sin embargo, recomendaría asegurarme de que cada uno de tus archivos de inclusión sea un bloque de código discreto que sea XML válido. Lo que quiero decir es que no abra una etiqueta en una y que cierre en otra, o viceversa: hará que los cambios sean más complejos y más propensos a romper cosas porque usted tiene dependencias entre archivos. Feliz codificación!

0

Sé que es muy tarde, solo quería agregar mis "centavos vale la pena" a esta pregunta.

Mi sugerencia sería crear métodos para esto, por ejemplo mi raíz es: var/www/htdocs/y el archivo de funciones está en includes/functions/template-parts.php.
Mis funciones se vería como tal:

<?php 

define("DOC_ROOT", "/var/www/htdocs/"); # Add a trailing slash to make it a little easier 

function GetHeader() 
{ 
    return include DOC_ROOT . 'includes/parts/header.htm'; # Header found at include/parts/header.htm 
} 

function GetFooter() 
{ 
    return include DOC_ROOT . 'includes/parts/footer.htm'; # Footer found at include/parts/footer.htm 
} 

?> 

y se utiliza como tal:

<?php 

# From the main page (/var/www/htdocs/index.php) 
require_once 'includes/functions/template-parts.php'; 
GetHeader(); 
?> 
<!-- Page content --> 
<?php 

GetFooter(); 

?>