EL patrón MVC (Model, View, Controller) o Modelo, Vista Controlador, es un tipo de diseño que separa en capas bien definidas el desarrollo de una aplicación, esas partes son tres, el Modelo encargado de la logica del negocio y la persistencia de los datos, las Vistas son las responsables de mostrar al usuario el resultado que obtienen del modelo a traves del controlador, el Controlador encargado es el encargado de gestionar las peticiones del usuario, procesarlas invocando al modelo y mostrarlas al usuario a traves de las vistas.
Ahora desarrollaremos un ejemplo de este patron MVC en PHP, una aplicación sencilla con una base de datos y una consulta de busqueda. la estructura de la pagina sera la común, un encabezado, un menu, y contenido sin pie de pagina ya que no es relevante para el ejemplo.
¿Que necesitamos?
1. IDE para PHP (Dreamweaver, PhpDesigner, netbeans, etc) o un editor de texto como notepad
2. Leer teoria sobre MVC en este tuto todo sera práctica
3. Una Base de Datos MySQL
4. Un Servidor Web (AppServer, XAMP, etc)
Proyecto.
1. Para este tutorial utilizaremos PhpDesigner, no es obligatorio, se puede utilizarse cualquier otro IDE citado arriba. Lo primero que haremos sera crear la estructura del proyecto MVC, para esto, creamos un nuevo proyecto en el IDE que estemos utilizando, el proyecto se llamara «jmvc«, despues iremos añadiendo carpetas segun el orden que nos indica el patrón MVC, debes tener una estructura como la siguiente:
2. Continuaremos con el desarrollo del MODELO, MVC nos dice que en el modelo es donde se coloca la logica del negocio, ademas es aqui donde se efectua a interacción con la base de datos. Nuestro modelo constara de dos clases:
Clase: db.class.php
<?php /* CLASE PARA LA CONEXION Y LA GESTION DE LA BASE DE DATOS Y LA PAGINA WEB */ class database { private $conexion; /* METODO PARA CONECTAR CON LA BASE DE DATOS*/ public function conectar() { if(!isset($this->conexion)) { $this->conexion = (mysql_connect("localhost","USUARIO","PASSWORD")) or die(mysql_error()); mysql_select_db("BASE_DE_DATOS",$this->conexion) or die(mysql_error()); } } /* METODO PARA REALIZAR UNA CONSULTA INPUT: $sql | codigo sql para ejecutar la consulta OUTPUT: $result */ public function consulta($sql) { $resultado = mysql_query($sql,$this->conexion); if(!$resultado){ echo 'MySQL Error: ' . mysql_error(); exit; } return $resultado; } /*METODO PARA CONTAR EL NUMERO DE RESULTADOS INPUT: $result OUTPUT: cantidad de registros encontrados */ function numero_de_filas($result){ if(!is_resource($result)) return false; return mysql_num_rows($result); } /*METODO PARA CREAR ARRAY DESDE UNA CONSULTA INPUT: $result OUTPUT: array con los resultados de una consulta */ function fetch_assoc($result){ if(!is_resource($result)) return false; return mysql_fetch_assoc($result); } /* METODO PARA CERRAR LA CONEXION A LA BASE DE DATOS */ public function disconnect() { mysql_close(); } } ?>
Para este ejemplo utilizamos una base de datos con una sola tabla UNIVERSITARIO, la estructura de la tabla asi como algunos datos, en el siguiente script:
CREATE TABLE universitario ( id bigint(20) NOT NULL auto_increment, cedula varchar(12) NOT NULL, nombre varchar(60) default NULL, paterno varchar(60) default NULL, materno varchar(60) default NULL, carrera varchar(100) default NULL, PRIMARY KEY (id) ) INSERT INTO universitario VALUES (301, '5522478576', 'Libia', 'Katari', 'Reynoso', 'Enfermeria'); INSERT INTO universitario VALUES (302, '6757218827', 'Lizzet', 'Rico', 'Surco', 'Ingenieria Quimica'); INSERT INTO universitario VALUES (303, '3501621553', 'Anibal', 'Himmler', 'Rufino', 'Enfermeria'); INSERT INTO universitario VALUES (304, '0760176438', 'Lena', 'Jimenez', 'Poquechoque', 'Arquitectura'); INSERT INTO universitario VALUES (305, '1772230531', 'Lina', 'Kenjo', 'Llusco', 'Ingenieria Quimica'); INSERT INTO universitario VALUES (326, '1071742326', 'Hilarion', 'Surco', 'Jimenez', 'Derecho'); INSERT INTO universitario VALUES (327, '1651117538', 'Fernando', 'Kenjo', 'Fuertes', 'Farmacia'); INSERT INTO universitario VALUES (328, '4727502832', 'Rei', 'Simpson', 'Fortuna', 'Medicina'); INSERT INTO universitario VALUES (329, '2634301352', 'Paola', 'Altamirano', 'Fortuna', 'Farmacia'); INSERT INTO universitario VALUES (330, '4060826165', 'Laura', 'Gorgori', 'Ikari', 'Administración de Empresas'); INSERT INTO universitario VALUES (331, '6562441148', 'Reyna', 'Alvis', 'Himmler', 'Agronomia'); INSERT INTO universitario VALUES (332, '2278381772', 'Lena', 'Altamirano', 'Kenjo', 'Administración de Empresas'); INSERT INTO universitario VALUES (333, '8554161628', 'Laura', 'Aviles', 'Llusco', 'Administración de Empresas'); INSERT INTO universitario VALUES (334, '0002738271', 'Oscar', 'Camara', 'Katari', 'Gas y Petroleo'); INSERT INTO universitario VALUES (335, '2673648388', 'Lena', 'Fortuna', 'Altamirano', 'Agronomia'); INSERT INTO universitario VALUES (336, '3605678426', 'Lizzet', 'Zanabria', 'Callaza', 'Economia'); INSERT INTO universitario VALUES (337, '1543513701', 'Fernando', 'Katari', 'Simpson', 'Diseño de Interiores'); INSERT INTO universitario VALUES (338, '3877833273', 'Fernando', 'Camara', 'Chipana', 'Agronomia'); INSERT INTO universitario VALUES (339, '5524582347', 'Oscar', 'Brinco', 'Chavez', 'Gas y Petroleo'); INSERT INTO universitario VALUES (340, '7532852006', 'Cesar', 'Brinco', 'Ikari', 'Ingenieria de Sistemas'); INSERT INTO universitario VALUES (341, '4740118030', 'Rei', 'Chive', 'Gorgori', 'Enfermeria'); INSERT INTO universitario VALUES (342, '5663577704', 'Paola', 'Paravicini', 'Flanders', 'Derecho'); INSERT INTO universitario VALUES (343, '5742610002', 'David', 'Brinco', 'Jimenez', 'Economia'); INSERT INTO universitario VALUES (344, '3740560251', 'Pedro', 'Sanchez', 'Brinco', 'Agronomia'); INSERT INTO universitario VALUES (345, '1681801012', 'Lula', 'Chive', 'Langley', 'Odontologia'); INSERT INTO universitario VALUES (346, '0454664741', 'Bryan', 'Brinco', 'Jimenez', 'Ingenieria Quimica');
Recuerda que debes crear una base de datos junto a la tabla y los datos en el servidor que estes utilizando y colocar esos datos en la clase db.class.php
Clase: universitario.class.php
<?php /* CLASE PARA LA GESTION DE LOS UNIVERSITARIOS */ require_once "db.class.php"; class universitario extends database { /* REALIZA UNA CONSULTA A LA BASE DE DATOS EN BUSCA DE REGISTROS UNIVERSITARIOS DADOS COMO PARAMETROS LA "CARRERA" Y LA "CANTIDAD" DE REGISTROS A MOSTRAR INPUT: $carrera | nombre de la carrera a buscar $limit | cantidad de registros a mostrar OUTPUT: $data | Array con los registros obtenidos, si no existen datos, su valor es una cadena vacia */ function universitarios($carrera=NULL, $limit=12) { //conexion a la base de datos $this->conectar(); $query = $this->consulta("SELECT * FROM universitario WHERE carrera='$carrera' ORDER BY rand() LIMIT $limit;"); $this->disconnect(); if($this->numero_de_filas($query) > 0) // existe -> datos correctos { //se llenan los datos en un array while ( $tsArray = $this->fetch_assoc($query) ) $data[] = $tsArray; return $data; }else { return ''; } } } ?>
3. Es el turno de crear las VISTAS del usuario (VIEW), estas vistas pueden ser creadas utilizando algun manejador de plantillas *.tpl o tambien pueden ser HTML puro como nuestro caso, estas vistas deben contener codigo php minimo para su mejor mantenimiento, ademas estas vistas al ser HTML, tambien hacen uso de hojas de estilo CSS, javascript, imagenes y otros recursos tipicos en cualquier otra web.
Crearemos nuevas carpetas dentro de nuestra carpeta «default» que creamos al comienzo del proyecto, las nuevas carpetas y archivos son:
debemos tener algo como la imagen siguiente:
CSS: En esta carpeta guardaremos todas las hojas de estilo que utilicemos en el proyecto, para este ejemplo, solo utilizamos una hoja de estilo (estilo.css) cuyo codigo es el siguiente:
estilo.css
* { padding: 0; margin: 0; } body { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; background-color:#FFFFCC; } /* Maquetación */ #wrapper { margin: 0 auto; width: 100%; } #header { width: 100%; float: left; height: 120px; background:#0099CC; border-bottom:1px solid #D9E3E5; } #leftcolumn { height:inherit; width: 20%; float: left; } #content { float: left; color: #333; background:#CCCCCC; width:76%; height:inherit: display: inline; } /* end: maquetación */ /* estilo de texto */ .t{ font-size:18px; font-weight:bold; margin:10px 0 10px 0; padding-left:20px; } /*------------- ESTILOS TABLA -----------------*/ .tabla th { padding: 5px; font-size: 16px; background-color: #83aec0; color: #FFFFFF; border-width: 1px; border-style: solid; border-color: #ffffff; font-family: ?Trebuchet MS?, Arial; text-transform: uppercase; } .tabla td { padding: 5px; border-width: 1px; border-style: solid; border-color: #ffffff; text-align:right; } /*------------------------- MENU IZQUIERDA ----------------------------*/ #menu { width: 200px; margin: 10px; } #menu li a { height: 32px; voice-family: "\"}\""; voice-family: inherit; height: 24px; text-decoration: none; } #menu li a:link, #menu5 li a:visited { color: #FFF; display: block; background: url(../images/menu.gif); padding: 8px 0 0 10px; } #menu li a:hover { color: #FFF; background: url(../images/menu.gif) 0 -32px; padding: 8px 0 0 10px; } #menu ul { list-style: none; margin: 0; padding: 0; }
Images: Como su nombre indica, es aqui donde se almacenan todas las imagenes que utilicemos en la pagina web, para este ejemplo, solo utilizamos una imagen para el menu de nuestro sitio web (menu.gif), la imagen es:
sections: En esta carpeta almacenaremos los archimos html que contienen las diferentes partes de nuestra pagina web, para este proyecto dividimos la pagina web en HEADER y MENU y un CONTENT, los archivos y su codigo correspondiente son los siguientes:
<div style=" margin:20px 0 0 0; text-align:center;"> <h1>Model, View and Controller - by Mouse</h1> <h1>#TITLE#</h1> </div>
<div id="menu"> <ul> <li><a href="index.php" >Principal</a></li> <li><a href="index.php?action=buscar">Buscar</a></li> <li><a href="index.php?action=history">History of Bolivia</a></li> </ul> </div>
modules: En esta sección almacenaremos los archivos correspondientes al contenido de la pagina, osea aquellos datos que se veran en la seccion del CONTENT. estos archivos son:
m.buscador.php ->
<form action="index.php" method="post"> <table border="0" cellspacing="4" cellpadding="0" class="tabla"> <tr> <td>Buscar por: </td> <td><label> <select name="carrera"> <option value="Arquitectura">Arquitectura</option> <option value="Enfermeria">Enfermeria</option> <option value="Ingenieria Quimica">Ingenieria Quimica</option> <option value="Odontologia">Odontologia</option> <option value="Ingenieria de Sistemas">Ingenieria de Sistemas</option> <option value="Gas y Petroleo">Gas y Petroleo</option> <option value="Administración de Empresas">Administración de Empresas</option> <option value="Diseño de Interiores">Diseño de Interiores</option> <option value="Ingenieria Civil">Ingenieria Civil</option> <option value="Ingenieria de Perros">Ingenieria de Alimentos</option> </select> </label></td> <td>Cantidad de registros: </td> <td><label> <select name="cantidad"> <option value="10">10</option> <option value="12">12</option> <option value="16">16</option> <option value="24">24</option> <option value="36">36</option> <option value="72">72</option> <option value="100">100</option> <option value="200">200</option> </select> </label></td> <td><label> <input type="submit" name="Submit" value=" Buscar " /> </label></td> </tr> </table> </form>
m.historia.php –> Esta página es estatica, no contiene instrucciones php y solo nos sirve para mostrar contenido html
<div> <div><h1>History of Bolivia</h1></div> <div> <p>Lorem ipsum ad his scripta blandit partiendo, eum fastidii accumsan euripidis in, eum liber hendrerit an. Qui ut wisi vocibus suscipiantur, quo dicit ridens inciderint id. Quo mundi lobortis reformidans eu, legimus senserit definiebas an eos. Eu sit tincidunt incorrupte definitionem, vis mutat affert percipit cu, eirmod consectetuer signiferumque eu per. In usu latine equidem dolores. Quo no falli viris intellegam, ut fugit veritus placerat per. </p> <p align="center"><img src="http://1.bp.blogspot.com/-bOuBEaJAa_A/TZUt3KH11OI/AAAAAAAAABo/SmUVVvugU78/s748/Bolivia%2Bflag.jpg" border="0" alt="Bolivia!" title="Bolivia!" /></p> <p>Ius id vidit volumus mandamus, vide veritus democritum te nec, ei eos debet libris consulatu. No mei ferri graeco dicunt, ad cum veri accommodare. Sed at malis omnesque delicata, usu et iusto zzril meliore. Dicunt maiorum eloquentiam cum cu, sit summo dolor essent te. Ne quodsi nusquam legendos has, ea dicit voluptua eloquentiam pro, ad sit quas qualisque. Eos vocibus deserunt quaestio ei.</p> <p>Blandit incorrupte quaerendum in quo, nibh impedit id vis, vel no nullam semper audiam. Ei populo graeci consulatu mei, has ea stet modus phaedrum. Inani oblique ne has, duo et veritus detraxit. Tota ludus oratio ea mel, offendit persequeris ei vim. Eos dicat oratio partem ut, id cum ignota senserit intellegat. Sit inani ubique graecis ad, quando graecis liberavisse et cum, dicit option eruditi at duo. Homero salutatus suscipiantur eum id, tamquam voluptaria expetendis ad sed, nobis feugiat similique usu ex.</p> <p>Eum hinc argumentum te, no sit percipit adversarium, ne qui feugiat persecuti. Odio omnes scripserit ad est, ut vidit lorem maiestatis his, putent mandamus gloriatur ne pro. Oratio iriure rationibus ne his, ad est corrumpit splendide. Ad duo appareat moderatius, ei falli tollit denique eos. Dicant evertitur mei in, ne his deserunt perpetua sententiae, ea sea omnes similique vituperatoribus. Ex mel errem intellegebat comprehensam, vel ad tantas antiopam delicatissimi, tota ferri affert eu nec. Legere expetenda pertinacia ne pro, et pro impetus persius assueverit.</p> <p>Ea mei nullam facete, omnis oratio offendit ius cu. Doming takimata repudiandae usu an, mei dicant takimata id, pri eleifend inimicus euripidis at. His vero singulis ea, quem euripidis abhorreant mei ut, et populo iriure vix. Usu ludus affert voluptaria ei, vix ea error definitiones, movet fastidii signiferumque in qui.</p> <p>Vis prodesset adolescens adipiscing te, usu mazim perfecto recteque at, assum putant erroribus mea in. Vel facete imperdiet id, cum an libris luptatum perfecto, vel fabellas inciderint ut. Veri facete debitis ea vis, ut eos oratio erroribus. Sint facete perfecto no vel, vim id omnium insolens. Vel dolores perfecto pertinacia ut, te mel meis ullum dicam, eos assum facilis corpora in.</p> <p>Mea te unum viderer dolores, nostrum detracto nec in, vis no partem definiebas constituam. Dicant utinam philosophia has cu, hendrerit prodesset at nam, eos an bonorum dissentiet. Has ad placerat intellegam consectetuer, no adipisci mandamus senserit pro, torquatos similique percipitur est ex. Pro ex putant deleniti repudiare, vel an aperiam sensibus suavitate. Ad vel epicurei convenire, ea soluta aliquid deserunt ius, pri in errem putant feugiat.</p> <p>Sed iusto nihil populo an, ex pro novum homero cotidieque. Te utamur civibus eleifend qui, nam ei brute doming concludaturque, modo aliquam facilisi nec no. Vidisse maiestatis constituam eu his, esse pertinacia intellegam ius cu. Eos ei odio veniam, eu sumo altera adipisci eam, mea audiam prodesset persequeris ea. Ad vitae dictas vituperata sed, eum posse labore postulant id. Te eligendi principes dignissim sit, te vel dicant officiis repudiandae.</p> </div> </div>
m.principal.php -> Igual que la anterior, solo muestra codigo HTML sin procesamiento de instrucciones PHP
<div> <div><h1>Welcome to Bolivia Technology</h1></div> <div> <p>Lorem ipsum ad his scripta blandit partiendo, eum fastidii accumsan euripidis in, eum liber hendrerit an. Qui ut wisi vocibus suscipiantur, quo dicit ridens inciderint id. Quo mundi lobortis reformidans eu, legimus senserit definiebas an eos. Eu sit tincidunt incorrupte definitionem, vis mutat affert percipit cu, eirmod consectetuer signiferumque eu per. In usu latine equidem dolores. Quo no falli viris intellegam, ut fugit veritus placerat per. </p> <p>Ius id vidit volumus mandamus, vide veritus democritum te nec, ei eos debet libris consulatu. No mei ferri graeco dicunt, ad cum veri accommodare. Sed at malis omnesque delicata, usu et iusto zzril meliore. Dicunt maiorum eloquentiam cum cu, sit summo dolor essent te. Ne quodsi nusquam legendos has, ea dicit voluptua eloquentiam pro, ad sit quas qualisque. Eos vocibus deserunt quaestio ei.</p> <p>Blandit incorrupte quaerendum in quo, nibh impedit id vis, vel no nullam semper audiam. Ei populo graeci consulatu mei, has ea stet modus phaedrum. Inani oblique ne has, duo et veritus detraxit. Tota ludus oratio ea mel, offendit persequeris ei vim. Eos dicat oratio partem ut, id cum ignota senserit intellegat. Sit inani ubique graecis ad, quando graecis liberavisse et cum, dicit option eruditi at duo. Homero salutatus suscipiantur eum id, tamquam voluptaria expetendis ad sed, nobis feugiat similique usu ex.</p> <p>Eum hinc argumentum te, no sit percipit adversarium, ne qui feugiat persecuti. Odio omnes scripserit ad est, ut vidit lorem maiestatis his, putent mandamus gloriatur ne pro. Oratio iriure rationibus ne his, ad est corrumpit splendide. Ad duo appareat moderatius, ei falli tollit denique eos. Dicant evertitur mei in, ne his deserunt perpetua sententiae, ea sea omnes similique vituperatoribus. Ex mel errem intellegebat comprehensam, vel ad tantas antiopam delicatissimi, tota ferri affert eu nec. Legere expetenda pertinacia ne pro, et pro impetus persius assueverit.</p> <p>Ea mei nullam facete, omnis oratio offendit ius cu. Doming takimata repudiandae usu an, mei dicant takimata id, pri eleifend inimicus euripidis at. His vero singulis ea, quem euripidis abhorreant mei ut, et populo iriure vix. Usu ludus affert voluptaria ei, vix ea error definitiones, movet fastidii signiferumque in qui.</p> <p>Vis prodesset adolescens adipiscing te, usu mazim perfecto recteque at, assum putant erroribus mea in. Vel facete imperdiet id, cum an libris luptatum perfecto, vel fabellas inciderint ut. Veri facete debitis ea vis, ut eos oratio erroribus. Sint facete perfecto no vel, vim id omnium insolens. Vel dolores perfecto pertinacia ut, te mel meis ullum dicam, eos assum facilis corpora in.</p> <p>Mea te unum viderer dolores, nostrum detracto nec in, vis no partem definiebas constituam. Dicant utinam philosophia has cu, hendrerit prodesset at nam, eos an bonorum dissentiet. Has ad placerat intellegam consectetuer, no adipisci mandamus senserit pro, torquatos similique percipitur est ex. Pro ex putant deleniti repudiare, vel an aperiam sensibus suavitate. Ad vel epicurei convenire, ea soluta aliquid deserunt ius, pri in errem putant feugiat.</p> <p>Sed iusto nihil populo an, ex pro novum homero cotidieque. Te utamur civibus eleifend qui, nam ei brute doming concludaturque, modo aliquam facilisi nec no. Vidisse maiestatis constituam eu his, esse pertinacia intellegam ius cu. Eos ei odio veniam, eu sumo altera adipisci eam, mea audiam prodesset persequeris ea. Ad vitae dictas vituperata sed, eum posse labore postulant id. Te eligendi principes dignissim sit, te vel dicant officiis repudiandae.</p> </div> </div>
m.table_univ.php -> Este archivo si contiene instrucciones PHP, como se ve en e codigo, es una tabla de 5 columnas junto a la intruccion PHP de FOREACH, recibe un array que viene desde el modelo y segun los datos que contenga va recoriendo y creando a su paso las filas TD de la tabla
<div class="t"><?php echo $titulo; ?></div> <table border="0" cellspacing="3" cellpadding="0" class="tabla" width="100%"> <tr> <th>DNI</th> <th>Nombre</th> <th>Ap. Paterno </th> <th>Ap. Materno </th> <th>Carrera</th> </tr> <?php foreach ($tsArray as $data): ?> <tr> <td><?php echo $data['cedula'];?></td> <td><?php echo $data['nombre'];?></td> <td><?php echo $data['paterno'];?></td> <td><?php echo $data['materno'];?></td> <td><?php echo $data['carrera'];?></td> </tr> <?php endforeach; ?> </table>
Ademas como se puede ver en la imagen, tenemos tambien un archivo PHP (page.php) que esta en la raiz de la carpeta «default«, este archivo es toda la plantilla en si, ademas contiene algunas palabras clave encerradas entre los simbolos de numeral «#», estas «palabaras clave» nos serviran para reemplazaras por nuestros datos desde el CONTROLADOR
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <title>MVC - by Mouse</title> <link rel="stylesheet" type="text/css" href="app/views/default/css/estilo.css"/> </head> <body> <div id="wrapper"> <!-- header --> <div id="header"> #HEADER# </div> <!-- end: header --> <!-- columna izquierda --> <div id="leftcolumn"> #MENULEFT# </div> <!-- end: columna izquierda --> <!-- contenido --> <div id="content"> #CONTENIDO# </div> <!-- end: contenido --> </div> </body> </html>
4. Estamos a punto de terminar el proyecto, ahora necesitamos implementar el CONTROLADOR del proyecto, como dijimos al principio el controlodor es el encargado de recibir las ordenes del usuario y mediante el uso del modelo procesar la información para mostrar el resultado a traves de las vistas.
Clase: mvc.controller.php
<?php require 'app/model/universitario.class.php'; class mvc_controller { /* METODO QUE RECIBE LA ORDEN DE BUSQUEDA, PREPARA LOS DATOS Y SE COMUNICA CON EL MODELO PARA REALIZAR LA CONSULTA INPUT $carrera | nombre de la carrera a buscar $limit | cantidad de registros a mostrar OUTPUT HTML | el resultado obtenido del modelo es procesado y convertido en codigo html para que el VIEW pueda mostrarlo */ function buscar($carrera, $cantidad) { $universitario = new universitario(); //carga la plantilla $pagina=$this->load_template('- Resultados de la busqueda -'); //carga html del buscador $buscador = $this->load_page('app/views/default/modules/m.buscador.php'); //obtiene los registros de la base de datos ob_start(); //realiza consulta al modelo $tsArray = $universitario->universitarios($carrera,$cantidad); if($tsArray!=''){//si existen registros carga el modulo en memoria y rellena con los datos $titulo = 'Resultado de busqueda por "'.$carrera.'" '; //carga la tabla de la seccion de VIEW include 'app/views/default/modules/m.table_univ.php'; $table = ob_get_clean(); //realiza el parseado $pagina = $this->replace_content('/\#CONTENIDO\#/ms', $buscador.$table , $pagina); }else{//si no existen datos -> muestra mensaje de error $pagina = $this->replace_content('/\#CONTENIDO\#/ms' ,$buscador.'<h1>No existen resultados</h1>' , $pagina); } $this->view_page($pagina); } /* METODO QUE MUESTRA LA PAGINA PRINCIPAL CUANDO NO EXISTEN NUEVAS ORDENES OUTPUT HTML | codigo html de la pagina */ function principal() { $pagina=$this->load_template('Pagina Principal MVC'); $html = $this->load_page('app/views/default/modules/m.principal.php'); $pagina = $this->replace_content('/\#CONTENIDO\#/ms' ,$html , $pagina); $this->view_page($pagina); } /* METODO QUE MUESTRA LA PAGINA HISTORIA DE BOLIVIA, ES UNA PAGINA ESTATICA OUTPUT HTML | codigo html de la pagina */ function historia() { $pagina=$this->load_template('History of Bolivia'); $html = $this->load_page('app/views/default/modules/m.historia.php'); $pagina = $this->replace_content('/\#CONTENIDO\#/ms' ,$html , $pagina); $this->view_page($pagina); } /* METODO QUE CARGA LAS PARTES PRINCIPALES DE LA PAGINA WEB INPUT $title | titulo en string del header OUTPIT $pagina | string que contiene toda el cocigo HTML de la plantilla */ function load_template($title='Sin Titulo'){ $pagina = $this->load_page('app/views/default/page.php'); $header = $this->load_page('app/views/default/sections/s.header.php'); $pagina = $this->replace_content('/\#HEADER\#/ms' ,$header , $pagina); $pagina = $this->replace_content('/\#TITLE\#/ms' ,$title , $pagina); $menu_left = $this->load_page('app/views/default/sections/s.menuizquierda.php'); $pagina = $this->replace_content('/\#MENULEFT\#/ms' ,$menu_left , $pagina); return $pagina; } /* METODO QUE MUESTRA EN PANTALLA EL FORMULARIO DE BUSQUEDA HTML | codigo html de la pagina con el buscador incluido */ function buscador(){ $pagina=$this->load_template('Busqueda de registros'); $buscador = $this->load_page('app/views/default/modules/m.buscador.php'); $pagina = $this->replace_content('/\#CONTENIDO\#/ms' ,$buscador , $pagina); $this->view_page($pagina); } /* METODO QUE CARGA UNA PAGINA DE LA SECCION VIEW Y LA MANTIENE EN MEMORIA INPUT $page | direccion de la pagina OUTPUT STRING | devuelve un string con el codigo html cargado */ private function load_page($page) { return file_get_contents($page); } /* METODO QUE ESCRIBE EL CODIGO PARA QUE SEA VISTO POR EL USUARIO INPUT $html | codigo html OUTPUT HTML | codigo html */ private function view_page($html) { echo $html; } /* PARSEA LA PAGINA CON LOS NUEVOS DATOS ANTES DE MOSTRARLA AL USUARIO INPUT $out | es el codigo html con el que sera reemplazada la etiqueta CONTENIDO $pagina | es el codigo html de la pagina que contiene la etiqueta CONTENIDO OUTPUT HTML | cuando realiza el reemplazo devuelve el codigo completo de la pagina */ private function replace_content($in='/\#CONTENIDO\#/ms', $out,$pagina) { return preg_replace($in, $out, $pagina); } } ?>
5. Para terminar la aplicación haremos uso de un distpacher, un dispatcher es una entrada única para la aplicación, esta entrada sera nuestro index.php hubicada en la raiz del proyecto, a traves de él mostraremos la salida de las vistas al usuario y tambien a traves de él enviaremos las distintas acciones que el usuario envie al controlador.
index.php
<?php require 'app/controller/mvc.controller.php'; //se instancia al controlador $mvc = new mvc_controller(); if( $_GET['action'] == 'buscar' ) //muestra el modulo del buscador { $mvc->buscador(); } else if( $_GET['action'] == 'history' ) //muestra el modulo "historia de Bolivia" { $mvc->historia(); } else if( isset($_POST['carrera']) && isset($_POST['cantidad']) )//muestra el buscador y los resultados { $mvc->buscar( $_POST['carrera'], $_POST['cantidad'] ); } else //Si no existe GET o POST -> muestra la pagina principal { $mvc->principal(); } ?>
La estructura del proyecto que debes tener hasta ahora es:
Con esto terminamos el proyecto, ya solo queda ejecutar la aplicación web desde el servidor, en el siguiente video puedes ver el resultado ademas del desarrollo del ejemplo en el IDE de PhpDesigner
[http://www.youtube.com/watch?v=1hPOXbhK6LM]
Este es un ejemplo de desarrollo de una aplicación web utilizando el patron MVC, no es el único, no existe regla que diga como debe estructurase las carpetas y archivos del proyecto MVC siempre y cuando se conserve la division entre las partes Modelo, Vista y Controlador, aunque claro es una buena practica utilizar algunas notaciones ya generalizadas como CLASS para los archivos de clases, CONTROLLER en los archivos que utilicemos como controladores, etc.
Si deseas puedes descargarte el ejemplo desde AQUI
En este videotutorial se vera la creación de Interfaces Gráficas de Usuario (GUI) utilizando MatLab GUIDE herramienta vi[...]
TextInput es una caja de texto que implementa el estilo de Material Design popular en dispositivos móviles, pero este sw[...]
Información sobre la serie: Neon Genesis Evangelion (新世紀エヴァンゲリオン, también conocido como «Evangelion») es una serie de an[...]
Vue.js es un framework progresivo para la creación de interfaces de usuario de una sola página creado por Evan You. Pero[...]
Online Flag Waver es una páginas web con la que podemos generar banderas ondeando con la textura que elijamos ya sea des[...]
Problema: Desarrolle un programa en consola con c# para escribir y leer información de un archivo binario. Los datos a e[...]