Estoy empezando un gran proyecto de codeigniter y me gustaría probar a crear algunos reutilizables ‘mini’ puntos de vista de fragmentos de contenido, como los bucles de datos que pueden ser visualizados en diferentes páginas/controladores.

Es mejor llamar a los puntos de vista desde dentro de la controladora principal de la vista? Si es así, ¿cómo? O debo llamar a la ‘mini vista’ desde el controlador y así pasar a la vista de que el código de la vista principal?

InformationsquelleAutor David | 2013-03-05

6 Comentarios

  1. 106

    Puntos de vista dentro de otros puntos de vista son llamados vistas Anidadas.
    Hay dos formas de incluir vistas anidadas en CodeIgniter:

    1. Cargar una vista anidada dentro de la controladora

    De carga de la vista en avanzar y pasar a la otra vista. Primero poner 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);
    ?>

    A continuación, poner <?=$menu?> en su punto de vista en el punto que desea que aparezca el menú.

    2. Carga de una visión «desde dentro» a la vista de

    Primer puesto en el controlador:

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

    A continuación, poner esto en el /application/views/home.php vista:

    <?php $this->view('menu'); ?>
    
    <p>Other home content...</p>

    Sobre el mejor método, yo prefiero el 1 método 2, debido a que mediante el uso de 1er método no tengo que mezclar código, no es como el incluyen php. Aunque indirectamente, ambos son los mismos, el 1er método es más clara & limpiador de 2!

    • Yo creo que no hay necesidad de Cargar la vista en avanzar y pasar a la otra vista.ver mi solución
    • usted me cansaría notado el comentario : el «VERDADERO» argumento le dice que devuelva el contenido, en lugar de mostrar, de inmediato lo que significa que no va a afectar a todos, incluso es cargado por adelantado
    • 1), a Continuación, en la vista de inicio, solo hay que añadir echo $menú.
    • ADVERTENCIA: Al pasar de una vista de esta manera (con el TRUE parámetro ) se están convirtiendo a todos su punto de vista contenido en un cadena. Esto funciona la mayoría del tiempo, pero una vez que se tienen datos pesados, o tal vez cuando usted está pasando matrices o JSON, este se va a romper.
    • No me gusta el método 1 porque en el home punto de vista no es nunca una correcta recepción de $menu … si usted fuera a mirar en el home, tendría ni idea de dónde $menu vino de …
    • cuando tengo que pasar algunos datos dinámicos a menú a través de una variable, ¿qué debo hacer? Parece que todos mis variables en la vista de menú no funcionan. PHP se queja acerca de «undefined variable». Actualización: he encontrado la solución, he tenido que cambiar NULL con la $variable de datos
    • 2º manera es la forma más preferida

  2. 17

    Honestamente prefiero hacer esto a través de la plantilla de puntos de vista, a continuación, cargar con los datos necesarios desde el controlador, significa mucho menos repetido código y sigue el SECO concepto mejor que la carga de las vistas desde puntos de vista. Especialmente para las cosas como encabezados, pies de página y los menús.

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

    template.php

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

    A continuación, en mi controlador que me pase los datos necesarios para la plantilla como esta:

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

    Hay una serie de beneficios a hacerlo de esta manera. La primera es que puede tener varias plantillas, por ejemplo yo tengo, en mi caso, dos principales, uno para la página completa de puntos de vista sin una barra lateral y en una de las páginas con una barra lateral, también me llama una instrucción if para decidir cual de encabezado para incluir, el ordinario o el uno con el menú de administración en él.

    Sí podría incluir la cabecera, barra lateral y pie de página en cada página de la vista, pero que termina en una tonelada de código duplicado. ¿Y qué pasa si por ejemplo quiero que todos mis páginas para tener algo nuevo, algún otro pequeño fragmento? El uso de plantillas de añadir un fragmento de código a la plantilla adecuada y se hace. Va el otro camino me encuentro a cada página y añadir el fragmento de vista, es el equivalente a tener el CSS en la página, en mi opinión, derrochador y, en definitiva, no pueden mantener.

    • Me gusta su técnica, pero no acabo de entender cómo los otros métodos para aumentar el esfuerzo de codificación. Digamos, por ejemplo, si quiero añadir una barra de idioma en el encabezado de la vista, que acababa de editar el encabezado de la vista y nada más. Me estoy perdiendo algo? Por CIERTO, soy un viejo tiempo coder que es totalmente nuevo para CodeIgniter.
    • No incrementar el esfuerzo de codificación como mucho, ya que aumentan código duplicado. Buscar en el código anterior. Si yo no hubiera creado una plantilla entonces yo estaría llamando a la primera de 4 líneas para cada página en mi controlador. Es más acerca de la modularidad y la facilidad de inclusión/exclusión de cualquier cosa. En una muy básica sitio donde todas las páginas cuentan con los mismos elementos que en realidad no es gran cosa, o incluso realmente vale la pena el esfuerzo añadido. En un complejo de sitio en las páginas varían significativamente puede ahorrar un montón de dolores de cabeza y la duplicación.
    • no es este efecto el mismo método 2 de @sandip la respuesta ??
    • Mi respuesta le dio un punto de vista alternativo para el mismo código y mostró los beneficios de la separación en las plantillas. El método de inyección es el mismo, la visión de conjunto que no es ni siquiera cerca. De 3 años con respuesta, ¿realmente importa si dos personas se dan el mismo código con diferentes puntos de vista?
    • ¿Cómo puedo pasar datos $a de cabecera? Digamos que quiero pasar más cosas a la cabecera de sólo $título
    • Hacer que los datos se pasa a la cabecera de una matriz. Así que usted podría hacer $datos[‘header_data’][‘title’] y $datos[‘header_data’][‘tagline’], a continuación, en la plantilla sólo tiene que pasar el $header_data que debería funcionar bien.

  3. 5

    MÉTODO 1

    Yo uso este método en mi punto de vista para insertar el incluir a ver a donde quiero

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

    MÉTODO 2

    o en el controlador puede cargar más de una vista como esta:

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

    Ningún método es mejor que el otro, depende de si tienes que pasar algunos datos (en este caso el uso de method2) o si desea incluir una vista en una parte específica de la vista principal (en este caso es mejor utilizar method1)

    MÉTODO 3

    Pasar los datos a incluir su vista 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 quieres pasar toda la información a tu incluir a ver que puede hacer de esta manera:
    en el controlador:

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

    en su opinión,

    $this->load->view('includes/included_view', $nestedView);
    • Voy a estar buscando para pasar los datos, pero el método parece ser la mejor idea. Solo falta averiguar cómo pasar los datos a la misma.
    • así que usted puede pasar los datos en este modo: $this->carga>view(‘include/include_view’,$datos); pero el problema es que en el controlador tiene que pasar los datos a su controlador principal y en su controlador principal que usted tiene que pasar los datos a incluir su punto de vista, es un largo camino, pero si usted necesita este puede
    • editado mi respuesta
    • es allí una manera de pasar la totalidad de los datos?
    • editado mi respuesta @David
  4. 4

    Esta una forma sencilla de incluir puntos de vista dentro de las vistas.no hay necesidad de cargar opiniones con antelación.acaba de pasar la vista camino a otro punto de vista.

    En su controlador de usar este:

    $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 puede incluir otros puntos de vista :

    $this->load->view($middle);
  5. 0

    En mi opinión, para resolver en forma más eficiente este problema lo he hecho:

    Crear un nuevo ayudante (en application/helpers) con el nombre (es. common_helpers.php, el subrayado es importante). En este archivo, poner 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 el controlador de llamar a sólo un punto de vista respecto de MVC y llamar a las funciones de su auxiliar personalizada.

    class Hello extends CI_Controller {
    
       public function index(){
           $this->load->helper('common');
           $this->load->view('index');   
       }
    
    }
  6. -1

    En el controlador de

    controlador de

    <?php
        public function view($page = NULL)
            {
              if ( ! file_exists(APPPATH.'views/pages/'.$page.'.php'))
            {
                     $data['title'] = ucfirst($page); //Capitalize the first letter
                    //Whoops, we don't have a page for that
                    show_404();
    
            }
    
            $data= array(''); 
            $data['title'] = ucfirst($page); //Capitalize the first letter 
             $data['page_layout']='pages/'.$page;    
             $this->load->view('page_layout', $data);
            }
    ?>

    En la carpeta Vistas a crear una página que se llama page_layout.php

    page_layout.php
    
    //This is where you set the layout to call any view through a variable called $page_layout declared in the controller//
    
     <?php
         $this->load->view('header');
         $this->view($page_layout);
         $this->load->view('footer');
      ?>

Dejar respuesta

Please enter your comment!
Please enter your name here