martes, 26 de octubre de 2010

Kumbiaphp aprovechando el uso de Templates [ DRY Don`t repeat Yourself ]

Buenas a todos, si a alguien les gusta mis posts y ya decian cuando saca algo nuevo, he aqui algo, no es gran cosa pero, cuando uno esta haciendo una aplicacion grande donde a cada momento tienes que presentar tablas y combos, si puede ser de mucha ayuda.
Por ejemplo, tienes que mostrar en un combo la lista de Marcas, entonces tienes tu controlador Marca y tu accion combo siguiendo las convenciones de Kumbiaphp creas una vista combo.phtml, hasta ahi nada dificil pero que pasa si tienes 10 tablas y por cada una de ellas hay que crear lo mismo!!! O_o!!!
Obviamente diras : "Hey debe haber una manera de evitar todo esto!!!" y claro que la hay, para esto estan los Templates.


Vamos al ejemplo, tenemos que cargar 2 combos, uno perteneciente a la tabla Marca y otro de la tabla Area.
Entonces para eso tenemos nuestros controladores MarcaController.php y AreaController.php, y cada uno con sus respectivos modelos, en ambos modelos he implementado el metodo getAll().

Modelo : Marca.php
class Marca extends ActiveRecord{

 public function getAll(){
  return $this->find("order: 2 asc");
 }

}
Modelo : Area.php
class Area extends ActiveRecord{

 public function getAll(){
  return $this->find("order: 2 asc");
 }

}
Bueno ya tenemos nuestos modelos ahora veamos nuestros controladores

Marca_controller.php
class MarcaController extends ApplicationController {

 //carga el modelo Marca
 public $models=array('marca');

 public function combo(){
  $this->data=$this->Marca->getAll();
  $this->reference="area_id";  
  $this->text="nombre";
  $this->set_response('view');
  $this->render(null,"combo");//plantilla que queremos usar [combo]
 }
}
Modelo : Area.php
class AreaController extends ApplicationController {

 public $models=array('area');

 public function combo(){
  $this->data=$this->Area->getAll();
  $this->reference="area_id";  
  $this->text="nombre";    
  $this->set_response('view');
  $this->render(null,"combo");
 }
}

Voy a explicarles como funciona la accion combo() de los controladores, en realidad el truco es bastante simple, hemos creado una plantilla o template llamado combo.phtml el cual lo ubicaremos en /miapp/apps/views/templates, este es su codigo
<?php echo select_tag(array($reference, $data, 'option' => $text, 'include_blank'=> 'Seleccione')); ?>

creo que ya se habrán dado una idea de por donde va todo, en nuestra accion combo(), basicamente asignamos los valores a las variables de la plantilla mostrada arriba, luego en mi caso lo necesito para cargarlo mediante ajax por eso he puesto $this->set_response('view');, y en la siguiente linea lo que hago es decirle "no me cargues niguna vista y utiliza el template combo" $this->render(vista,template) en mi caso $this->render(null,"combo"). Si son como yo querrán ver como funciona o al menos un pantallazo, bueno, apliquemos lo hecho, imaginemos que tenemos un controlador llamado TestController y una accion dry este es el codigo de su vista donde cargaremos nuestros combos mediante el metodo load de jquery.
<div class="half-left-panel">
<h2>Carga de Areas</h2>
<?php echo link_to("area/combo","Cargar areas","class: config");?>
<div id="areas"></div>
</div>
<div class="half-right-panel">
<h2>Carga de Marcas</h2>
<?php echo link_to("marca/combo","Cargar marcas","class: config");?>
<div id="marcas"></div>
</div>
Javascript
<script type="text/javascript">
$(document).ready(function(){
 $("a").click(function(){  
  var _url=$(this).attr('href');    
  if($(this).attr('href').indexOf('area')!= -1){   
   $('#areas').html('<span><img src="<?php echo PUBLIC_PATH ?>/img/ui/ajax-loader.gif" /> Cargando ...</span>');
   $('#areas').load(_url);
  }else{
   $('#marcas').html('<span><img src="<?php echo PUBLIC_PATH ?>/img/ui/ajax-loader.gif" /> Cargando ...</span>');
   $('#marcas').load(_url);
  }
  return false;
 });
});
</script>


Como veran en nuestro codigo javascript lo que hemos puesto es que cuando clickemos en los botones cargue asincronamente las rutas /area/combo o marca/combo Eso se veria algo asi:

Este principio tambien se puede aplicar para Tablas en otro post que pronto terminaré les explicaré esto.

3 comentarios:

  1. Esta es una forma de manejar los templates muy útil

    para estos casos yo recomiendo usar partials, es mucho mas fácil llamar un partial con una linea de código y tener una "micro-vista" con su estructura semantica y los datos organizados si se quiere

    he visto buenos post en su blog
    felicidades

    ResponderEliminar
  2. Camilo, me alegro que te hayan gustado los posts, pronto estaré publicando más ^_^ sobre Kumbiaphp, mi interés es compartir y al mismo tiempo aprender.

    ResponderEliminar
  3. jeje
    al publicar lo que uno aprende asegura que no se le olviden las cosas ;)

    ResponderEliminar

 
Powered by Blogger