CodeIgniter con Smarty

Categoría: Desarrollo Web | January 9, 2009
codeigniter smarty

Si alguna vez probaste a Smarty en PHP probablemente no quieras dejarlo. Existen maneras para utilizarlo en los diferentes frameworks como CodeIgniter, Zend Framework, etc.

Para lograr utilizar CodeIgniter y Smarty primero nos bajamos las últimas versiones, Smarty 2.6.22 y CodeIgniter 1.7.0

La librería de Smarty debe ser descomprimida y solamente utilizaremos la carpeta /lib de lo que descomprimimos y la colocaremos dentro de la carpeta application/libraries de Code Igniter con el nombre de Smarty.

Después debemos crear el archivo “Mysmarty.php” en la carpeta application/libraries y colocar el siguiente código:

<?php
if (! defined ( 'BASEPATH' ))
 exit ( 'No direct script access allowed' );
require "Smarty/Smarty.class.php";
/**
 * @file system/application/libraries/Mysmarty.php
 */
class Mysmarty extends Smarty {
 function Mysmarty() {
  $this->Smarty ();
  $config = & get_config ();
  // Rutas absolutas para evitar errores "template not found"
  $this->template_dir = (! empty ( $config ['smarty_template_dir'] ) ? $config ['smarty_template_dir'] : BASEPATH . 'application/views/');
  $this->compile_dir = (! empty ( $config ['smarty_compile_dir'] ) ? $config ['smarty_compile_dir'] : BASEPATH . 'cache/');
  $this->plugins_dir [] = (! empty ( $config ['smarty_plugin_dir'] ) ? $config ['smarty_plugin_dir'] : BASEPATH . 'plugins/smarty_plugins/');
  if (function_exists ( 'site_url' )) {
   // Debe tener cargado a URL helper
   $this->assign ( "site_url", site_url () ); // para tener la ruta completa facilmente
  }
 }

 /**
  * @param $resource_name string
  * @param $params array holds params that will be passed to the template
  * @desc loads the template
  */
 function view($resource_name, $params = array()) {
  if (strpos ( $resource_name, '.' ) === false) {
   $resource_name .= '.tpl';
  }
  if (is_array ( $params ) && count ( $params )) {
   foreach ( $params as $key => $value ) {
    $this->assign ( $key, $value );
   }
  }
  // ver si existe
  if (! is_file ( $this->template_dir . $resource_name )) {
   show_error ( "template: [$resource_name] cannot be found." );
  }
  return parent::display ( $resource_name );
 }
}

Después debemos hacer que esta CodeIgniter cargue automaticamente a la librería. Modificamos el archivo application/config/autoload.php

$autoload['libraries'] = array('mysmarty');

Para probarlo crearemos el archivo mensaje.tpl en application/views

<h1>Probando</h1>
<table>
 {foreach from=$array key=miKey item=it}
 <tr>
  <td>{$miKey}</td>
  <td>{$it}</td>
 </tr>
 {/foreach}
</table>

Una vez ya cargado tenemos 2 formas para utilizarlo en los controladores de Code Igniter:
1. Algo parecido a la utilización en los templates de CodeIgniter:

function forma1()
{
 $array = array('1'=>'a','2'=>'b');
 $this->mysmarty->view('mensaje',array('array'=>$array));
}

2. Y la forma clásica(con assign y display):

function forma2()
{
 $array = array('1'=>'a','2'=>'b');
 $this->mysmarty->assign('array',$array);
 $this->mysmarty->display('mensaje.tpl');
}

Comentarios

  1. Rene, muchas gracias por la explicacion, muy clara.

    Funciona perfectamente

    Saludos

    Roque

    Roque — January 22, 2009 @ 3:54 pm

  2. Gracias por el tip, muy clarita la explicación.
    Saludos.

    SIlvana — January 31, 2009 @ 2:23 pm

  3. Creo que con esto me has salvado la vida..

    Muchas gracias!!

    Miguel Angel Ivars Mas — July 22, 2009 @ 1:12 pm

  4. Muy bueno, se agradece!

    El Juan — January 15, 2013 @ 3:43 pm

Deja un comentario