2008-10-07 17 views
15

¿Cuál es la mejor manera de construir encabezados y pies de página? ¿Debería llamarlo todo desde el controlador o incluir desde el archivo de vista? Estoy usando CodeIgniter, y quiero saber cuál es la mejor práctica para esto. Cargando todos los archivos de vista incluidos desde el controlador, así?Mejores prácticas: ¿Cuál es la mejor manera de construir encabezados y pies de página?

class Page extends Controller { 

    function index() 
    { 
     $data['page_title'] = 'Your title'; 
     $this->load->view('header'); 
     $this->load->view('menu'); 
     $this->load->view('content', $data); 
     $this->load->view('footer'); 
    } 

} 

o llamando al archivo de vista único, y llamando a los puntos de vista de encabezado y pie de allí:

//controller file  
class Page extends Controller { 

    function index() 
    { 
     $data['page_title'] = 'Your title'; 
     $this->load->view('content', $data); 

    } 

} 

//view file 

<?php $this->load->view('header'); ?> 

<p>The data from the controller</p> 

<?php $this->load->view('footer'); ?> 

que he visto hacer en ambos sentidos, pero quiere elegir ahora antes de ir demasiado lejos por un camino.

+0

Debido a que su pregunta era sobre CodeIgniter - Sólo quiero que transmita a la forma en Zend Framework se encarga de esto: http://framework.zend.com/manual/en/zend.layout.html – leek

Respuesta

9

También podría intentarlo de esta manera: defina una plantilla de vista predeterminada, que luego extrae el contenido en función de una variable ('contenido' en mi ejemplo) pasada por el controlador.

En su controlador:

$data['content'] = 'your_controller/index'; 

// more code... 

$this->load->vars($data); 
$this->load->view('layouts/default'); 

a continuación, definir un diseño predeterminado para todas las páginas, por ejemplo, views/layouts/default.php

// doctype, header html etc. 

<div id="content"> 
    <?= $this->load->view($content) ?> 
</div> 

// footer html etc. 

Luego, sus vistas solo pueden contener el contenido puro, p. vistas/your_controller/index.php podría contener sólo las variables pasadas de la matriz de control/datos

<?= $archives_table ?> 
<?= $pagination ?> 
// etc. 

More details on the CI wiki/FAQ - (? P: ¿Cómo puedo incrustar puntos de vista dentro de las plantillas de vistas anidadas ...)

+0

Lo que más me gusta de este enfoque es que puedo deshacerme de todos esos errores en mi IDE acerca de las etiquetas de final faltantes y las etiquetas de inicio faltantes en los fragmentos de encabezado y pie de página. ¡Bonito! –

3

Es una mala práctica llamar vistas dentro de otras vistas. Esta podría ser una forma de mezcla de vista controladora. La función de vista en CI le permite pasar un tercer parámetro que hace que devuelva esa salida de salida como una cadena. Puede usar esto para crear una vista compuesta.

Por ejemplo:

class Page extends Controller { 
    function index() { 
     $data['page_title'] = 'Your title'; 

     $this->load->view('default_layout', array(
     'header' => $this->load->view('header' , array(), true), 
     'menu' => $this->load->view('menu' , array(), true), 
     'content' => $this->load->view('content', $data , true), 
     'footer' => $this->load->view('footer' , array(), true), 
    )); 
    } 
} 

default_layout.php

<? echo $header, $menu, $content, $footer; ?> 

Es posible que desee combinar su cabecera y el pie para hacer una plantilla como esta.

class Page extends Controller { 
    function index() { 
     $data['page_title'] = 'Your title'; 

     $this->load->view('default_template', array(
     'menu' => $this->load->view('menu' , array(), true), 
     'content' => $this->load->view('content', $data , true), 
    )); 
    } 
} 

default_template.php

<html><head></head><body><span>Some Header HTML</span> // this is your header html 
<? echo $menu, $content; ?> 
<span>some footer HTML</span></body></html> // this is your footer html 
4

Creo que la primera forma en que lo está haciendo es más limpio. Simplemente desde el punto de vista de saber que se va a representar. En lugar de tener que ingresar al archivo de vista para encontrar el resto.

13

En realidad, después de investigar un poco sobre esto, llegué a la conclusión de que la mejor práctica para incluir encabezados y pies de página en MVC es una tercera opción: ampliar un controlador base. Eso le dará un poco más de flexibilidad que la sugerencia de htxt, particularmente si está construyendo un diseño muy modular (no solo el encabezado y el pie de página, también los paneles de la barra lateral, los menús no estáticos, etc.).

Primero, defina una clase Base_controller, en la que cree métodos que anexen los elementos de su página (encabezado, pie de página, etc.) A una cadena de salida:

class Base_controller extends Controller 
{ 
    var $_output = ''; 

    function _standard_header($data=null) 
    { 
     if (empty($data)) 
      $data = ...; // set default data for standard header here 

     $this->_output .= $this->load->view('header', $data, true); 
    } 

    function _admin_header($data=null) 
    { 
     if (empty($data)) 
      $data = ...; // set default data for expanded header here 

     $this->_output .= $this->load->view('admin_header', $data, true); 
    } 

    function _standard_page($data) 
    { 
     $this->_standard_header(); 
     $this->_output .= 
      $this->load->view('standard_content', $data, true); 
     echo $this->_output; // note: place the echo statement in a 
          // separate function for added flexibility 
    } 

    function _page_with_admin_header($data) 
    { 
     $this->_admin_header($data); 
     $this->_output .= 
      $this->load->view('standard_content', $data, true); 
     echo $this->_output; 
    } 
} 

Luego, en los controladores de la página, simplemente extender la clase base y llame a las funciones para construir la página.

class Page_controller extends Base_controller 
{ 
    function index() 
    { 
     $data = ...; // Set content data here 
     $this->_standard_page($data); 
    } 

    function admin() 
    { 
     $data = ...; // Set content and header data here 
     $this->_page_with_admin_header($data); 
    } 
} 

El uso de un controlador base, se puede lograr un código muy limpio en sus controladores de páginas individuales y tienen unas vistas separadas para los elementos de la página (que permite la reutilización de código en ambas vistas y controladores). Todo lo que necesita hacer es definir sus 'secciones' comunes de página (lo que podría estar tentado de llamar 'fragmentos') como funciones en su controlador base.

Y si el controlador base debería comenzar a crecer incontrolablemente (lo que puede suceder en sitios grandes), puede reorganizar algunas de sus funciones menos generales colocándolos en subclases y dejar que los controladores de página correspondientes amplíen esos en lugar del controlador base original.

¡Disfrútalo!

/Jens Roland

Cuestiones relacionadas