Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

PHP OO secciones comunes en MVC

Estas en el tema de secciones comunes en MVC en el foro de Frameworks y PHP orientado a objetos en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 20/03/2011, 13:56
Avatar de destor77  
Fecha de Ingreso: noviembre-2004
Ubicación: Gálvez, Santa Fe, Argentina
Mensajes: 2.654
Antigüedad: 20 años, 1 mes
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?.
  #2 (permalink)  
Antiguo 20/03/2011, 19:52
Avatar de carlos_belisario
Colaborador
 
Fecha de Ingreso: abril-2010
Ubicación: Venezuela Maracay Aragua
Mensajes: 3.156
Antigüedad: 14 años, 8 meses
Puntos: 461
Respuesta: secciones comunes en MVC

tengo una duda similar y voy a aprovechar un poco la tuya a ver si se resuelven ambas (oportunista no ) creo que tendriamos que establecer bien que es un helper, ya que segun entiendo en mi poca experiencia y muy equivoca en muchos aspectos con el MVC un helper son funciones para ayudarnos en las vistas de tal manera que podamos incluir archivos .CSS y .js en el layout y generar codigo html y cosas asi con simples llamados entonces, si mi concepto no esta errado (que puede un 99.9% que si) los helper que estas declarando en el controlador deberian de ser llamados en la vista, de tal manera que no rompas ningun esquema según yo, ahora en mi experiencia en cakePHP hay algo que se llama componentes que son clases que incluyes en los controladores para no repetir mil y una vez las mismas cosas, por ejemplo yo hice uno sencillo para el calculo de edad ya que lo utilizaba al mostrarla en el perfil del usuario, y en otras ocaciones que ahora no recuerdo bien y solo llamaba al componente que segun creo es lo que necesitas, bueno eso para intentar ayudarte un poco a ti, ahora mi duda quizas sea tonta y fuera de lugar pero no he encontrado documentacion, los helper en si son incluidos en la clase base de la vista o en que manera deben de estar incluidos estos?? porque yo al principio lo hice como indico el amigo en el controller donde necesitava alguno pero esto me dijo un amigo que es incorrecto que debria de llamarlos desde la vista, pero no me explico como (tan pana el no ), espero que mi respuesta te sea un poco util y que alguna respuesta pueda satisfacer la mia tambien, saludos
__________________
aprende d tus errores e incrementa tu conocimientos
it's not a bug, it's an undocumented feature By @David
php the right way
  #3 (permalink)  
Antiguo 21/03/2011, 07:32
Avatar de historiasdemaria  
Fecha de Ingreso: septiembre-2010
Ubicación: www
Mensajes: 433
Antigüedad: 14 años, 2 meses
Puntos: 54
Respuesta: secciones comunes en MVC

Uh, que complejo veo todo esto, bien, bueno, yo hablo desde mi experiencia con Symfony, veamos:
* Los helpers son funciones standard que llaman a los css o javascripts cuando los necesitamos.
* El include de un archivo tipo class (los include_once) se dejan a cargo del autoload, que seria posiblemente casi lo primero a escribir, solamente que en el caso de Symfony te lo da hecho.
* Creo que esto eliminaria la necesitad de un "helper" tal como lo ves tu.

si o si?
;)
  #4 (permalink)  
Antiguo 21/03/2011, 09:40
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Respuesta: secciones comunes en MVC

Recuerda el flujo de MVC, es Modelo Vista Controlador, si ves el diagrama:


La vista puede consultar directamente al modelo sin ningún problema, ya que esa es la idea, que el flujo sea así:
- El controlador analiza el input y decide que vista/modelo cargar
- El controlador puede informar al modelo de algún cambio que venga del input
- El controlador pasa el modelo a la vista
- La vista toma al modelo y lo despliega de la forma que el usuario decidió (output)

Eso es en un alto flujo, posteriormente lo que tu quieres hacer se conoce como Widgets lo cual es perfectamente válido, ya que estas respetando al modelo / vista, y lo mejor es que esos helpers esten directamente incrustados en la vista, así te evitas tener que repetir en cada controlador que helpers vas a utilizar, solamente en la vista, cargas el helper/Widget y lo invocas para mostrar el resultado que necesitas en tu template.

Saludos.
  #5 (permalink)  
Antiguo 21/03/2011, 09:59
Avatar de destor77  
Fecha de Ingreso: noviembre-2004
Ubicación: Gálvez, Santa Fe, Argentina
Mensajes: 2.654
Antigüedad: 20 años, 1 mes
Puntos: 43
Respuesta: secciones comunes en MVC

Cita:
Iniciado por GatorV Ver Mensaje

Eso es en un alto flujo, posteriormente lo que tu quieres hacer se conoce como Widgets lo cual es perfectamente válido, ya que estas respetando al modelo / vista, y lo mejor es que esos helpers esten directamente incrustados en la vista, así te evitas tener que repetir en cada controlador que helpers vas a utilizar, solamente en la vista, cargas el helper/Widget y lo invocas para mostrar el resultado que necesitas en tu template.

Saludos.
Bien, veo que voy por buen camino parece, ahora con respecto a lo que me indicas, en vez se llamar a los helpers/widget desde el controlador con:
Código PHP:
Ver original
  1. $this->helpers('array('categorias','links'));

lo invoque desde la vista.
Ahora la duda que me surge es, debería crear un méotodo privado que cargue todos los archivos que haya en la carpeta helpers, y que esten todos siempre disponible.

O me recomiendas usar el mismo método que tengo para los controladores, solo que integrandolo en mi clase vista y que desde las vistas html los invoque asi:
sidebar.html
Código HTML:
Ver original
  1. <div class="sidebar">
  2.     <h2>Categorias</h2>
  3.     <?php
  4.       $helpers->load(array('categorias','links'));
  5.        echo categorias();
  6.     ?>
  7.     <h2>Links</h2>
  8.      <?php echo links();?>
  9. </div>

porque supongo que no será lo mismo cargar 30 archivos que solo algunos.

Desde ya muchas gracias por la ayuda que me estan dando.
  #6 (permalink)  
Antiguo 21/03/2011, 10:18
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Respuesta: secciones comunes en MVC

Lo mejor es hacer algo como lo que te indica historiasdemaria, crear un autoloader que esa sea su tarea de cargar los widgets bajo demanda, o usar algún método que se encargue de eso, por ejemplo ve este post: http://www.forosdelweb.com/f68/duda-...to-mvc-893946/

Y uses algo así en tus vistas:
Código PHP:
Ver original
  1. <div class="sidebar">
  2.     <h2>Categorias</h2>
  3.     <?php echo $this->helpers('categorias'); ?>
  4.     <h2>Links</h2>
  5.      <?php echo links();?>
  6. </div>

El método helpers se encargará de cargar el helper indicado, y usando el método __toString() regresarlo como un string.

Saludos.

Etiquetas: mvc, secciones
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:21.