Ejemplo de aplicación MVC muy simple


Tras unos cuantos días informándome del sistema MVC (Modelo – Vista – Controlador) he realizado mi primera aplicación completa basada en ese diseño.

Se trata de SimpleSurvey, una aplicación muy simple que permitiría a un encuestador a pie de calle tomar datos de los votantes a su salida del colegio electoral.

Puedes ver la demo AQUÍ y descargarla AQUÍ.

Consta de dos areas: principal y administración.

La principal muestra el formulario de entrada de datos. Nos pide el sexo, la edad y el partido votado. El area de administración nos muestra los datos registrados en nuestra base de datos y ofrece la posibilidad de borrar el registro.

Arrancamos nuestro programa desde index.php. Se trata de un archivo fundamentalmente html en el que su head cargaremos los archivos css y javascripts necesarios para el diseño además de cargar el archivo controlador.php necesario para el funcionamiento.

Distinguiremos gracias a if (@$_GET[‘action’] == ‘opción_elegida’) en que apartado estamos y en consecuencia llamaremos a la función que nos muestre el contenido en cada caso.

<!DOCTYPE html>
<?php
require 'controlador/controlador.php';
?>
<html>
    <head>
        <meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0" />
 
        <meta charset="UTF-8">
        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" crossorigin="anonymous">
        <link rel="stylesheet" type="text/css" href="css/style.css">
        <script Language=Javascript SRC="js/script.js"></script>
        <title>Encuesta Electoral</title>
    </head>
    <body>
        <div class="creditos">SimpleSurvey v1.0.
            <a class="texto" href="javascript:MostrarOcultar('creditos');"> 
                Créditos</a></div> 
 
        <div class="cp_oculta" id="creditos">  
            <p>Simple Survey es un sencillo programa basado en el sistema modelo-vista-controlador.</p>
            <p>Su función es la de facilitar el trabajo a un encuestador a pie de calle.</p>
            <p>Realizado por Pau Rodellino de <a href="http://nexus127.esy.es">Nexus127</a> en Junio de 2016.</p>
        </div> 
        <?php
        //Mostramos la barra de opciones según donde estemos
        $con = new controlador();
 
        if (@$_GET['action'] == 'admin') {
            ?> <div class="mio"><a class="btn btn-default" href="index.php?action=principal">Principal</a></div> <?php
        } else {
            ?> <div class="mio"><a class="btn btn-default" href="index.php?action=admin">Admin</a></div> <?php
        }
        ?>
    </div>
    <div id="padre">
        <div id="hijo">
            <?php
            //Mostramos el contenido aegún donde estemos
            $con = new controlador();
 
            if (@$_GET['action'] == 'admin') {
                $con->admin();
            } else {
                $con->principal();
            }
            ?>
        </div>
    </div>
</body>
</html>

 

En el modelo (modelo/db.php) tendremos todas las operaciones que necesitaremos de la base de datos.
Y en el controlador llamaremos a las funciones del modelo y les pasaremos los datos que permitirán el manejo de la web.

<?php
 
//Extraido de http://www.desarrolloweb.com/wiki/ejemplo-sql-con-mysqlconnect.html
 
class db {
 
//    function conectar() {
//        // Conectando, seleccionando la base de datos
//        mysql_connect('localhost', 'root', '')
//                or die('No se pudo conectar: ' . mysql_error());
//        //echo 'Connected successfully';
//        mysql_select_db('encuesta') or die('No se pudo seleccionar la base de datos');
//    }
 
    function conectar() {
        // Conectando, seleccionando la base de datos
        mysql_connect('sql7.freemysqlhosting.net', 'sql7125596', 'i7LkvpETHX')
                or die('No se pudo conectar: ' . mysql_error());
        //echo 'Connected successfully';
        mysql_select_db('sql7125596') or die('No se pudo seleccionar la base de datos');
    }
 
    function consulta($tabla) {
        // Realizar una consulta MySQL
        $query = 'SELECT * FROM ' . $tabla . ' ';
        $result = mysql_query($query) or die('Consulta fallida: ' . mysql_error());
        return $result;
    }
 
    function insertar($sexo, $edad, $partido, $tabla) {
        // Realizar una inserción MySQL
        $query = 'INSERT INTO ' . $tabla . ' (id, sexo, edad, partido) VALUES ("", "' . $sexo . '","' . $edad . '","' . $partido . '" ); ';
        $result = mysql_query($query) or die('Inserción fallida: ' . mysql_error());
        return $result;
    }
 
    function borrar($tabla, $id) {
        // Borramos de la tabla
        $query = 'DELETE FROM ' . $tabla . ' WHERE id = ' . $id . '';
        $result = mysql_query($query) or die('Inserción fallida: ' . mysql_error());
        return $result;
    }
 
    function imprimir($tabla) {
        // Imprimir los resultados de manera simple
        $result = $this->consulta($tabla);
        while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) {
            foreach ($line as $col_value) {
                echo "$col_value";
            }
        }
    }
 
    function imprimir_form($tabla) {
        // Imprimir los resultados en una tabla HTML
        $result = $this->consulta($tabla);
        while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) {
            echo "	<option>";
            foreach ($line as $col_value) {
                echo "$col_value";
            }
            echo "	</option>";
        }
    }
 
    function imprimir_tabla($tabla) {
        // Imprimir los resultados en una tabla HTML
        $result = $this->consulta($tabla);
        ?> <table class="table table-hover tabla"> <?php
        while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) {
            ?> <tr>
                    <?php
                    foreach ($line as $col_value) {
                        echo "<td>$col_value</td>";
                    }
                    ?><td><form name='borrar' method='post'><button class='btn btn-default' type='Submit' name='id' value='<?php echo $line['id']; ?>'>Borrar</button></form></td>
 
                </tr>
                <?php
            }
            ?> </table> <?php
    }
 
    function cerrar() {
        // Cerrar la conexión
        mysql_close();
    }
 
    function refrescar_admin() {
        require 'vista/admin.php';
    }
 
}

 

Y en el controlador llamaremos a las funciones del modelo y les pasaremos los datos que permitirán el manejo de la web.

<?php
 
require 'modelo/db.php';
 
class controlador {
 
    function principal() {
        require 'vista/form.php';
    }
 
    function admin() {
        require 'vista/admin.php';
    }
 
    function partidos_formulario() {
        $mod = new db();
        $mod->conectar();
        $mod->imprimir_form('partidos');
        $mod->cerrar();
    }
 
    function inserta_formulario($sexo, $edad, $partido) {
        $mod = new db();
        $mod->conectar();
        $mod->insertar($sexo, $edad, $partido, 'encuesta');
        $mod->cerrar();
    }
 
    function tabla_admin() {
        $mod = new db();
        $mod->conectar();
        $mod->imprimir_tabla('encuesta');
        $mod->cerrar();
    }
 
    function borra_admin($id) {
 
        $mod = new db();
        $mod->conectar();
        $mod->borrar('encuesta', $id);
        $mod->cerrar();
        //Por algún motivo no se refresca la página correctamente al borrar un registro
        //Añadiremo esta función que refresca la página
        header("Refresh:0");
    }
 
}

He de admitir que aún me faltan pulir detalle pero en general estoy contento de la realización de este programa. Ya estoy pensando en usarlo como base para futuras ampliaciones que comprendan una función “editar” en administración así como la necesidad de loguearse para entrar en ella.