Mejores prácticas: ¿Cuál es la mejor manera de construir encabezados y pies de página?

StackOverflow https://stackoverflow.com/questions/176856

  •  05-07-2019
  •  | 
  •  

Pregunta

¿Cuál es la mejor manera de construir encabezados y pies de página? ¿Debería llamarlo todo desde el controlador o incluirlo 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, como este?

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 única, y llamando desde allí las vistas de encabezado y pie de página:

//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'); ?>

Lo he visto hecho en ambos sentidos, pero quiero elegir ahora antes de ir demasiado lejos por un camino.

¿Fue útil?

Solución

También puede 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) que el controlador aprobó.

En tu controlador:

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

// more code...

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

Luego, define un diseño predeterminado para todas las páginas, p. 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. ej. views / your_controller / index.php puede contener solo las variables pasadas desde el controlador / matriz de datos

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

Más detalles en el wiki / FAQ de CI - (P. ¿Cómo puedo incrustar las vistas dentro de las vistas? ? Plantillas anidadas? ...)

Otros consejos

En realidad, después de investigar esto bastante por mi cuenta, 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, a saber, la ampliación de un controlador base. Eso le dará un poco más de flexibilidad que la sugerencia de htxt, especialmente si está creando un diseño muy modular (no solo encabezado y pie de página, también paneles de barra lateral, menús no estáticos, etc.).

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

class Base_controller extends Controller
{
    var 

En realidad, después de investigar esto bastante por mi cuenta, 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, a saber, la ampliación de un controlador base. Eso le dará un poco más de flexibilidad que la sugerencia de htxt, especialmente si está creando un diseño muy modular (no solo encabezado y pie de página, también paneles de barra lateral, menús no estáticos, etc.).

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

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

Luego, en sus controladores de página, simplemente extienda la clase base y llame a sus funciones para crear la página.

<*>

Usando un controlador base, puede lograr un código muy limpio en sus controladores de página individuales Y tener vistas separadas para los elementos de la página (permitiendo la reutilización del código tanto en las vistas como en los controladores). Todo lo que necesita hacer es definir las 'secciones' de su página común (lo que podría estar tentado de llamar 'fragmentos') como funciones en su controlador base.

Y si el controlador base comienza a crecer sin control (lo que puede suceder en sitios grandes), puede reorganizar algunas de sus funciones menos generales ubicándolas en subclases, y deje que los controladores de página correspondientes extiendan esos en lugar del original. controlador base.

¡Disfruta!

/ Jens Roland

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 sus controladores de página, simplemente extienda la clase base y llame a sus funciones para crear la página.

<*>

Usando un controlador base, puede lograr un código muy limpio en sus controladores de página individuales Y tener vistas separadas para los elementos de la página (permitiendo la reutilización del código tanto en las vistas como en los controladores). Todo lo que necesita hacer es definir las 'secciones' de su página común (lo que podría estar tentado de llamar 'fragmentos') como funciones en su controlador base.

Y si el controlador base comienza a crecer sin control (lo que puede suceder en sitios grandes), puede reorganizar algunas de sus funciones menos generales ubicándolas en subclases, y deje que los controladores de página correspondientes extiendan esos en lugar del original. controlador base.

¡Disfruta!

/ Jens Roland

Creo que la primera forma de hacerlo es más limpia. Simplemente desde un punto de vista de saber que va a ser prestado. En lugar de tener que introducir el archivo de vista para encontrar el resto.

Es una mala práctica llamar vistas dentro de otras vistas. Esto podría ser una forma de mezclar vista controlador. La función de vista en CI le permite pasar un tercer parámetro que hace que devuelva esa salida de vistas como una cadena. Puedes 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 el encabezado y el pie de página para crear 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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top