Foros del Web » Programando para Internet » PHP »

PHP OO Estructura MVC y POO

Estas en el tema de Estructura MVC y POO en el foro de PHP en Foros del Web. Hola, hace tiempo vengo leyendo este foro y me ha si de mucha ayuda pero ahora quería consultarles algo. Pues he revisado el modelo MVC ...
  #1 (permalink)  
Antiguo 04/10/2013, 07:24
Avatar de natalivg  
Fecha de Ingreso: octubre-2013
Ubicación: La taberna
Mensajes: 1
Antigüedad: 10 años, 6 meses
Puntos: 0
Estructura MVC y POO

Hola, hace tiempo vengo leyendo este foro y me ha si de mucha ayuda pero ahora quería consultarles algo.

Pues he revisado el modelo MVC y la POO y tengo esto actualmente:

Estructura de Carpetas
  • Config
  • controller
  • css
  • img
  • js
  • model
  • view

En config tengo esta clase para manejar la coneccion a la base de datos, use PDO por que me parecio mas sencillo ademas de solo tener que cambiar unas cuantas lineas para usar otro motor de BD.

Código PHP:
Ver original
  1. <?php
  2. class config
  3. {
  4. var $dsn = 'mysql:dbname=mitabla;host=localhost';
  5. var $user = 'root';
  6. var $password = '';
  7. var $dbms='PDO';
  8.     function connect()
  9.     {
  10.         switch($this->dbms)
  11.         {
  12.         case 'PDO':
  13.         try
  14.             {
  15.                     $connection= new PDO($this->dsn,$this->user,$this->password);
  16.        
  17.             }
  18.               catch (PDOException $e)
  19.               {
  20.                echo 'Connection Error: ' . $e->getMessage();
  21.                }
  22.         return $connection;
  23.         break;
  24.         }
  25.     }
  26. }
  27. ?>
En la carpeta model tengo las consultas a la base de datos.
Código PHP:
Ver original
  1. <?php
  2. require_once '../config/config.php';
  3. class modelo_cargos
  4. {
  5.    function modelo_modificar_cargos($idcargoc,$descripcionc)
  6.     {
  7.         $config= new config();
  8.         $conn=$config->connect();
  9.         $sql="UPDATE cargos SET descripcionc=? WHERE idcargoc=?";
  10.         $descripcioncl=$conn->quote($descripcionc);
  11.         $sth = $conn->prepare($sql);
  12.         $sth->bindParam(1, $descripcioncl,PDO::PARAM_STR, 20);
  13.         $sth->bindParam(2, $idcargoc,PDO::PARAM_INT);
  14.         $sth->execute();
  15.     }
  16.  
  17. }
  18. ?>
- Aquí mi primera duda, si yo quisiera hacer un paginador la lógica iría en el
modelo cierto? o me equivoco.
- Y segundo aqui uso quote para entrecomilalr cadenas desagradables y las
guarda asi en la bd y despues con una expresion regular quito las comillas algo
asi:

Ingreso Ca'de''na \"co'\"mpleja y lo guardo como 'Ca''de''''na "co''"mpleja' y aplicandole la expresion regular a la vista Cadena compleja, hacer esto esta bien o hay una forma mejor.

En controller tengo esto:
Código PHP:
Ver original
  1. <?php
  2. require_once '../model/modelo_cargos.php';
  3. class controlador_cargos
  4. {
  5. function controlador_modificar_cargos($idcargoc,$descripcionc)
  6.   {
  7.   $modelo_cargos= new modelo_cargos();
  8.   $data=$modelo_cargos->modelo_modificar_cargos($idcargoc,$descripcionc);
  9.   }
  10. }
  11. ?>
Aqui solo recibo la consulta y tengo entendido que aqui no deberia haber nada de html correcto?.
Y la view lo tengo asi:
Código PHP:
Ver original
  1. <!DOCTYPE html>
  2. <html lang="es">
  3. <head>
  4. <meta charset="ISO-8859-1">
  5. <meta name="Administración Cargos" content="Cargos">
  6. <meta name="keywords" content="Cargos Administarción">
  7. <link rel="stylesheet" href="../css/estilos.css">
  8. <link href="../css/bootstrap.css" rel="stylesheet">
  9. <link href="../css/bootstrap-responsive.css" rel="stylesheet">
  10. <link href="../css/docs.css" rel="stylesheet">
  11. <link href="../js/google-code-prettify/prettify.css" rel="stylesheet">
  12. <script src="../js/mensajes.js"></script>
  13. <script src="../js/limites.js"></script>
  14. <title>Administración Cargos</title>
  15. </head>
  16. <body id="body">
  17. <div id="centrar">
  18.     <header>
  19.      <h1 id="header" >Administración de Cargos</h1>  
  20.     </header>
  21.     <div class="container" id="col">
  22. <?php
  23. require_once '../controller/controlador_cargos.php';
  24. $controlador_cargos= new controlador_cargos();
  25. $idcargoc = isset($_POST["idcargoc"]) ?$_POST["idcargoc"] : NULL;
  26. $descripcionc = str_replace("'","",isset($_POST["descripcionc"]) ?$_POST["descripcionc"] : NULL);
  27. $subm = isset($_POST["subm"]) ?$_POST["subm"] : NULL;
  28. $buscar = isset($_POST["buscar"]) ?$_POST["buscar"] : NULL;
  29. ?>
  30. <form action="vista_cargos.php" method="post" enctype="multipart/form-data" class="form-horizontal">
  31. <div class="control-group">
  32.     <div class="controls">
  33.       <input type="hidden"  value="<?php echo $idcargoc; ?>" name="idcargoc">
  34.     </div>
  35.   </div>
  36.   <div class="control-group">
  37.     <label class="control-label" id="bold">Cargo</label>
  38.     <div class="controls">
  39.       <input type="text" placeholder="Ingrese el Cargo" class="span2" value="<?php echo $descripcionc; ?>" name="descripcionc"  onKeyDown="contador(this.form.descripcionc,this.form.remLen,20);" onKeyUp="contador(this.form.descripcionc,this.form.remLen,20);">
  40.     </div>
  41.   </div>
  42.     <div class="control-group">
  43.     <div class="controls">
  44.        <input class="span2" placeholder="" name="buscar" type="text" value="<?php  echo $buscar ?>"/>
  45.        <input type="submit" name="subm" value="Buscar" class="btn btn-btn"/>
  46.        <input type="submit" name="subm" value="Ultimos Registros" class="btn btn-info" />
  47.            <div class="btn-group">
  48.               <a class="btn btn-primary" href="#"><i class="icon-user icon-white"></i></a>
  49.               <a class="btn btn-primary dropdown-toggle" data-toggle="dropdown" href="#"><span class="caret"></span></a>
  50.               <ul class="dropdown-menu">
  51.                 <li><input type="submit" name="subm" value="Guardar" class="btn-block btn-success" onClick="return ConfirmSave();"/></li>
  52.                 <li><input type="submit" name="subm" value="Modificar" class="btn-block btn-warning"  onClick="return ConfirmModify();"/></li>            
  53.               </ul>
  54.             </div>
  55.     </div>
  56.   </div>    
  57.     </form>
  58. <?php switch($subm):?>
  59. <?php case 'Modificar':?>
  60. <?php if(preg_match("/^[0-9a-zA-ZñÑáéíóú]+$/",$descripcionc)):?>
  61. <?php $controlador_cargos->controlador_modificar_cargos($idcargoc,$descripcionc);?>
  62. <script>
  63. document.location = ('vista_cargos.php');
  64. Modify();
  65. </script>
  66. <?php else:?>
  67. <div class="alert alert-error" id="error">
  68. <?php echo "Solo se permite texto,revise los datos ingresados.";?>
  69. </div>
  70. <?php endif;?>
  71. <?php break;?>
  72. <?php endswitch;?>
  73. </div>
  74. </div>
  75.     <script type="text/javascript" src="../js/widgets.js"></script>
  76.     <script src="../js/jquery.js"></script>
  77.     <script src="../js/bootstrap-transition.js"></script>
  78.     <script src="../js/bootstrap-alert.js"></script>
  79.     <script src="../js/bootstrap-modal.js"></script>
  80.     <script src="../js/bootstrap-dropdown.js"></script>
  81.     <script src="../js/bootstrap-scrollspy.js"></script>
  82.     <script src="../js/bootstrap-tab.js"></script>
  83.     <script src="../js/bootstrap-tooltip.js"></script>
  84.     <script src="../js/bootstrap-popover.js"></script>
  85.     <script src="../js/bootstrap-button.js"></script>
  86.     <script src="../js/bootstrap-collapse.js"></script>
  87.     <script src="../js/bootstrap-carousel.js"></script>
  88.     <script src="../js/bootstrap-typeahead.js"></script>
  89.     <script src="../js/bootstrap-affix.js"></script>
  90.     <script src="../js/holder/holder.js"></script>
  91.     <script src="../js/google-code-prettify/prettify.js"></script>
  92.     <script src="../js/application.js"></script>
  93. </body>
  94. </html>
Aqui uso la sintaxis alternativa porque a mi parecer se separa mejor el codigo PHP del HTML.

Eso es lo que he hecho hasta ahora, quisiera saber si esta bien o si tengo que mejorar algo o de plano lo estoy haciendo mal .

Gracias de antemano.
  #2 (permalink)  
Antiguo 05/10/2013, 14:53
 
Fecha de Ingreso: agosto-2013
Mensajes: 150
Antigüedad: 10 años, 7 meses
Puntos: 29
Respuesta: Estructura MVC y POO

No te hagas mucho problema, para mí tu código va bien. Una sugerencia. Colocar en config.php solamente elementos de configuración del sitio y retirar la conexión a la BBDD. Ej:
Código PHP:
Ver original
  1. // Rutas
  2. require_once('Clases/clases.php');
  3. // BBDD
  4. define("DSN",'mysql:dbname=mitabla;host=localhost');
  5. define(USER, 'root');
  6. define(PASS, '');
  7. // Mensajes del sitio
  8. define("SQL100", "....");

Yo no utilizo un mvc estricto, pero tiene algo:
Código txt:
Ver original
  1. Front/   <-- sería la Vista
  2.    index.php
  3.    archivos.php
  4.    ...
  5. Back/    <-- sería el Controlador
  6.    procIndex.php
  7.    procArchivos.php
  8.    ...
  9. Base/
  10.    config.php
  11.    plantilla.php
  12.    Clases/  <-- podría ser el Modelo
  13.       clBD.php
  14.       clArchivos.php
  15.       clPaginacion.php
  16.       ...
  17.    Css/
  18.       estilos.css
  19.       paginador.css
  20.    Funciones/
  21.       funArchivos.php
  22.       funPaginacion.php
  23.       ...
  24.    Js/
  25.       sitio.js
  26.       jquery.js

En lo que se refiere al paginador parece que el mío anda por todos lados:
Código txt:
Ver original
  1. archivos.php
  2.    <formulario>
  3. procArchivos.php
  4.    recibe los datos del formulario
  5.    instancia la clase clArchivos
  6.    $sql = "..."
  7.    // $numPag:pag actual, $limit:cant result x pag
  8.    clPaginacion::Paginar($sql, $numPag, $limit);
  9.  
  10. clPaginacion.php
  11.    public static $result;
  12.    public static function Paginar($sql,$numPag,$limit) {
  13.       // nº de registro de inicio
  14.       $inicio = ($numPag-1) * $limit;
  15.       // 1ª consulta
  16.       $oStm = clDB::accederBBDD($sql,'ROWS');
  17.       // cuenta los registros
  18.       self::$iCantReg = $iRst = $oStm;
  19.       // carga una variable con la cant paginas
  20.       self::$fCantPags = ceil($iRst/$limit);
  21.       // sql 2ª consulta, agrega limites
  22.       $sql.=" LIMIT ".$inicio.",".$limit."; ";
  23.       // 2ª consulta y retorno de resultados
  24.       return clPaginacion::$result = clDBpdo::accederMySQL($sSQL,'fetch_all_assoc');
  25.  
  26. procArchivos.php
  27.    // los datos paginados para procesar
  28.    $arrayDatos = clPaginacion::$rResult;
  29.    // función que pinta el índice del paginador
  30.    paginador(parametros);
  31.  
  32. archivos.php
  33.    [resultados]
  34.    <paginador>
  #3 (permalink)  
Antiguo 05/10/2013, 20:32
Avatar de carlos_belisario
Colaborador
 
Fecha de Ingreso: abril-2010
Ubicación: Venezuela Maracay Aragua
Mensajes: 3.156
Antigüedad: 14 años
Puntos: 461
Respuesta: Estructura MVC y POO

Buenas, bienvenido al foro, ahora, has entendido el concepto?? aunque no hay forma correcta o incorrecta porque es solo una forma de organizar código no esta mal darte un poco de concejos

1) Modelo = lógica de negocio (no es solo la conexión y consultas a la base de datos)
2) Vista = lo que ve el usuario, no debería de tener nada de lógica
3) controlador = controla el flujo, carga el modelo que realiza la lógica y renderiza la vista

ahora viendo tu código
Cita:
Iniciado por natalivg Ver Mensaje
Código PHP:
Ver original
  1. <?php
  2. class config
  3. {
  4. var $dsn = 'mysql:dbname=mitabla;host=localhost';
  5. var $user = 'root';
  6. var $password = '';
  7. var $dbms='PDO';
  8.     function connect()
  9.     {
  10.         switch($this->dbms)
  11.         {
  12.         case 'PDO':
  13.         try
  14.             {
  15.                     $connection= new PDO($this->dsn,$this->user,$this->password);
  16.        
  17.             }
  18.               catch (PDOException $e)
  19.               {
  20.                echo 'Connection Error: ' . $e->getMessage();
  21.                }
  22.         return $connection;
  23.         break;
  24.         }
  25.     }
  26. }
  27. ?>
config debería de referirse a la configuración de la app, la conexión debería de ser otra historia, (interesante siempre el que conozcas un ORM). Otra cosa
var esta OBSOLETO es de php 4, en php5 se usa la visibilidad
otra cosa
Cita:
Iniciado por natalivg Ver Mensaje
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="ISO-8859-1">
<meta name="Administración Cargos" content="Cargos">
<meta name="keywords" content="Cargos Administarción">
<link rel="stylesheet" href="../css/estilos.css">
<link href="../css/bootstrap.css" rel="stylesheet">
<link href="../css/bootstrap-responsive.css" rel="stylesheet">
<link href="../css/docs.css" rel="stylesheet">
<link href="../js/google-code-prettify/prettify.css" rel="stylesheet">
<script src="../js/mensajes.js"></script>
<script src="../js/limites.js"></script>
<title>Administración Cargos</title>
</head>
<body id="body">
<div id="centrar">
<header>
<h1 id="header" >Administración de Cargos</h1>
</header>
<div class="container" id="col">
<?php
require_once '../controller/controlador_cargos.php';
$controlador_cargos= new controlador_cargos();
$idcargoc = isset($_POST["idcargoc"]) ?$_POST["idcargoc"] : NULL;
$descripcionc = str_replace("'","",isset($_POST["descripcionc"]) ?$_POST["descripcionc"] : NULL);
$subm = isset($_POST["subm"]) ?$_POST["subm"] : NULL;
$buscar = isset($_POST["buscar"]) ?$_POST["buscar"] : NULL;
?>
<form action="vista_cargos.php" method="post" enctype="multipart/form-data" class="form-horizontal">
<div class="control-group">
<div class="controls">
<input type="hidden" value="<?php echo $idcargoc; ?>" name="idcargoc">
</div>
</div>
<div class="control-group">
<label class="control-label" id="bold">Cargo</label>
<div class="controls">
<input type="text" placeholder="Ingrese el Cargo" class="span2" value="<?php echo $descripcionc; ?>" name="descripcionc" onKeyDown="contador(this.form.descripcionc,this.fo rm.remLen,20);" onKeyUp="contador(this.form.descripcionc,this.form .remLen,20);">
</div>
</div>
<div class="control-group">
<div class="controls">
<input class="span2" placeholder="" name="buscar" type="text" value="<?php echo $buscar ?>"/>
<input type="submit" name="subm" value="Buscar" class="btn btn-btn"/>
<input type="submit" name="subm" value="Ultimos Registros" class="btn btn-info" />
<div class="btn-group">
<a class="btn btn-primary" href="#"><i class="icon-user icon-white"></i></a>
<a class="btn btn-primary dropdown-toggle" data-toggle="dropdown" href="#"><span class="caret"></span></a>
<ul class="dropdown-menu">
<li><input type="submit" name="subm" value="Guardar" class="btn-block btn-success" onClick="return ConfirmSave();"/></li>
<li><input type="submit" name="subm" value="Modificar" class="btn-block btn-warning" onClick="return ConfirmModify();"/></li>
</ul>
</div>
</div>
</div>
</form>
<?php switch($subm):?>
<?php case 'Modificar':?>
<?php if(preg_match("/^[0-9a-zA-ZñÑáéíóú]+$/",$descripcionc)):?>
<?php $controlador_cargos->controlador_modificar_cargos($idcargoc,$descripci onc);?>
<script>
document.location = ('vista_cargos.php');
Modify();
</script>
<?php else:?>
<div class="alert alert-error" id="error">
<?php echo "Solo se permite texto,revise los datos ingresados.";?>
</div>
<?php endif;?>
<?php break;?>
<?php endswitch;?>
</div>
</div>
<script type="text/javascript" src="../js/widgets.js"></script>
<script src="../js/jquery.js"></script>
<script src="../js/bootstrap-transition.js"></script>
<script src="../js/bootstrap-alert.js"></script>
<script src="../js/bootstrap-modal.js"></script>
<script src="../js/bootstrap-dropdown.js"></script>
<script src="../js/bootstrap-scrollspy.js"></script>
<script src="../js/bootstrap-tab.js"></script>
<script src="../js/bootstrap-tooltip.js"></script>
<script src="../js/bootstrap-popover.js"></script>
<script src="../js/bootstrap-button.js"></script>
<script src="../js/bootstrap-collapse.js"></script>
<script src="../js/bootstrap-carousel.js"></script>
<script src="../js/bootstrap-typeahead.js"></script>
<script src="../js/bootstrap-affix.js"></script>
<script src="../js/holder/holder.js"></script>
<script src="../js/google-code-prettify/prettify.js"></script>
<script src="../js/application.js"></script>
</body>
</html>
el controlador carga la vista no la vista al controlador, por lo tanto hacer un require en una vista a un controlador es incorrecto

Cita:
Iniciado por natalivg Ver Mensaje
- Aquí mi primera duda, si yo quisiera hacer un paginador la lógica iría en el
modelo cierto? o me equivoco.
normalmente uso librerías de terceros de paginación, te doy un ejemplo en Yii lo que se hace es solicitar el provider de datos al modelo y pasarlo a la vista que llama al widget bien sea un grid o un list
Cita:
Iniciado por natalivg Ver Mensaje
- Y segundo aqui uso quote para entrecomilalr cadenas desagradables y las
guarda asi en la bd y despues con una expresion regular quito las comillas algo
no es necesario andar haciendo cosas con regex ni nada por el estilo, hay metodos que te brinda PDO, como consultas preparadas que te realizan el escape necesario a los caracteres especiales y te evitan SQLInjection.

ya creo que es toda mi observación, 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

Etiquetas: estructura, html, mvc, mysql, poo, registro, sql, tabla
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 20:30.