Foros del Web » Programando para Internet » PHP »

Problema y Duda MVC

Estas en el tema de Problema y Duda MVC en el foro de PHP en Foros del Web. Hola amigos me ha surgido un problema a querer aplicar el patron MVC en PHP Puro, la aplicacion al principio no la hice utilizando este ...
  #1 (permalink)  
Antiguo 19/09/2010, 12:11
 
Fecha de Ingreso: marzo-2009
Mensajes: 76
Antigüedad: 15 años, 1 mes
Puntos: 1
Problema y Duda MVC

Hola amigos me ha surgido un problema a querer aplicar el patron MVC en PHP Puro, la aplicacion al principio no la hice utilizando este patron y estoy aprendiendo el patron, asique cualquier sugerencia se las agradezco muchisimo.

Por lo que he leido les comento como es mi idea, tengo un archivito producto.phpque es quien maneja por asi decirlo todo el tema de los productos, es decir jugando con los GETs con $_GET[Opreacion] y GET[Accion] manejo todo las posibilidades con los productos (Busqueda, Alta, Modificacion, etc.) y depende lo que contengan los GETS se llama al metodo de la clase ControlarProducto que se necesite

Otra aclaracion importante es que trabajo con AJAX es decir tengo un index.php que dentro del body hay un div llamado <div id='carga'></div> que es donde cargo por ejemplo mi producto.php que es quien maneja las operaciones de los productos como les mensione antes.

Algo asi es como estoy diviendo mis archivos en el proyecto, solos les pongo los archivos que mensionare, tambien debo aclararles que hay clases para manejo de usuarios que son en realidad dichas clases las que trabajan con los producos pero para simplificar no las pongo en este mini ejemplo.

Proyeco
index.php
-->Clases
------>class.Producto.php
------>class.Proveedor.php
-->Views
------>formAltaProducto.php
------>resultadoDeBusqueraProducto.php
------->formBuscarProducto.php
------->productos.php
-->Controllers
-------->class.controladorProducto.php
-->Model
-------->class.ModelProveedor.php
-------->class.ModelProducto.php


class.ControladorProducto.php
Código PHP:
<?php
class ControladorProducto{
    function  
__construct() {
    }

    function 
getVistaAlta(){
       include(
"../Views/formAltaProducto.php");
    }

[
B]function getVistaBuscarOMostrarProductos(){ Duda si esta bien asiabajo explico. [/B
        include(
"../Views/formBuscarProdutos.php"); // inserta el formulario de busqueda un campo y un combo que selecciona la categoria.
        
[B]$usr recupera el usuario por asi decirlo.[/B]
         if(
$_GET['Accion']=='Buscar'){
               
$valor $_POST['textBuscar'];
               
$campo $_POST['comboBuscar'];
               
$resultado $usr->buscarProductos($valor$campo);
               include(
"../Views/tablaResultadoBuscarProductosCliente.php"); // trabaja y muestra lo que contien $resultado.
            
}else{
               
$resultado $usr->mostrarProductos();
               include(
"../Views/tablaResultadoBuscarProductosCliente.php"); // trabaja y muestra lo que contien $resultado.
            
}
         }
}
?>
DUDA: Les explico mi duda, depende el tipo de usuario se muestran mas o menos campos en la tabla, igual mi duda es la siguiente, esto trabaja de la siguiente manera en el archivo producto.php, y medianta la instancia del controladorProducto se llama al metodo
$controladorProducto->getVistaMostrarOBuscarProductos(), ese metodo como se ven en el codigo median la instancia de la clase usuario (Que puede ser cliente o vendedor o administrador) llama al metodo buscar o mostrar producto, la clase cliente por asi decirlo instancia el ModeloProducto y realiza la operacion, una vez teniendo el resultado se llama al resultadoDeBusqueraProducto.php que es quien la muestra en definitiva.
Simplificando las cosas algo asi seria el metodo que llama:
Código PHP:
function mostrarProductos(){ // supongamos que es un cliente
      
$modelProductos = new ModelProducto();
      return 
$modelProductos->listarProductos();

formAltaProducto.php dentro de la carpeta Views
obviamente mis formulario no es asi pero lo dejo simpel como para que se entienda mi problema.
Código PHP:
<form name="formProducto" id="formProducto" action="<?php echo $accion?>" method="post" enctype="multipart/form-data">
<?php
       $modelProveedor 
= new ModelProveedor();
       
$resultado $modelProveedor->listarProveedoresCombo();
?>
 <select name='proveedores' id='proveedores'>
    <?php
        
for ($i 0$i $resultado->cantidad(); $i++) {
           
$proveedor $resultado->retornar($i);
     
?>
  <option value=" <?php echo $proveedor->getIdProveedor(); ?> >
        <?php echo $proveedor->getProveedor();?>
  </option>
   <?php ?>

</select>

<input id="textProducto" type="text" onblur="validarTextProducto();" />
                    
                    
</form>
Bueno ahora les comento cual es mi problema, como les mensione antes cargo casi todo con AJAX entonces tengo un index.php que contiene un menu, en ese menu se selecciona por ejemelo Alta Producto y con ese click se carga mediante AJAX en el div <div id='carga'></div> se carga el archivito producto.php que mediante los GETs mensionados antes sabe que tiene que llamar al metodo de miControlarProducto->getVistaAlta();, ahi es donde se me complica como los require() de las clases estan en el archivo producto.php y este mediante el controlador llama a getVistaAlta() que realiza el include llamando a la vista formAltaProductos.php, el archivo formAltaProducto no encuentra las clases, porque esta en produco.php y no en la vista, y lo mismo me pasa con las funciones de validacion de javascripts ya que esas estan en el index.php.
Como puedo solucionar esto??? esta bien como el orden y lugar donde realizo las llamadas y operaciones??
por lo que lei se que debe ser algo asi, pero tengo mis dudas.

como ultimo comentario les dejo un mini esquema de como son las llamadas.

Se cargan asi:
index.php (Contiene los archivos de validacion JAVASCRIPTS)
LLAMA A:
productos.php
(que contiene los require de las clases necesarias para las operacion con los productos.)
mediante la instancia del controlador, con el include
LLAMA A:
formAltaProducto.php (Que necesita las clases cargadas en productos.php y ahi va el ERROR)

Bueno gente espero que se entienda y desde ya gracias por leer el post, cualquier duda que tenga se las aclaro, les agradezco cualquier respuesta o sugerencia.

Saludos.

NicoStone.





bueno espero haberme explicado bien y que se entienda

Última edición por nicostone; 20/09/2010 a las 13:25
  #2 (permalink)  
Antiguo 25/09/2010, 05:59
Avatar de repara2  
Fecha de Ingreso: septiembre-2010
Ubicación: München
Mensajes: 2.445
Antigüedad: 13 años, 7 meses
Puntos: 331
Respuesta: Problema y Duda MVC

Hola nicostone, respecto de MVC hay un peuqeño problema en tu código.
La class ControladorProducto hace inclusiones de archivos de vistas, esto va totalmente en contra de MVC. Tus classes sólo deben ser parte de la capa M. Esto es más bien un problema de concepto. Siguiendo con esto, si vas a hacer includes en una capa de base, te recomiendo utilices require_once() para evitar duplicados y sobrecarga. Creo que si lo pruebas ahora mismo con este código descubriras nuevos errores.
Respecto de el error parece que todo se resuelve en una llamada a include. A ver si puedes postear el error concreto del parser y el archivo que falla. Un saludo
  #3 (permalink)  
Antiguo 25/09/2010, 07:59
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años
Puntos: 101
Respuesta: Problema y Duda MVC

Cita:
La class ControladorProducto hace inclusiones de archivos de vistas, esto va totalmente en contra de MVC.
Si, el codigo se está enredando un poco. Pero por qué un controlador no puede hacer inclusión de una vista? Es decir, lo que falla es que está incluyendo muchas vistas.

Cosas como esta deberías evitarlas en una plantilla: $modelProveedor = new ModelProveedor();

EN fin, necesitarías una vista que maneje la inclusión de las demás vistas. Y que lo haga por medio de funciones. (este es mi parecer. La verdad es que hace poco que empecé con MVC).

Antes de seguir adelante, recomiendo leas un poco más sobre el patron. Se consiguen buenos tutoriales por ahí.
  #4 (permalink)  
Antiguo 27/09/2010, 18:23
 
Fecha de Ingreso: marzo-2009
Mensajes: 76
Antigüedad: 15 años, 1 mes
Puntos: 1
Respuesta: Problema y Duda MVC

Gracias por su respuestas muchahos la verda que si el codigo esta enredado un poco, pero como dije antes el codigo esta hecho y estamos aplicando el patron sobre algo que esta hecho, creo que no fue buena la idea de empezar a aplicar el patron sobre algo hecho, pero no entiendo lo que quisiste decir repada2 estoy de acuardo con mayid.

Gracias amigo y mañana les posteo un poco del codigo.
  #5 (permalink)  
Antiguo 28/09/2010, 01:13
Avatar de repara2  
Fecha de Ingreso: septiembre-2010
Ubicación: München
Mensajes: 2.445
Antigüedad: 13 años, 7 meses
Puntos: 331
Respuesta: Problema y Duda MVC

Sólo te comentaba un tema más bien teórico. En principio, si haces MVC, las capas de abajo no pueden incluir a las de arriba, porque entonces ya no se respeta el patrón en sentido estricto. Claro que lo puedes plantear como tú quieras, además, si partes desde un proyecto ya empezado todo esto se vuelve engorroso. Un saludo,
  #6 (permalink)  
Antiguo 28/09/2010, 06:55
 
Fecha de Ingreso: julio-2008
Mensajes: 208
Antigüedad: 15 años, 9 meses
Puntos: 5
Respuesta: Problema y Duda MVC

Cita:
Iniciado por repara2 Ver Mensaje
La class ControladorProducto hace inclusiones de archivos de vistas, esto va totalmente en contra de MVC.
mmmmmmmmm......

Cita:
Iniciado por repara2 Ver Mensaje
Sólo te comentaba un tema más bien teórico. En principio, si haces MVC, las capas de abajo no pueden incluir a las de arriba,
mmmmmmmmmmmmmmmmmmmmmmmm.......

El controlador OBVIO QUE TIENE QUE CONOCER A LA VISTA sino no sabe a quien pasarle los datos del modelo para que los muestre...Me parece que esta un poco errado tu concepto...
Es mas el Controlador conoce a la vista y al modelo sino de ninguna forma puede realizar un caso de uso. Es justamente eso un CONTROLADOR que quiere decir que controla a los demas (en este caso a la vista y al modelo), es decir sabe que vista asociar con que modelo.

Lo que nunca podes tener es un modelo que conozca la vista (esto viola totalmente MVC) pues tus datos (el modelo) no tienen que conocer a la presentacion (la vista).

Saludos.
  #7 (permalink)  
Antiguo 28/09/2010, 06:58
 
Fecha de Ingreso: julio-2008
Mensajes: 208
Antigüedad: 15 años, 9 meses
Puntos: 5
Respuesta: Problema y Duda MVC

Para aclarar mas el tema adjunto png con un esquema de las dependencias (quien conoce a quien) en MVC que encontre en la wiki...



Un diagrama sencillo que muestra la relación entre el modelo, la vista y el controlador. Nota: las líneas sólidas indican una asociación directa, y las punteadas una indirecta (por ejemplo, patrón Observer).

Saludos.
  #8 (permalink)  
Antiguo 28/09/2010, 08:00
 
Fecha de Ingreso: marzo-2009
Mensajes: 76
Antigüedad: 15 años, 1 mes
Puntos: 1
Respuesta: Problema y Duda MVC

Entonces por lo que he estado leyendo y por lo que dicen el concepto esta bien, si esta un poco enredado y como dice mayid me convendria tener una vista por cada "tarea o operacion" y llamar solo a una vista y no a porciones de la misma.

Pero con el tema del error que comento como lo soluciono, ya que sigo teniendo problemas porque la vista no encuentra la clase ModelProveedor, es decir la instancia de la vista no encuentra a ModelProveedor.

Desde ya muchas gracias por la ayuda, ya lo daba por muerto al tema y lo reflotaron.

Saludos.

NicoStone.

Etiquetas: mvc
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 18:53.