Diferencia entre revisiones de «Usuario:ManuelRomero/ProgramacionWeb/Objetos/ejercicios»
De WikiEducator
(→Ejercicio 4: tienda base con array=) |
|||
Línea 163: | Línea 163: | ||
--> | --> | ||
− | ==[[Usuario:ManuelRomero/ProgramacionWeb/Objetos/ejercicios/ejercicio4|Ejercicio 4: tienda base con array]]=== | + | ===[[Usuario:ManuelRomero/ProgramacionWeb/Objetos/ejercicios/ejercicio4|Ejercicio 4: tienda base con array]]=== |
<br /> | <br /> | ||
{{MRM_Actividad|Title=Tienda base con Array| | {{MRM_Actividad|Title=Tienda base con Array| | ||
*A partir de un array de productos, por ejemplo: | *A partir de un array de productos, por ejemplo: | ||
− | <source | + | <source lang=php> |
$productos=[ | $productos=[ | ||
'lechuga' => ['unidades' => 200, | 'lechuga' => ['unidades' => 200, | ||
Línea 183: | Línea 183: | ||
Realizamos una pequeña aplicación con los siguientes requisitos | Realizamos una pequeña aplicación con los siguientes requisitos | ||
RF1: Un usuario debe acceder registrándos (usuario y passowrd) . | RF1: Un usuario debe acceder registrándos (usuario y passowrd) . | ||
− | El criterio será que usuario y password coincidan, si no, nos informará de datos incorrectos | + | El criterio será que usuario y password coincidan, si no, |
+ | nos informará de datos incorrectos | ||
RF2: Una vez accedido nos mostrará un listado con todos los productos y sus precios | RF2: Una vez accedido nos mostrará un listado con todos los productos y sus precios | ||
RF3: También nos mostrará un formulario para poder comprar productos | RF3: También nos mostrará un formulario para poder comprar productos | ||
− | RF4: Una vez indicado los productos selecionados nos mostrará la factura . Nunca podrá facturar más productos de los que haya en existencias. | + | RF4: Una vez indicado los productos selecionados nos mostrará la factura . |
+ | Nunca podrá facturar más productos de los que haya en existencias. | ||
RNF:Se debe programar orientado a objetos, con dos clases: Productos.php y Cesta.php | RNF:Se debe programar orientado a objetos, con dos clases: Productos.php y Cesta.php | ||
+ | A continuación se muestra una posible solución | ||
+ | {{plegable|hide|Cesta.php| | ||
+ | <source lang=php> | ||
+ | <?php | ||
+ | class Cesta | ||
+ | { | ||
+ | /** | ||
+ | * @var $cesta Un array asociativo con los productos comprados | ||
+ | */ | ||
+ | private $cesta; | ||
+ | |||
+ | //Inicializo los atributos de la clase | ||
+ | public function __construct(){ | ||
+ | $this->cesta = []; | ||
+ | |||
+ | } | ||
+ | |||
+ | // añade el producto en la cesta | ||
+ | //Contabiliza no comprar más productos de las existencias | ||
+ | public function add_producto($productos, $producto, $unidades){ | ||
+ | if ($unidades> $productos[$producto]['unidades']) { | ||
+ | $unidades = $productos[$producto]['unidades']; | ||
+ | var_dump($unidades); | ||
+ | } | ||
+ | $this->cesta[$producto]=$unidades; | ||
+ | } | ||
+ | |||
+ | //Generemos una factua de la compra | ||
+ | public function generar_factura($productos):string{ | ||
+ | $factura = "<fieldset><legend>Factura </legend>"; | ||
+ | $total=0; //inicializo para evitar un warning | ||
+ | foreach ($this->cesta as $producto=> $unidades) { | ||
+ | $precio = $productos[$producto]['precio']; | ||
+ | $subtotal = floatval($unidades) * $precio; //convierto a float $unidades para evitar warning!! | ||
+ | $factura.="<h3>$unidades de $producto a $precio = $subtotal</h3>"; | ||
+ | $total+=$subtotal; | ||
+ | } | ||
+ | $factura .="<h3> Total de productos comprados <span style='color:red'>".sizeof($this->cesta)."</span></h3>"; | ||
+ | $factura .="<h2> Importe total de la factura <span style='color:red'>$total</span></h2>"; | ||
+ | return $factura; | ||
+ | } | ||
+ | |||
+ | } | ||
+ | ?> | ||
+ | |||
+ | </source> | ||
+ | |||
+ | }} | ||
+ | |||
+ | |||
+ | |||
+ | {{plegable|hide|Producto.php| | ||
+ | <source lang=php> | ||
+ | <?php | ||
+ | |||
+ | class Producto | ||
+ | { | ||
+ | /** | ||
+ | * @var $productos Un array con un listado | ||
+ | de productos (unidades y precio) para poder comprar | ||
+ | */ | ||
+ | private $productos; | ||
+ | const LISTADO_PRODUCTOS=[ | ||
+ | 'lechuga' => ['unidades' => 200, | ||
+ | 'precio' => 0.90], | ||
+ | 'tomates' =>['unidades' => 2000, | ||
+ | 'precio' => 2.15], | ||
+ | 'cebollas' =>['unidades' => 3200, | ||
+ | 'precio' => 0.49], | ||
+ | 'fresas' =>['unidades' => 4800, | ||
+ | 'precio' => 4.50], | ||
+ | 'manzanas' =>['unidades' => 2500, | ||
+ | 'precio' => 2.10], | ||
+ | ]; | ||
+ | |||
+ | //Inicializo los atributos de la clase | ||
+ | public function __construct(){ | ||
+ | $this->productos = self::LISTADO_PRODUCTOS; | ||
+ | |||
+ | } | ||
+ | |||
+ | |||
+ | public function get_productos(): array{ | ||
+ | return $this->productos; | ||
+ | } | ||
+ | |||
+ | |||
+ | } | ||
+ | </source> | ||
+ | |||
+ | }} | ||
+ | {{plegable|hide|index.php| | ||
+ | <source lang=php> | ||
+ | <?php | ||
+ | $msj=$_GET["msj"] ?? ""; | ||
+ | |||
+ | if (isset($_POST['submit'])){ | ||
+ | $name = $_POST['name']; | ||
+ | $pass = $_POST['pass']; | ||
+ | if ($name ===$pass){ | ||
+ | header ("Location:tienda.php?name=$name"); | ||
+ | exit(); | ||
+ | }else{ | ||
+ | $msj ="Datos incorrectos"; | ||
+ | } | ||
+ | |||
+ | } | ||
+ | |||
+ | ?> | ||
+ | |||
+ | |||
+ | <!doctype html> | ||
+ | <html lang="en"> | ||
+ | <head> | ||
+ | <meta charset="UTF-8"> | ||
+ | <meta name="viewport" | ||
+ | content="width=device-width"> | ||
+ | <meta http-equiv="X-UA-Compatible" content="ie=edge"> | ||
+ | <title>Document</title> | ||
+ | <link rel="stylesheet" href="estilo.css"> | ||
+ | </head> | ||
+ | <body> | ||
+ | <form action="index.php" method="post"> | ||
+ | <fieldset> | ||
+ | <h2><?=$msj?></h2> | ||
+ | <legend>Datos de acceso</legend> | ||
+ | usuario : <input type="text" name="name" id=""><br /> | ||
+ | pass <input type="text" name="pass" id=""><br /> | ||
+ | <input type="submit" value="Validar" name="submit"> | ||
+ | |||
+ | </fieldset> | ||
+ | </form> | ||
+ | |||
+ | </body> | ||
+ | </html> | ||
+ | |||
+ | </source> | ||
+ | |||
+ | }} | ||
+ | {{plegable|hide|tienda.php| | ||
+ | <source lang=php> | ||
+ | <?php | ||
+ | spl_autoload_register(function ($clase){ | ||
+ | require("$clase.php"); | ||
+ | }); | ||
+ | |||
+ | |||
+ | |||
+ | $productos = new Producto(); | ||
+ | $listado = $productos->get_productos(); | ||
+ | |||
+ | $opcion = $_POST['submit'] ?? null; | ||
+ | if ($opcion =='Comprar'){ | ||
+ | $cesta = new Cesta(); | ||
+ | $compra = $_POST['compra']; | ||
+ | foreach ($compra as $producto_comprado=>$unidades) { | ||
+ | $cesta->add_producto($listado, $producto_comprado, $unidades); | ||
+ | } | ||
+ | $factura = $cesta->generar_factura($listado); | ||
+ | } | ||
+ | |||
+ | ?> | ||
+ | <!doctype html> | ||
+ | <html lang="en"> | ||
+ | <head> | ||
+ | <meta charset="UTF-8"> | ||
+ | <meta name="viewport" | ||
+ | content="width=device-width"> | ||
+ | <meta http-equiv="X-UA-Compatible" content="ie=edge"> | ||
+ | <title>Listado de productos</title> | ||
+ | <link rel="stylesheet" href="estilo.css"> | ||
+ | </head> | ||
+ | <body> | ||
+ | <fieldset> | ||
+ | <legend>Listado de productos disponibles</legend> | ||
+ | <?php | ||
+ | foreach ($listado as $producto=>$contendio) { | ||
+ | echo "<h2>$producto ({$contendio['precio']}€) </h2>"; | ||
+ | } | ||
+ | ?> | ||
+ | </fieldset> | ||
+ | <?php | ||
+ | //Si no hay factura muestro el formulario para comprar | ||
+ | if (!isset($factura)):?> | ||
+ | <fieldset> | ||
+ | <legend>Compra</legend> | ||
+ | <form action="tienda.php" method="post"> | ||
+ | <?php | ||
+ | foreach ($listado as $producto=>$contendio) { | ||
+ | echo "<h4>$producto ({$contendio['precio']}€)"; | ||
+ | echo "<input type='text' name='compra[$producto]' > </h4>"; | ||
+ | } | ||
+ | ?> | ||
+ | <input type="submit" value="Comprar" name="submit"> | ||
+ | </form> | ||
+ | </fieldset> | ||
+ | <?php else: | ||
+ | //Si hay factura la muestro, en lugar del formulario para comprar | ||
+ | echo "$factura"; | ||
+ | ?> | ||
+ | <form action="tienda.php" method="post"> | ||
+ | <input type="submit" value="Volver a comprar" name="submit"> | ||
+ | </form> | ||
+ | <?php endif?> | ||
+ | |||
+ | |||
+ | </body> | ||
+ | </html> | ||
+ | |||
+ | </source> | ||
+ | |||
+ | }} | ||
+ | {{plegable|hide|estilo.css| | ||
+ | <source lang=css> | ||
+ | fieldset{ | ||
+ | width: 50%; | ||
+ | background: bisque; | ||
+ | margin:100px | ||
+ | } | ||
+ | legend{ | ||
+ | size : 2em; | ||
+ | color:blue; | ||
+ | } | ||
+ | |||
+ | input[type=text]{ | ||
+ | size : 1.4em; | ||
+ | color:blue; | ||
+ | |||
+ | } | ||
+ | input[type=submit]{ | ||
+ | size : 1.8em; | ||
+ | color:blue; | ||
+ | |||
+ | } | ||
+ | </source> | ||
+ | |||
+ | }} | ||
+ | |||
}} | }} | ||
<!-- | <!-- |
Revisión de 05:04 14 feb 2022