Ver Mensaje Individual
  #1 (permalink)  
Antiguo 20/03/2011, 13:56
Avatar de destor77
destor77
 
Fecha de Ingreso: noviembre-2004
Ubicación: Gálvez, Santa Fe, Argentina
Mensajes: 2.654
Antigüedad: 19 años, 5 meses
Puntos: 43
secciones comunes en MVC

Hola,
hoy vengo a molestarlos con una duda de teoria/funcionamiento para ver si me pueden guiar en la mejor forma de solucionarlo jeje.
Supongamos que estamos haciendo un blog el cual muestra todas la categorias del blog en la barra de la derecha, mas los links amigos, y en el footer muestra los ultimos 5 post cargados y los ultimos 5 comentarios.

Bien para mostrar esto en la vista sería simple, en el controlador index cargo los modelos de post, comentarios y categorias, llamo a los métodos que me devuelven esos valores y se los paso a la vista:
Código PHP:
Ver original
  1. class index extends controller{
  2.     $this->modelo(array('categoria','post','comentarios'));
  3.     $data['ultimosPost'] = $this->Post->ultimosPost();
  4.     $data['ultimosComentarios'] = $this->Comenterios->ultimosComentarios();
  5.     $data['categorias'] = $this->Categorias->listadoCategorias();
  6.  
  7.     $this->Vista->show('index.php,$data);
  8. }

Hasta ahí todo de maravilla, pero supongamos que estos mismos datos los tengo que mostrar en 10 controladores mas, debería copiar y pegar estas lineas en todos aquellos controladores cuyas vistas van a mostrar estos datos. Lo cual me parece poco "practico".

Lo que hice fue crear un método llamado "helpers" (tomando la idea de CI), el cual carga un archivo el cual contiene funciones las cuales se puede llamar desde cualquier vista en la cual su controlador se haya cargados por ejemplo:

Código PHP:
Ver original
  1. class index extends controller{
  2.     $this->modelo(array('categoria','post','comentarios'));
  3.     $this->helpers(array('categorias','footer','links'));
  4.    
  5.  
  6.     $this->Vista->show('index.php,$data);
  7. }
  8.  
  9. class post extends controller{
  10.    $this->modelo(array('categoria','post','comentarios'));
  11.    $this->helpers(array('categorias','footer','links'));
  12.    
  13.  
  14.    $this->Vista->show('index.php,$data);
  15. }

donde el helpers fooer es un archivo footer.php con esto:
Código PHP:
Ver original
  1. function post(){
  2.      include_once('modelos/PostModel.php');
  3.      include_once('modelos/ComentariosModel.php');
  4.     $post = new Post();
  5.      return $post->->ultimosPost();
  6. }
  7.  
  8. function comentarios(){
  9.      include_once('modelos/ComentariosModel.php');
  10.     $comentarios = new Comentario();
  11.      return $comentarios ->->ultimosComentarios();
  12. }

Esto actualmente me funciona de maravilla, pero ahora viene mi duda....
Al estar llamando a los modelos desde el helpers no estoy rompiendo el patron MVC?

sería correcto poder aplicar MV en los helpsers si no estoy rompiendo el patron MVC, es decir que los helpers pueda invocar modelos y tener sus propias vistas?, por ejemplo que tengan una estructura asi:
helpers
--------- comenterios
---------------- comentarios.php
---------------- template
--------------------- comentarios.html
--------------------- comentarios_post.html

que otra forma me sugieren para llamar a secciones comunes de las vistas las cuales requieren hacer uso de los modelos, sin tener que copiar y pegar código?.