El mejor método para incluir vistas dentro de vistas en CodeIgniter


Estoy comenzando un gran proyecto de codeigniter y me gustaría intentar crear algunas vistas 'mini' reutilizables para fragmentos de contenido como bucles de datos que pueden mostrarse en diferentes páginas/controladores.

¿Es mejor llamar a las vistas desde la vista del controlador principal? Si es así, ¿cómo? ¿O debería llamar a la 'mini vista' desde el controlador y así pasar el código de la vista a la vista principal?

Author: tereško, 2013-03-05

5 answers

Las vistas dentro de otras vistas se llaman Vistas anidadas. Hay dos formas de incluir vistas anidadas en CodeIgniter:

1. Cargar una vista anidada dentro del controlador

Cargue la vista por adelantado y pase a la otra vista. Primero pon esto en el controlador:

<?php
// the "TRUE" argument tells it to return the content, rather than display it immediately
$data['menu'] = $this->load->view('menu', NULL, TRUE);
$this->load->view ('home', $data);
?>

Luego coloque <?=$menu?> en su vista en el punto en el que desea que aparezca el menú.

2. Cargar una vista" desde dentro " una vista

Primero pon esto en el controlador:

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

Entonces pon esto en la vista /application/views/home.php:

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

<p>Other home content...</p>

Sobre el mejor método, prefiero el método 1st sobre el 2nd uno, porque al usar el método 1st no tengo que mezclar código, no es como include php. Aunque indirectamente ambos son iguales, ¡el 1er método es más claro y más limpio que el 2do!

 89
Author: sandip,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-12 17:38:44

Honestamente, prefiero hacer esto al tener vistas de plantilla y luego cargar eso con los datos necesarios del controlador, significa mucho menos código repetido y sigue el concepto SECO mejor que cargar vistas desde vistas. Especialmente para cosas como encabezados, pies de página y menús.

Así que mi vista de plantilla se vería algo como esto:

Plantilla.php

$this->load->view('header',$title);
$this->load->view('sidebar',$sidebar_content);
$this->load->view('main_content',$main_content);
$this->load->view('footer');

Luego en mi controlador paso los datos requeridos a la plantilla de esta manera:

$data['title'] = 'Home Page';
$data['sidebar_content']='pages/standard_sidebar';
$data['main_content'] ='pages/my_home_page'; 
$this->load->view('template',$data);

Hay un número de beneficios de hacerlo de esta manera. Primero es que puedo tener varias plantillas, por ejemplo, tengo, en mi caso, dos principales, una para vistas de página completa sin una barra lateral y otra para páginas con una barra lateral, también llamo a una instrucción if para decidir qué encabezado incluir, la normal o la que tiene el menú de administración en ella.

Sí, podría incluir el encabezado, la barra lateral y el pie de página en cada página de vista principal, pero eso termina en un montón de código duplicado. Y qué pasa si, por ejemplo, quiero que todas mis páginas tener algo nuevo, algún otro pequeño fragmento? Usando plantillas agrego el fragmento a la plantilla apropiada y listo. Yendo por la otra ruta, encuentro cada página y agrego la vista de fragmento allí, es el equivalente a tener CSS en la página en mi opinión, es un desperdicio y no se puede mantener en última instancia.

 15
Author: Rick Calder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-05 12:17:09

MÉTODO 1

Utilizo este método en mi vista para insertar la vista include donde quiero

$this->load->view('include/include_view');


MÉTODO 2

O en el controlador puede cargar kore que una vista como esta:

$this->load->view('header_view');
$this->load->view('list_view');
$this->load->view('footer_view');

No es un método mejor, depende si tiene que pasar algunos datos (en su caso use el metodo 2) o si desea incluir una vista en una parte específica de su vista principal (en este caso es mejor usar el método 1)


MÉTODO 3

Pasando datos a su vista include por su vista principal

En su controlador:

$data['title'] = "Title";
$this->load->view('main_view',$data);

En su opinión

$data2['title'] = $title;
$this->load->view('include/include_view',$data2);

Si desea pasar datos completos a su vista de inclusión, puede hacerlo en este modo: en su controlador:

$data['nestedView']['title'] = 'title';

En su opinión

$this->load->view('includes/included_view', $nestedView);
 5
Author: Alessandro Minoccheri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-05 11:04:27

Esta es una forma sencilla de incluir vistas dentro de vistas.no es necesario cargar vistas con antelación.simplemente pase la ruta de vista a otra vista.

En tu controlador usa esto:

$data['middle'] = 'includeFolder/include_template_view';  //the view you want to include
$this->load->view('main_template_view',$data);  //load your main view

Y en main_template_view puedes incluir otras vistas:

$this->load->view($middle);
 4
Author: Rahul Chipad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-05 11:37:38

En mi opinión para resolver de manera más eficiente este problema lo he hecho:

Se crea un nuevo helper (en aplicación/helpers) con nombre (es). common_helpers.php, el subrayado es importante). En este archivo, pones todas las funciones, por ejemplo, construir piezas de html en común.

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

    function getHead(){
    require_once(APPPATH."views/common/head.php");
    }   

    function getScripts(){
    require_once(APPPATH."views/common/scripts.php");
    }

    function getFooter(){
    require_once(APPPATH."views/common/footer.php");
    }

En su controlador solo llama a una vista con respecto a MVC y llama a las funciones desde su ayudante personalizado.

class Hello extends CI_Controller {

   public function index(){
       $this->load->helper('common');
       $this->load->view('index');   
   }

}
 1
Author: Tudor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-27 14:56:06