Template - Layout unico

205 views
Skip to first unread message

Eduardo Passarelli

unread,
Jan 19, 2011, 2:12:56 PM1/19/11
to codeignit...@googlegroups.com
Buenas gente, la verdad es que quise comenzar ayer mismo con un proyecto desde 0 de un portal y arranque con CI que en todos lados dicen que es muy muy rápido el comenzar a manejarlo pero la verdad es que me acabo de chocar con una pared porque no puedo hacer nada con el layout.

Primero vi que en cada controlador y sus funciones podía cargar todas las vistas necesarias pero esto me hace cargar miles de vistas por todos lados cosa que no me gusta nada.

Como mi web tiene muchas paginas pero todas con el mismo layout (HEADER, TOPMENU, CONTENT, RIGHTMENU y FOOTER) pensé en crear un único layout y que se autocargue para todos los controladores.

Para eso encontré una librería template :
que supuestamente maneja esto pero no se que pasa que no logro hacer nada.

Alguien me podría tirar un salvavidas.
Muchas gracias de antemano

Alejandro

unread,
Jan 19, 2011, 2:17:09 PM1/19/11
to codeignit...@googlegroups.com
Hola, yo manejo mis plantillas así

En el controlador escribo esto:

$data_h['title'] = 'Citas';
$$data_h['links'] = array(
$this->config->item('main_css'),
$this->config->item('tablas_css')
);
$data_h['js'] = array(
$this->config->item('jquery'),
$$this->config->item('script'),
$this->config->item('jquery_ui')
);
$data['header']  = $this->load->view('templates/header', $data_h, TRUE);
$data['footer']  = $this->load->view('templates/footer', NULL, TRUE);
$formato_fecha = "%Y-%m-%d";
$time = time();
$dia = mdate($formato_fecha, $time);
$data['result'] = $this->cita_model->get_dia($dia);
$data['vista'] = 'admin/cita/cita';
$this->load->view('templates/body', $data);

y en mi archivo template.php tengo lo siguiente.

BODY.PHP

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

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

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

Espero que te sirva.

Buen día.



__

Alejandro Ñáñez Ortiz
Ingeniero de sistemas.
Webmaster
--
---
Para anular la suscripción a este grupo, envía un mensaje a
codeigniter-spa...@googlegroups.com
Para obtener más opciones, visita este grupo en
http://groups.google.com/group/codeigniter-spanish?hl=es.

Eduardo Passarelli

unread,
Jan 19, 2011, 2:24:56 PM1/19/11
to codeignit...@googlegroups.com
claro, vos aca estas preseteando en cada controlador los css, js y un par de cosas mas y despues lo mostras en la vista.
Creo entenderlo pero, tenes que crear un template para cada controlador o siempre estas usando el mismo?

Y no se puede hacer algo que cargue por ejemplo la vista en una variable (onda patron decorador) y luedo carcar el layout como una vista en donde tenga

Todo el html header
echo $content;
todo el html del footer


Alejandro

unread,
Jan 19, 2011, 2:30:41 PM1/19/11
to codeignit...@googlegroups.com
Cada controlador tiene un body diferente, lo que es constante es el header y el footer.

Entonces en la carpeta templates haces los archivos HEADER.PHP y FOOTER.PHP que te sirvan para todo el sitio y el body es el que va a cambiar, entonces así es que los cargas.

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

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

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

La variable $VISTA es la que uno pasa desde el controlador.



__

Alejandro Ñáñez Ortiz
Ingeniero de sistemas.
Webmaster

Juanmy

unread,
Jan 19, 2011, 6:29:53 PM1/19/11
to codeignit...@googlegroups.com
Efectivamente es como te comenta Alejandro, luego en tu controlador pones:

$data['vista'];
$this->load->view('template',$data);

Siendo template el archivo que él te ha escrito, a la vez en ese mismo array data le puedes pasar todas las variables que quieras usar en cualquiera de las vistas que se contengan en la vista template.php

Para hacer esto no se uso ninguna librería template, sólo el sistema de vistas que tiene el propio CI.

Eduardo Passarelli

unread,
Jan 20, 2011, 2:44:19 PM1/20/11
to codeignit...@googlegroups.com
aha, y en ese caso como le pasas tambien por ejemplo el title, las meta-descriptions, las vistas de la columna derecha y otras yerbas?

Otra mas, por que tengo que tener tantos bodys o como uno quiera llamarlos, no puedo tener solo un LAYOUT y cargarlo al final e intentar usar el modelo DECORATOR?

Disculpa las preguntas pero quiero tratar de simplificar y no repetir codigo y siento que asi estoy cargando en muchos archivos las mismas vistas y no reutilizo 100%
De cualquier forma si asi lo usan todos....

Eduardo Passarelli

unread,
Jan 21, 2011, 9:56:26 AM1/21/11
to codeignit...@googlegroups.com
Bueno, ya lo estoy haciendo como decian Alejandro y apoyaba Juanmy y la verdad es que esta funcionando muy bien.
El unico inconveniente que tengo ahora es que no encuentro la forma de pasarle el title, y description a cada pagina ya que el header se carga desde el Template y los datos yo se los paso a la vista que esta entre el Header y Footer.

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

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

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

Alguna solucion para esto ??? Gracias

Julian Magnone

unread,
Jan 21, 2011, 9:59:51 AM1/21/11
to codeignit...@googlegroups.com
Hola:

Yo lo que uso, y que me ha dado mucho resultado, es una propiedad $data en una superclase del controlador, definida en MY_Controller


Pero básicamente lo que hacés es crearte un $this->data con todo lo que quieras pasar.

En tu caso, luego tendrás que hacer algo así:

<?php $this->load->view('templates/header', $this->data ); ?>

Saludos!

Julián


2011/1/21 Eduardo Passarelli <epass...@gmail.com>
--

Damian Fernandez

unread,
Jan 21, 2011, 10:20:39 AM1/21/11
to codeignit...@googlegroups.com
Si la otra cosa que yo hago y me da muy buen resultado es usar variables de sesion
Por ejemplo seto el id_usuario , id_perfil al loguearse y otra variables mas las cuales consulto dentro del controlador por ejemplo:

// una vez que se loguea seteo la variable perfil
$this->session->set_userdata('id_perfil', $usuario->perfil);   
$this->session->set_userdata('username', $usuario->username);   
$this->session->set_userdata('login', true);


// esto esta dentro de un controlador el cual solo s epuede acceder si se s administrator
// ADMIN es una constante definida = 1;
if ($this->session->userdata('id_perfil') != ADMIN) {
            echo 'Acceso denegado';
            die;
{


Damian.

Juanmy

unread,
Jan 21, 2011, 4:57:12 PM1/21/11
to codeignit...@googlegroups.com
Le has puesto al header <?php $this->load->view('templates/header',$data); ?>

siendo $data el array donde pasas el nombre de la vista y todas las demás variables

Eduardo Passarelli

unread,
Jan 22, 2011, 4:09:22 PM1/22/11
to codeignit...@googlegroups.com
Sigo en el fondo del mar......

bue, en realidad ya me eleve como 2 mts jeje gracias a los aportes de uds.
mi estado es el siguiente:


Este es el index de mi seccion midominio/avisos
function index()
{
            
            $datos['title'] = "Listado de avisos";
            $datos['view'] = "avisos_view";
            $datos['filas'] = $this->avisos_model->obtener_todos();
            $datos['data'] = array($title="Avisos", $keywords="Avisos Clasificados", $descriptions="Avisos en Moron");
            $this->load->view('layouts/layout', $datos);
}

Este es mi layout en comun para todo el sitio
<?php 
$this->load->view('layouts/layout_header', $this->data);
$this->load->view('layouts/layout_top_menu');
$this->load->view('layouts/layout_encabezado');
$this->load->view($view);
$this->load->view('layouts/layout_sidebar');
$this->load->view('layouts/layout_footer');
?>

Este es mi layout_header
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="en-US" xml:lang="en" >
<head>
    <meta name="Keywords" content="<?=$keywords?>" />
    <meta name="Description" content="<?=$description?>" />
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />
    <meta name="author" content="Passarelli Eduardo" />
    <meta name="copyright" content="2011" />
    <meta name="distribution" content="global" />
    <meta name="robots" content="all" />
    <meta name="rating" content="general" />
    <meta name="content-language" content="es-ar" />
    
    <title><?=$title?></title>

    <script type="text/javascript" src="<?=base_url()?>js/script.js"></script>

    <link rel="stylesheet" href="<?=base_url()?>css/style.css" type="text/css" media="screen" />
    <!--[if IE 6]><link rel="stylesheet" href="<?=base_url()?>css/style.ie6.css" type="text/css" media="screen" /><![endif]-->
    <!--[if IE 7]><link rel="stylesheet" href="<?=base_url()?>css/style.ie7.css" type="text/css" media="screen" /><![endif]-->
</head>
<body>
    <div id="art-page-background-gradient"></div>


jeje de mas esta decirles que me tira errores por todos lados y nunca encuentra las variables title, keywords, descriptions
Estuve mirando el link que envio Julian y crei entenderlo hasta que lo hice y no anduvo nada. Ahi me di cuenta de que no habia entendido nada

Como es eso de la superclase? Como pasaria los datos?
Ayuda please !!!!

josepzin

unread,
Jan 23, 2011, 3:52:10 PM1/23/11
to CodeIgniter-spanish

Eduardo Passarelli

unread,
Jan 23, 2011, 10:05:39 PM1/23/11
to codeignit...@googlegroups.com
Gracias por el dato, mañana mismo empiezo a mirar esta librería que me parece por lo que vi que hace lo que los muchachos me venían diciendo en la lista.
Pero la miro mejor mañana xq parece clara en la implementacion.
Sigo en la lucha...

Alejandro Ñañez Ortiz

unread,
Jan 23, 2011, 11:34:51 PM1/23/11
to codeignit...@googlegroups.com
Hola!

Lo que yo hago es mandar los datos así por ejemplo:

EN EL CONTROLADOR:

$data_h['title'] = 'Principal Historias';

        $data_h['links'] = array(
                                $this->config->item('main_css'),
                                $this->config->item('tablas_css')
                                );
                               
        $data_h['js']      = array(
                                $this->config->item('jquery'),
                                $this->config->item('script'),
                                $this->config->item('jquery_ui')
                                );
       
        $data['header'] = $this->load->view('templates/header', $data_h, TRUE);
        $data['footer'] = $this->load->view('templates/footer', NULL, TRUE);
       
        $data['result'] = $this->consulta_model->get_all();
        $data['vista']     = 'admin/consulta/consulta';

       
        $this->load->view('templates/body', $data);

Y entonces, en la carpeta TEMPLATES tengo 3 archivos:

BODY, FOOTER, HEADER.

Vamos con el HEADER:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<head>
    <meta http-equiv="Content-type" content="text/html; charset=utf-8">
    <title><?php  echo $title; ?></title>
    ....
    ....

</head>
Acá continúa más sobre el header pero no importa para este ejemplo....


Ahora vamos con el BODY.PHP


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

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

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

Y ahora vamos con el FOOTER.PHP

 <?php echo $AlgunaVariableDelController; ?>

</body>
</html>


La verdad así me parece bastante fácil y flexible trabajar.

Sigues teniendo dudas? Para eso está la comunidad, para ayudarnos :D

Saludos!




--
Alejandro Ñáñez Ortiz.
Ingeniero de sistemas.
Webmaster.
http://www.alejo.me/

Eduardo Passarelli

unread,
Jan 24, 2011, 10:36:09 AM1/24/11
to codeignit...@googlegroups.com
Lo que no me cierra es lo siguiente, a estas variables 

$data_h['title'] = 'Principal Historias';
..................
..................
..................

Me decís que las definis en el controlador pero como? 
En cada uno de los métodos tengo que definir los headers, title etc

Lo que no entiendo es para que guardas en una variable el header y el footer, y despues volves a cargar las vistas en el template.php
Esto seguramente tiene un por que, pero yo no lo entiendo.

Ya probé parte de lo que me dijiste dentro de una función y anda, BUENISIMO pero de cualquier forma quisiera saber para que se carga

$data['header'] = $this->load->view('templates/header', $data_h, TRUE);

y luego viaja a través de $data al cargar la vista:

Francisco Sánchez

unread,
Jan 25, 2011, 9:57:36 PM1/25/11
to CodeIgniter-spanish
Buenas, acabo de entrar en este grupo, a ver si puedo echaros una mano
a la vez que aprendo también.
Estoy usando templates de la forma que habeis explicado y difiero en
varias cosas que luego pondre.

Eduardo, creo que cuando preguntas el porque de guardar en una
variable el header y el footer es por lo siguiente:
Codeigniter usa el MVC y por norma general, aunque puedas saltartela y
funcione igualmente, a las vistas solo se las llama desde
controladores. Tanto el header, body y footer que has creado en la
carpeta templates son vistas (estan en el directorio views), y por esa
razon no se deberia invocar a una vista desde otra.
Desde mi punto de vista, lo normal seria pasarlo en el $data desde el
controlador y luego ejecutarlo, ejemplo:
(controller)
$data['vistas'] = $this->load->view('view_header', $data_h, TRUE);
$data['header'] = $this->load->view('templates/header', $data_h,
TRUE);
$data['footer'] = $this->load->view('templates/footer', NULL, TRUE);
$this->load->view('templates/body', $data);
(view, en este caso sera el body, porque es al que vamos a llamar)
<?php echo $header; ?>
<?php echo $vistas; ?>
<?php echo $footer; ?>
Creo que va por ahi el asunto, si me equivoco, corregirme porque asi
sigo aprendiendo :D


Mi pregunta es la siguiente:
habeis puesto esto antes
$data_h['links'] = array(
$this->config->item('main_css'),
$this->config->item('tablas_css')
);
$data_h['js'] = array(
$this->config->item('jquery'),
$this->config->item('script'),
$this->config->item('jquery_ui')
);

Supongo que es porque teneis en el config varios css y js linkeados
con estos nombres y desde el controlador los llamais asi.
¿Me podeis explicar un poco ese proceso, no lo entiendo bien?

Gracias, un saludo.

Francisco Sánchez

unread,
Jan 29, 2011, 6:09:15 AM1/29/11
to CodeIgniter-spanish
Lo subo a ver si Alejandro o alguien me puede ayudar
Reply all
Reply to author
Forward
0 new messages