|
|
(6 revisiones intermedias por el mismo usuario no mostrado) |
Línea 1: |
Línea 1: |
| {{:Usuario:ManuelRomero/php/smarty/tienda/nav}} | | {{:Usuario:ManuelRomero/php/smarty/tienda/nav}} |
| __NOTOC__ | | __NOTOC__ |
| + | <div class="parrafo"> |
| ===Probando el ejemplo=== | | ===Probando el ejemplo=== |
| *Puedes ver esta parte del ejercicio ejecutándose en la web: | | *Puedes ver esta parte del ejercicio ejecutándose en la web: |
− | http://manuel.infenlaces.com/dwes/tienda/TiendaLogin/login.php | + | http://manuel.infenlaces.com/dwes/practicas/tienda/1.-%20TiendaLogin/login.php |
| {{Tip| usuario '''''dwes''''' y pass '''''abc123.'''''}} | | {{Tip| usuario '''''dwes''''' y pass '''''abc123.'''''}} |
− | {{Tip|Esta parte está toda resuelta aquí para dejar claro el uso de plantillas}}
| |
| | | |
| ===La lógica=== | | ===La lógica=== |
Línea 44: |
Línea 44: |
| *Para poder pasar parámetros a la hora de ejecutar la consutla usaremos '''''PDO''''' en lugar de '''''mysqli''''' | | *Para poder pasar parámetros a la hora de ejecutar la consutla usaremos '''''PDO''''' en lugar de '''''mysqli''''' |
| [[Archivo:DB.png]] | | [[Archivo:DB.png]] |
− | *El código de esta clase
| + | </div> |
− | {{Plegable|hide|Clase DB.php|
| + | |
− | <source lang=php> | + | |
− | <?php
| + | |
− | | + | |
− | | + | |
− | class DB {
| + | |
− | //atributo privado de conexión
| + | |
− | private static $conexion;
| + | |
− |
| + | |
− | /*======================conectar()======================================
| + | |
− | conecta con la base de datos, usando PDO
| + | |
− | da valor al atributo privado y estático $conexion de la clase
| + | |
− | En caso de no conectarse aborta la app y muestra un mensaje
| + | |
− | ****************************************************************************************** */
| + | |
− | private static function conectar(){
| + | |
− | $opc = array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8");
| + | |
− | $dsn = "mysql:host=localhost;dbname=manuel_dwes";
| + | |
− | $usuario = 'root';
| + | |
− | $pass = 'root';
| + | |
− | try{
| + | |
− | $conexion= new PDO($dsn, $usuario, $pass, $opc);
| + | |
− | $conexion->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
| + | |
− | }catch (PDOException $e) {
| + | |
− | die ('Abortamos la aplicación por fallo conectando con la BD' . $e->getMessage());
| + | |
− | }
| + | |
− | self::$conexion = $conexion;
| + | |
− |
| + | |
− | }
| + | |
− | | + | |
− | | + | |
− | /*======================ejecutaConsulta ($sql,$valores)======================================
| + | |
− | Acción: Ejecuta una consulta preparada con los valores de los parámetros de la consulta preparada
| + | |
− | Parámetros: $sql es la consulta preparada y parametrizada
| + | |
− | $valores es un array asociativo con los valores de los distintos
| + | |
− | parámetros de la consulta anterior
| + | |
− | Retorna =La consulta después de ejecutarla, o null si no la ha podido ejecutar
| + | |
− | en caso de no ejecutarla da un mensaje
| + | |
− | * ***********************************************************************************************/
| + | |
− | protected static function ejecutaConsulta($sql,$valores) {
| + | |
− | if (self::$conexion == null)
| + | |
− | self::conectar();
| + | |
− | $conexion = self::$conexion;
| + | |
− | try{
| + | |
− | $consulta = $conexion->prepare($sql);
| + | |
− | $consulta->execute($valores);
| + | |
− | }catch (PDOException $e) {
| + | |
− | echo 'No se ha podido ejecutar la consulta' . $e->getMessage();
| + | |
− | return null;
| + | |
− | }
| + | |
− | return $consulta;
| + | |
− |
| + | |
− | }
| + | |
− | | + | |
− | | + | |
− | /*======================verificaCliente ($nombre,$pass)======================================
| + | |
− | Accion: verifica si un nombre y pass son contenidos en la base de datos
| + | |
− | Parámetros: $nombre es el nombre de usuario
| + | |
− | $pass es la password para ese nombre
| + | |
− | Retorna true o false según se haya podido o no validar
| + | |
− | * Recordar que la pass está cifrada con md5 en la base de datos
| + | |
− | * ***********************************************************************************************/
| + | |
− | public static function verificaCliente($nombre, $pass) {
| + | |
− | $valores = array('usuario'=>$nombre, 'password' =>$pass);
| + | |
− | $sql = <<<FIN
| + | |
− | SELECT usuario FROM usuarios
| + | |
− | WHERE usuario=:usuario
| + | |
− | AND contrasena=md5(:password)
| + | |
− | FIN;
| + | |
− | $resultado = self::ejecutaConsulta ($sql,$valores);
| + | |
− | $verificado = false;
| + | |
− | if ($resultado->fetch())
| + | |
− | $verificado=true;
| + | |
− | return $verificado;
| + | |
− | }
| + | |
− | }//End de la clase DB.php
| + | |
− | | + | |
− | ?>
| + | |
− | </source>
| + | |
− | }}
| + | |
− | ;login.php
| + | |
− | *Este fichero implementa las acciones especificadas anteriormente
| + | |
− | *Cargamos la librería de '''''smarty'''''
| + | |
− | *Realizamos la lógica
| + | |
− | *Exportamos la variable '''''$error''''' para la plantilla
| + | |
− | *Visualizamos la plantilla
| + | |
− | *El código se exporta a continuación
| + | |
− | {{Plegable|hide|login.php
| + | |
− | <source lang=php>
| + | |
− | <?php
| + | |
− | require_once('./../include/DB.php');
| + | |
− | | + | |
− | // Cargamos la librería de Smarty
| + | |
− | require_once('Smarty.class.php');
| + | |
− | $smarty = new Smarty;
| + | |
− | $smarty->template_dir = '/web/smarty/tiendaSmarty/templates/';
| + | |
− | $smarty->compile_dir = '/web/smarty/tiendaSmarty/templates_c/';
| + | |
− | $smarty->config_dir = '/web/smarty/tiendaSmarty/configs/';
| + | |
− | $smarty->cache_dir = '/web/smarty/tiendaSmarty/cache/';
| + | |
− | // Verificaamos si queremos validar los datos del formulario o solo visualizar el formulario (login.tpl)
| + | |
− | if (isset($_POST['enviar'])) {
| + | |
− | $usuario = $_POST['usuario'];
| + | |
− | $pass = $_POST['password'];
| + | |
− | if ((empty($usuario)) || (empty($pass)))
| + | |
− | $smarty->assign('error','Debes introducir un nombre de usuario y una contraseña');
| + | |
− | else {
| + | |
− | // Comprobamos las credenciales con la base de datos
| + | |
− | if (DB::verificaCliente($usuario, $pass)) {
| + | |
− | session_start();
| + | |
− | $_SESSION['usuario']=$usuario;
| + | |
− | header("Location: producto.php");
| + | |
− | }
| + | |
− | else {
| + | |
− | // Si las credenciales no son válidas, se vuelven a pedir
| + | |
− | $smarty->assign('error','Usuario o contraseña no válidos!');
| + | |
− | }
| + | |
− | }
| + | |
− | }
| + | |
− | // Mostramos la plantilla
| + | |
− | $smarty->display('login.tpl');
| + | |
− | ?>
| + | |
− | </source>
| + | |
− | }}
| + | |
− | ;login.tpl
| + | |
− | *La plantilla tiene la parte de html
| + | |
− | *Lo único que visualiza es el código de error en caso de que lo hubiera
| + | |
− | {{Plegable|hide|login.tpl|
| + | |
− | <source lang=html>
| + | |
− | <!DOCTYPE html>
| + | |
− | {*Plantilla para login. Es invocada desde login.php. solo visualiza el $error del php*}
| + | |
− | <html>
| + | |
− | <head>
| + | |
− | <meta http-equiv="content-type" content="text/html; charset=UTF-8">
| + | |
− | <title>Login Tienda Web con Plantillas</title>
| + | |
− | <link href="tienda.css" rel="stylesheet" type="text/css">
| + | |
− | </head>
| + | |
− | <body>
| + | |
− | <div id='login'>
| + | |
− | <form action='login.php' method='post'>
| + | |
− | <fieldset >
| + | |
− | <legend>Login</legend>
| + | |
− | {*si la variable error tiene algún valor se visualiza*}
| + | |
− | <div><span class='error'>{$error}</span></div>
| + | |
− | <div class='campo'>
| + | |
− | <label for='usuario' >Usuario:</label><br/>
| + | |
− | <input type='text' name='usuario' id='usuario' maxlength="50" /><br/>
| + | |
− | </div>
| + | |
− | <div class='campo'>
| + | |
− | <label for='password' >Contraseña:</label><br/>
| + | |
− | <input type='password' name='password' id='password' maxlength="50" /><br/>
| + | |
− | </div>
| + | |
− | | + | |
− | <div class='campo'>
| + | |
− | <input type='submit' name='enviar' value='Enviar' />
| + | |
− | </div>
| + | |
− | </fieldset>
| + | |
− | </form>
| + | |
− | </div>
| + | |
− | </body>
| + | |
− | </html>
| + | |
− | | + | |
− | </source>
| + | |
− | }}
| + | |
− | ;productos.php
| + | |
− | *En esta primera parte del proyecto estos ficheros solo contienen información básica,
| + | |
− | *Se implementará en la segunda parte del desarrollo
| + | |
− | {{Plegable|hide|productos.php|
| + | |
− | <source lang=php>
| + | |
− | <?php
| + | |
− | require_once('Smarty.class.php');
| + | |
− | // Recuperamos la información de la sesión
| + | |
− | session_start();
| + | |
− | // Y comprobamos que el usuario se haya autentificado, para evitar que puedan acceder directamente
| + | |
− | //a esta pagina sin pasar por el login
| + | |
− | if (!isset($_SESSION['usuario']))
| + | |
− | die("Error - debe <a href='login.php'>identificarse</a>.<br />");
| + | |
− | // Cargamos la librería de Smarty
| + | |
− | $smarty = new Smarty;
| + | |
− | | + | |
− | $smarty->template_dir = '/web/smarty/tiendaSmarty/templates/';
| + | |
− | $smarty->compile_dir = '/web/smarty/tiendaSmarty/templates_c/';
| + | |
− | $smarty->config_dir = '/web/smarty/tiendaSmarty/configs/';
| + | |
− | $smarty->cache_dir = '/web/smarty/tiendaSmarty/cache/';
| + | |
− | //De momento solo visualizamos que el usuario
| + | |
− | $smarty->assign("usuario",$_SESSION['usuario']);
| + | |
− | //Ahora mostramos la plantilla
| + | |
− | $smarty->display("producto.tpl");
| + | |
− | ?>
| + | |
− | </source>
| + | |
− | ;producto.tpl
| + | |
− | *La plantilla del producto
| + | |
− | *Simplemente una página de información de lo que hará
| + | |
− | {{Plegable|hide|producto.tpl|
| + | |
− | <source lang = php>
| + | |
− | <!DOCTYPE html>
| + | |
− | {*Platilla para visualizar los productos, se invoca desde productos.php*}
| + | |
− | <html>
| + | |
− | <head>
| + | |
− | <title>práctica de tienda página de productos </title>
| + | |
− | <meta charset="UTF-8">
| + | |
− | </head>
| + | |
− | <body>
| + | |
− | {*primero solo visualizaremos que el usuario está conectado*}
| + | |
− | <h1>Bienvenido a esta página {$usuario}</h1>
| + | |
− | <hr/>
| + | |
− | <h3>En breve visualizará una lista de productos para hacer su compra</h3>
| + | |
− |
| + | |
− | </body>
| + | |
− | </html>
| + | |
− | </source>
| + | |
− | }}
| + | |