Diferencia entre revisiones de «Usuario:ManuelRomero/php/smarty/login»
(→Probando el ejemplo) |
(→Desarrollando el código) |
||
Línea 131: | Línea 131: | ||
*Visualizamos la plantilla | *Visualizamos la plantilla | ||
*El código se exporta a continuación | *El código se exporta a continuación | ||
− | {{Plegable|hide|login.php | + | {{Plegable|hide|login.php| |
<source lang=php> | <source lang=php> | ||
<?php | <?php | ||
Línea 143: | Línea 143: | ||
$smarty->config_dir = '/web/smarty/tiendaSmarty/configs/'; | $smarty->config_dir = '/web/smarty/tiendaSmarty/configs/'; | ||
$smarty->cache_dir = '/web/smarty/tiendaSmarty/cache/'; | $smarty->cache_dir = '/web/smarty/tiendaSmarty/cache/'; | ||
− | // Verificaamos si queremos validar los datos del formulario o solo visualizar el formulario (login.tpl) | + | // Verificaamos si queremos validar los datos |
+ | //del formulario o solo visualizar el formulario (login.tpl) | ||
if (isset($_POST['enviar'])) { | if (isset($_POST['enviar'])) { | ||
$usuario = $_POST['usuario']; | $usuario = $_POST['usuario']; | ||
Línea 216: | Línea 217: | ||
// Recuperamos la información de la sesión | // Recuperamos la información de la sesión | ||
session_start(); | session_start(); | ||
− | // Y comprobamos que el usuario se haya autentificado, para evitar que puedan acceder directamente | + | // Y comprobamos que el usuario se haya autentificado, |
+ | // para evitar que puedan acceder directamente | ||
//a esta pagina sin pasar por el login | //a esta pagina sin pasar por el login | ||
if (!isset($_SESSION['usuario'])) | if (!isset($_SESSION['usuario'])) |
Revisión de 05:06 3 abr 2017
Probando el ejemplo
- Puedes ver esta parte del ejercicio ejecutándose en la web:
http://manuel.infenlaces.com/dwes/tienda/TiendaLogin/login.php
La lógica
- Generaremos el fichero login.php
- Su función es autentificar al usuario de la aplicación web.
- Todos los usuarios de la aplicación deberán autentificarse utilizando esta página antes de poder acceder al resto de páginas.
- La siguiente imagen muestra un caso de uso de este escenario
- Descripción de la imagen
- Login pedirá un usuario y contraseña para validar
- Al darle a validar, se validará el usuario contra la base de datos.
- Si no es ok mostrará un error y seguiremos en login.php, si es correcto iremos a productos.php
Para este escenario necesitaremos los siguientes ficheros según vemos en la imagen
- Descripción de la imagen
- El cliente invoca al fichero login.php
- Este método solicitará usuario y contraseña visualizando la plantilla login.tpl
- Cuando presionemos enviar validará contra la base de datos
- Si todo ok, mostrará la plantilla productos.tpl;
- Si no se ha validado, mostrará la plantilla login.tpl con el error encontrado
- Para implementar esta parte del proyecto necesitaremos desarrollar los siguientes ficheros
- DB.php (clase)
- login.php (lógica)
- productos.php (lógica sin contenido)
- login.tpl (presentacion).
Desarrollando el código
- DB.php
- Esta es una clase que mantendrá todo el acceso a la base de datos
- De momento solo necesito un método de validar el usuario
- Este método tendrá que hacer 3 cosas:
- conectar a la base de datos,
- realizar una consulta,
- verificar que la consulta contenga un registro (OK! Usuario existe), o no (Usuario no registrado)
- Seguramente otros métodos tengan que hacer estas acciones (conectar, ejecutar consultas, …), por lo que estas acciones será métodos privados de la clase.
- Para poder pasar parámetros a la hora de ejecutar la consutla usaremos PDO en lugar de mysqli
- El código de esta clase
Clase DB.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 ?> |
- 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
login.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'); ?> |
- 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
login.tpl |
---|
Idioma no válido. Necesita especificar un idioma como esto: <source lang="html4strict">...</source> lenguajes soportados para sintaxis remarcada: 4cs, 6502acme, 6502kickass, 6502tasm, 68000devpac, abap, actionscript, actionscript3, ada, algol68, apache, applescript, apt_sources, arm, asm, asp, asymptote, autoconf, autohotkey, autoit, avisynth, awk, bascomavr, bash, basic4gl, bf, bibtex, blitzbasic, bnf, boo, c, c_loadrunner, c_mac, caddcl, cadlisp, cfdg, cfm, chaiscript, cil, clojure, cmake, cobol, coffeescript, cpp, cpp-qt, csharp, css, cuesheet, d, dcl, dcpu16, dcs, delphi, diff, div, dos, dot, e, ecmascript, eiffel, email, epc, erlang, euphoria, f1, falcon, fo, fortran, freebasic, freeswitch, fsharp, gambas, gdb, genero, genie, gettext, glsl, gml, gnuplot, go, groovy, gwbasic, haskell, haxe, hicest, hq9plus, html4strict, html5, icon, idl, ini, inno, intercal, io, j, java, java5, javascript, jquery, kixtart, klonec, klonecpp, latex, lb, ldif, lisp, llvm, locobasic, logtalk, lolcode, lotusformulas, lotusscript, lscript, lsl2, lua, m68k, magiksf, make, mapbasic, matlab, mirc, mmix, modula2, modula3, mpasm, mxml, mysql, nagios, netrexx, newlisp, nsis, oberon2, objc, objeck, ocaml, ocaml-brief, octave, oobas, oorexx, oracle11, oracle8, oxygene, oz, parasail, parigp, pascal, pcre, per, perl, perl6, pf, php, php-brief, pic16, pike, pixelbender, pli, plsql, postgresql, povray, powerbuilder, powershell, proftpd, progress, prolog, properties, providex, purebasic, pycon, pys60, python, q, qbasic, rails, rebol, reg, rexx, robots, rpmspec, rsplus, ruby, sas, scala, scheme, scilab, sdlbasic, smalltalk, smarty, spark, sparql, sql, stonescript, systemverilog, tcl, teraterm, text, thinbasic, tsql, typoscript, unicon, upc, urbi, uscript, vala, vb, vbnet, vedit, verilog, vhdl, vim, visualfoxpro, visualprolog, whitespace, whois, winbatch, xbasic, xml, xorg_conf, xpp, yaml, z80, zxbasic <!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> |
- 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|
<?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"); ?>
- producto.tpl
- La plantilla del producto
- Simplemente una página de información de lo que hará
producto.tpl |
---|
<!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> |