2009-06-22 127 views
27

Soy bastante nuevo en MVC y recientemente encontré CodeIgniter. Todavía estoy aprendiendo todos los días, pero un problema es su motor de plantillas. ¿Cuál es la mejor manera de crear plantillas en CodeIgniter?¿Cómo lidiar con las plantillas de Codeigniter?

CakePHP viene con su propia biblioteca de plantillas, ¿hay alguna característica similar en CodeIgniter?

+0

Hola @ Martin, veo este es un post bastante viejo y usted todavía no marcó ninguna respuesta en cuanto correcto. ¿Encontraste una solución a tu problema? –

Respuesta

0

Una plantilla de Codeigniter generalmente es solo un archivo PHP. Puede usar toda la sintaxis habitual de PHP para generar variables, hacer bucles y llamar a otros códigos PHP.

controlador de presentación:

<?php 
class Blog extends Controller { 

    function index() 
    { 
     $data['title'] = "My Real Title"; 
     $data['heading'] = "My Real Heading"; 

     $this->load->view('blogview', $data); 
    } 
} 
?> 

muestra:

<html> 
<head> 
<title><?php echo $title;?></title> 
</head> 
<body> 
    <h1><?php echo $heading;?></h1> 
</body> 
</html> 

Leer más en la documentación aquí: CodeIgniter User Guide: Views

+0

Bueno, sí.Pero quisiera saber si hay alguna forma de acelerar este proceso y hacerlo más organizado, así que no tendré que escribir

, , estilo, etc. ... Quiero tenerlo en una sola carpeta o biblioteca. Piense en esto como WordPress, puede cambiar la plantilla sin editar cada vista. – Martin

25

A diferencia de otros marcos de CodeIgniter no tiene un sistema de plantilla global. Cada controlador controla su propia salida independientemente del sistema y las vistas son FIFO a menos que se especifique lo contrario.

Por ejemplo si tenemos una cabecera mundial:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd" > 
<html> 
    <head> 
     <title><?=$title?></title> 
     <!-- Javascript --> 
     <?=$javascript ?> 
     <!-- Stylesheets --> 
     <?=$css ?> 
    </head> 
    <body> 
     <div id="header"> 
      <!-- Logos, menus, etc... --> 
     </div> 
     <div id="content"> 

y un pie de página mundial:

 </div> 
     <div id="footer"> 
      <!-- Copyright, sitemap, links, etc... --> 
     </div> 
    </body> 
</html> 

entonces nuestro controlador tendría que parecerse a

<?php 
class Welcome extends Controller { 

    function index() { 
     $data['title'] = 'My title'; 
     // Javascript, CSS, etc... 

     $this->load->view('header', $data); 

     $data = array(); 
     // Content view data 
     $this->load->view('my_content_view', $data); 

     $data = array(); 
     // Copyright, sitemap, links, etc... 
     $this->load->view('footer', $data); 
    } 
} 

Hay otra combinaciones, pero existen mejores soluciones a través de bibliotecas de usuario como:

Ver comentarios a continuación

+0

Llegué aquí desde google, los enlaces anteriores ya no funcionan y me redirigen al repositorio github para CodeIgniter, pero puedes ir a las páginas wiki allí y buscar 'plantilla' para encontrar una docena o más de implementaciones diferentes para este problema. – sg3s

+0

También hay una serie de geniales bibliotecas de plantillas que he usado que no son parte de CodeIgniter, pero que se pueden integrar fácilmente, Moustache (https://github.com/bobthecow/mustache.php) y Twig (http: // twig.sensiolabs.org/) –

+0

¿Por qué esta respuesta tiene tantos votos hacia arriba? –

4

uso CodeIgniter con Smarty y es genial (si te gusta Smarty, que lo hace).

Digamos que tiene un controlador artículo, que podría hacer somehting como este en que:

class Article extends Controller { 
    function show_all() { 
    $articles = $this->article_model->get_all(); 
    $this->smarty->assign('entities', $articles); 
    $this->smarty->view('list'); 
    } 
} 

Y luego en su plantilla:

{include file="header.tpl"} 
    <ul> 
    {foreach from=$entities item=entity} 
    <li>{$entity.title}</li> 
    {/foreach} 
    </ul> 
{include file="footer.tpl"} 

La parte buena de esto es que el controlador doesn Realmente no necesita saber sobre encabezados y pies de página. Simplemente sabe que un grupo de artículos debe mostrarse como una lista. A partir de ahí, son solo las plantillas las responsables de definir cómo se muestra una lista de elementos, en este caso, en un ul entre un encabezado y un pie de página.

Otra cosa interesante que puede hacer es usar esta plantilla de lista para cosas que no son artículos. Podría tener una lista de usuarios o páginas o lo que sea. En algunos casos, reutilizar una plantilla como esta puede ser útil. No siempre, pero a veces.

Configurar CodeIgniter para smarty es bastante sencillo. Se trata de copiar los archivos Smarty en la carpeta de la biblioteca y crear un contenedor simple para ella.Puede encontrar instrucciones aquí:

http://devcha.blogspot.com/2007/12/smarty-as-template-engine-in-code.html

Una vez que se crea que es genial.

1

Estoy predispuesto hacia esta biblioteca de plantillas hecha por Carmelo Capinpin porque es muy fácil de usar: link text. Simplemente copie el archivo en su biblioteca y listo. Las instrucciones sobre cómo usarlo están en el enlace que proporcioné.

5

Esta biblioteca, fácil de usar y personalizar, hace exactamente lo que se espera:

  • evitar la duplicación HTML (encabezado, pie ..)
  • hay necesidad de aprender un nuevo idioma (!)

Most Simple Template Library for CodeIgniter

+1

Lo que más me gusta de esto es que en lugar de cambiar a una sintaxis diferente para algo como Smarty, conserva lo que más me gusta de las plantillas básicas de CI: etiquetas cortas PHP. – russellmania

12

hacer una biblioteca que incluye todos sus puntos de vista y enviar datos que se tiene que enviar a la vista del contenido. ¡Esto es todo!

<?php 
class Display_lib 
{ 

    public function user_page($data,$name) 
    { 
     $CI =& get_instance(); 

     $CI->load->view('preheader_view',$data); 
     $CI->load->view('header_view'); 
     $CI->load->view('top_navigation_view'); 
     $CI->load->view($name.'_view',$data); 
     $CI->load->view('leftblock_view',$data); 
     $CI->load->view('rightblock_view',$data); 
     $CI->load->view('footer_view');   
    } 
} 
14

He intentado varias formas de hacer plantillas codeigniter y la forma en que me quedo es la más rápida y simple, es la siguiente.

En controlador:

//Charge the view inside array 
    $data['body'] = $this->load->view('pages/contact', '', true); 


    //charge the view "contact" in the other view template 
    $this->load->view('template', $data); 

En vista template.php:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es"> 
<head> 
    <title>Template codeigniter</title> 
</head> 
<body> 
    <div> 
     <?=$body?> 
    </div> 
    <div class="clear"></div> 
    <div>Footer</div> 
    </div> 
</body> 
</html> 

$body es el contacto vista.

+0

Cuando uso este método, obtengo muchas variables no definidas, ya que no parecen pasar del controlador a la variable $ body. – russellmania

1

There is a library which allows you to use templates in CodeIgniter en un estilo nativo. Para cargar una plantilla/tema acaba de hacer:

$this->load->theme(‘theme_name’); 

Para cargar CSS y JavaScript archivos de las vistas que se pueden hacer:

$this->load->css(‘path/file.css’); 
$this->load->js(‘path/file.js’); 

Se puede controlar opcionalmente la forma en caché de los navegadores CSS & archivos JS.

2

Tengo dos plantillas principales; uno para el sitio y otro para nuestro panel de administración. Aquí está mi configuración para nuestro sitio principal (principalmente estática) ... Decidí un controlador llamado site Llama al archivo de plantilla y a cada página y obtiene su archivo de vista.

¿Por qué nadie menciona el uso del motor de plantillas? ¿Son -justo- vistas mejores/más rápidas?

  • En config/template.php definí la (s) plantilla (s).Nota * site_template * está en la carpeta views:

    $template['site']['template'] = 'site_template'; 
    $template['site']['regions'] = array('title','section','col2','content',); 
    $template['site']['parser'] = 'parser'; 
    $template['site']['parser_method'] = 'parse'; 
    $template['site']['parse_template'] = FALSE; 
    
  • En config/routers.php que configurar reglas para manejar las solicitudes de controlador site que son segmentos individuales URLs en su mayoría pero sí haber una sección que está estructurado como tal; /quienes-somos y luego para las personas seleccionadas /quienes-somos/Robert-Wayne y por lo tanto:

    $route['what-we-do'] = 'site/what_we_do'; 
    $route['who-we-are'] = 'site/who_we_are'; 
    $route['who-we-are/(:any)'] = "site/who_we_are/$1" 
    
  • Y controllers/site.php De nuevo con una función para cada página/sección:

    class Site extends CI_Controller 
    { 
    function __construct() { 
        parent::__construct(); 
        $this->template->set_template('site'); // ask for the site template 
        $this->load->library('mobile'); 
    } 
    public function index() 
    { 
    $data = array('section' => 'home'); 
    $this->template->write_view('col2', 'site/menu.php', $data); 
    $this->template->write('title', "COOL PAGE TITLE", TRUE); 
    $this->template->write('section', $data['section'], TRUE); 
    $this->template->write_view('content', 'site/welcome', $data); 
    $this->template->render(); 
    } 
    public function who_we_are() 
    { 
    // this bit readies the second segment. 
    $slug = str_replace('-', '_', $this->uri->segment(2, 0)); 
    if($slug) // IF there is a second segment we load the person. 
    { 
    $data['bio'] = $this->load->view('site/people/'.$slug, '', true) 
    } else { 
    // where it loads the general view who_we_are 
    } 
    // and so on for each page... 
    

y tan fino notificación punto el router nos permite dejar de lado `/ site /' en la url, http: // el site.com/who-we- son

thoughts? ¿nadie? Bueller?

+0

Me sorprende que esto no haya sido votado más. –

0

Permítanme proponer una manera más fácil de hacerlo. Considere my answer to a similar question.

Pros:

  1. Su archivo de plantilla puede ser un archivo HTML. No tiene que dividir el encabezado y el pie de página.
  2. Cualquier archivo de vista se puede convertir en una plantilla con un mínimo esfuerzo.
  3. Los datos para la vista específica se pueden generar en la plantilla.

Contras: 1. Puede que tenga que añadir un template (o layout -si desea hacerlo de la manera rieles) directorio bajo puntos de vista con el fin de estructurar su código correctamente. Esto se sigue de Pros [2]. 2. Los datos para la vista específica del controlador deben pasar primero a la plantilla.

Cuestiones relacionadas