
Una aplicación que es muy recurrente en Internet es el desarrollo de una aplicación para el control de un restaurante. Esta aplicación nos sirve para utilizar lenguajes del lado del cliente, como JavaScript y lenguajes del lado del servidor como PHP, así como conectarlo con bases de datos, en este caso como MySQL, herramientas que son las más utilizadas en la Web. En este curso construiremos las páginas web por medio de Bootstrap 5.3. lo cual nos permitirá tener una aplicación responsiva.
Una aplicación que es muy recurrente en Internet es el desarrollo de una aplicación para el control de un restaurante. Esta aplicación nos sirve para utilizar lenguajes del lado del cliente, como JavaScript y lenguajes del lado del servidor como PHP, así como conectarlo con bases de datos, en este caso como MySQL, herramientas que son las más utilizadas en la Web. En este curso construiremos las páginas web por medio de Bootstrap 5.3. lo cual nos permitirá tener una aplicación responsiva.
El patrón de diseño (de software) MVC se encarga de separar la “lógica de negocio” de la “interfaz de usuario” y es el más utilizado en aplicaciones web, ya que facilita la funcionalidad, mantenibilidad y escalabilidad del sistema.
En esta clase utilizaremos las carpetas:
app
controladores
libs
modelos
sql
vistas
public
css
js
Img
fotos
Tablas: Estadomesas, Estadousuario, Estadoventa, Generos, Ingredientes, Menu, Mesas, Meseros, Promociones, Proveedores.
Tablas: Estadomesas, Estadousuario, Estadoventa, Generos, Ingredientes, Menu, Mesas, Meseros, Promociones, Proveedores.
El archivo .htaccess nos permite modificar el acceso, en un ambiente Apache, a directorios o archivos.
Para que no puedan entrar a un directorio desde la URL y no ver el mismo se utiliza (en app):
Options -Indexes
extension=php_pdo.dll
extension=php_pdo_firebird.dll
extension=php_pdo_informix.dll
extension=php_pdo_mssql.dll
extension=php_pdo_mysql.dll
extension=php_pdo_oci.dll
MVC divide las aplicaciones en tres niveles de abstracción:
El método separaURL() toma la URL del sistema y lo separará.
Utilizaremos las funciones:
isset() valida si una variable está definida.
rtrim() limpia caracteres a la derecha.
filter_var(FILTER_SANITIZE_URL) limpia los caracteres ilegales en una URL.
explode() separa una cadena por medio de una cadena delimitadora.
Dentro del constructor llamaremos el controlador y el método solicitado desde los parámetros.
Utilizaremos las funciones:
file_exists() verifica que exista el archivo físico.
ucwords() cambia a mayúscula las primeras letras.
unset() elimina una variable.
En todos los controladores necesitaremos dos métodos: Uno para llamar a las vistas con los datos a desplegar y otro para generar el modelo.
Nos conviene generar una clase auxiliar (que no se ejecuta directamente) con ambos métodos.
En todos los controladores necesitaremos dos métodos: Uno para llamar a las vistas con los datos a desplegar y otro para generar el modelo.
Nos conviene generar una clase auxiliar (que no se ejecuta directamente) con ambos métodos.
El proceso de entrada o login es un procedimiento de seguridad que permite a un usuario autenticarse para acceder a un sistema, aplicación o servicio en línea, generalmente utilizando un nombre de usuario y una contraseña, y a menudo complementado con autenticación multifactor (MFA) para mayor seguridad.
Bootstrap 5.3, la versión actual de Bootstrap, es muy bien considerada por la comunidad de desarrolladores web. Se destaca por su facilidad de uso, su amplia compatibilidad y su extensa documentación, lo que lo convierte en una herramienta muy valiosa tanto para principiantes como para desarrolladores experimentados.
form-group
text-left
form-control
btn
btn-info
Dividiremos la vista en un encabezado y en un pie de página para utilizarlos en las diferentes vistas.
Una práctica muy común es tomar un archivo anterior y convertirlo en un nuevo.
Lo realizaremos para crear la vista de “olvido de la contraseña”.
De la vista principal al controlador.
El controlador despliega la vista de “Olvidaste tu contraseña”.
A medida que avanzamos en las llamas de los métodos, la ruta relativa se puede ir perdiendo, por lo que la mantendremos en una Constante global.
define()
$_SERVER[“REQUEST_METHOD”] indica el método de envío a la página.
filter_var($email, FILTER_VALIDATE_EMAIL)
Un proceso de validación muy importante es que busquemos en la base de datos el correo electrónico antes de enviar el correo.
Realizaremos la función para desplegar el arreglo de errores dentro de la vista.
Por medio de la instrucción mail() enviaremos el correo electrónico al usuario.
Podemos crear una vista general donde podemos enviar diferentes mensajes erróneos o de aceptación.
Es muy importante saber a donde regresar después de la vista.
base64_encode()
base64_decode()
str_contains()
str_replace()
Necesitamos crear el método y la vista para cambiar la clave de acceso.
hash_hmac(“sha512”,$clave,”llave encriptacion”); Genera una cadena cifrada por el método HMAC.
hash_hmac(“sha512”,$clave,”llave encriptacion”); Genera una cadena cifrada por el método HMAC.
Una vez que tenemos la clave de acceso encriptada, la compararemos con la correspondiente en la base de datos.
hash_hmac(“sha512”,$clave,”llave encriptacion”);
Genera una cadena cifrada por el método HMAC.
session_start(array $options = []): bool
$_SESSION[ ]
session_destroy(): bool
Debemos validar que la sesión sea correctamente creada.
Si el usuario “retrocede” al login, debemos eliminar la sesión.
time() - Regresa los números de segundo transcurridos desde el 1o de enero de 1970, tiempo Unix.
setcookie() - establece una cookie o galleta.
$_COOKIE[] - vector global
Dentro de el archivo del encabezado podemos añadir un menú y manipularlo si es administrativo o un usuario.
Crear las opciones del lado derecho: usuario y salida.
Crear el parámetro private $sesion; el la clase Tablero.
Modificar el constructor en la clase Tablero.
Crear el método de logout() en la clase Tablero.
Crearemos los archivos del patrón de diseño MVC tomándo como base los anteriores ejercicios.
CREATE TABLE `usuarios` (
`id` int(11) NOT NULL,
`tipoUsuario` int(11) NOT NULL,
`nombres` varchar(200) NOT NULL,
`apellidos` varchar(200) NOT NULL,
`direccion` varchar(500) NOT NULL,
`telefono` varchar(50) NOT NULL,
`correo` varchar(150) NOT NULL,
`clave` varchar(500) NOT NULL,
`genero` int(11) NOT NULL,
`estadoUsuario` int(11) NOT NULL,
`baja` tinyint(4) NOT NULL,
`login_dt` datetime DEFAULT NULL,
`alta_dt` datetime NOT NULL,
`baja_dt` datetime NOT NULL,
`cambio_dt` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
Realizaremos el proceso de validación utilizando el método de alta anterior.
Primero verificaremos los datos.
Después insertamos el registro.
Creamos la etiqueta Select
Escribimos la primer etiqueta <option>
Creamos las etiquetas del catálogo con PHP
Verificamos si una de ellas ha sido seleccionada previamente.
Realizaremos el proceso de validación y creación de la clave de acceso temporal.
Los usuarios tendrán un estado “inactivo”.
Primero verificaremos que el correo no exista previamente en la base de datos.
Después insertamos el registro.
Después enviaremos el correo al usuario.
Aprovecharemos la vista de “Alta” para modificar.
Necesitamos un método para “armar” la vista.
Aprovecharemos la vista de “Alta” para modificar.
Necesitamos un método para “armar” la vista.
Enviaremos los datos al método “alta”.
Aprovecharemos la vista de “Alta” para mostrar el registro antes de borrarse.
Necesitamos un método para “armar” la vista de baja.
En nuestro caso, la baja será lógica, no física.
Debemos validar que el usuario esté activo.
Actualizar la fecha del login.
Enviarlo a diferente menú (si procede).
Debemos definir el tamaño de la página (una constante).
El método de carátula debemos recibir el número de página.
Determinar el número de registros de la tabla.
Debemos calcular la página y el último registro.
Enviar los datos a la vista
Crear un archivo de librerías
Debemos definir el tamaño de la página (una constante).
El método de carátula debemos recibir el número de página.
Determinar el número de registros de la tabla.
Debemos calcular la página y el último registro.
Enviar los datos a la vista
Crear un archivo de librerías
Debemos definir el tamaño de la página (una constante).
El método de carátula debemos recibir el número de página.
Determinar el número de registros de la tabla.
Debemos calcular la página y el último registro.
Enviar los datos a la vista
Crear un archivo de librerías
Límites y número de páginas
Crearemos los archivos del patrón de diseño MVC tomándo como base los anteriores ejercicios.
CREATE TABLE `meseros` (
`id` int(11) NOT NULL,
`idEspecialidad` int(11) NOT NULL,
`idGenero` int(11) NOT NULL,
`nombres` varchar(200) NOT NULL,
`apellidos` varchar(200) NOT NULL,
`baja` int(11) NOT NULL,
`alta_dt` datetime NOT NULL,
`baja_dt` datetime NOT NULL,
`cambio_dt` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
Realizaremos el proceso de validación utilizando el método de alta anterior.
Realizaremos el proceso de validación utilizando el método de alta anterior.
Aprovecharemos la vista de “Alta” para modificar.
Necesitamos un método para “armar” la vista.
Aprovecharemos la vista de “Alta” para mostrar el registro antes de borrarse.
Necesitamos un método para “armar” la vista de baja.
En nuestro caso, la baja será lógica, no física.
Crearemos los archivos del Controlador, el modelo y las dos vistas base.
Adecuaremos el método de la tabla.
Realizaremos el proceso de validación e inserción utilizando el método de alta anterior.
Aprovecharemos la vista de “Alta” para modificar.
Necesitamos un método para “armar” la vista.
Aprovecharemos la vista de “Alta” para mostrar el registro antes de borrarse.
Necesitamos un método para “armar” la vista de baja.
En nuestro caso, la baja será lógica, no física.
Crearemos los archivos del Controlador, el modelo y las dos vistas base.
Adecuaremos el método de la tabla.
Aprovecharemos la vista de “Alta” para modificar.
Necesitamos un método para “armar” la vista.
Crearemos los archivos del patrón de diseño MVC tomándo como base los anteriores ejercicios.
CREATE TABLE `ingredientes`, `id` int(11) NOT NULL, `producto` varchar(200) NOT NULL, `cantidad` int(11) NOT NULL, `idProveedor` int(11) NOT NULL, `baja` int(11) NOT NULL, `alta_dt` datetime NOT NULL, `baja_dt` datetime NOT NULL, `cambio_dt` datetime NOT NULL);
Aprovecharemos la vista de “Alta” para modificar.
Necesitamos un método para “armar” la vista.
Crearemos los archivos del patrón de diseño MVC tomándo como base los anteriores ejercicios.
Crearemos los archivos del patrón de diseño MVC tomándo como base los anteriores ejercicios.
Para poder subir imágenes en el formulario, necesitamos añadir la propiedad:
enctype="multipart/form-data"
Y añadir una etiqueta:
<input type="file" name="fotos[]" id="fotos" multiple class="form-control">
Verificaremos si existe el directorio de fotos de la receta.
Si no existe, lo crearemos.
Crearemos una vista para agregar los ingredientes de la receta.
Crearemos una vista para agregar los ingredientes de la receta tomando como base la Alta de la receta.
Limpiaremos los datos, los verificaremos e insertaremos los datos en la tabla.
Realizaremos el métodos que prepara la modificación del ingrediente y su actualización (update) en la base de datos.
Realizaremos el métodos que prepara la baja del ingrediente y su eliminación (delete) en la base de datos.
<ul class="nav">
<li class="nav-item">
<a class="nav-link active" aria-current="page" href="#">Active</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Link</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Link</a>
</li>
<li class="nav-item">
<a class="nav-link disabled" href="#" tabindex="-1" aria-disabled="true">Disabled</a>
</li>
</ul>
<div class="tab-pane fade" id="ingredientes" role="tabpanel" aria-labelledby="ingredientes-tab">
</div>
Vamos a desplegar la imagen del platillo en una ventana de mensaje.
Debemos actualizar los datos de la receta.
Crearemos los archivos del patrón de diseño MVC tomándo como base los anteriores ejercicios.
"SELECT r.* ";
"FROM recetas r ";
"LEFT JOIN menu m ON r.id = m.idPlatillo ";
"WHERE m.idPlatillo IS NULL ORDER BY r.nombre";
Realizaremos el proceso de validación utilizando el método de alta de objetos anteriores.
Primero verificaremos los datos.
Después insertamos el registro.
Crearemos los archivos del Controlador, el modelo y las dos vistas base.
Adecuaremos el método de la tabla.
Realizaremos el proceso de validación e inserción utilizando el método de alta anterior.
Aprovecharemos la vista de “Alta” para modificar.
Necesitamos un método para “armar” la vista.
Crearemos los archivos del Controlador, el modelo y las dos vistas base.
Adecuaremos el método de la tabla.
Aprovecharemos la vista de “Alta” para modificar.
Necesitamos un método para “armar” la vista.
Realizaremos la inserción del registro y su modificación.
Crearemos los archivos del patrón de diseño MVC tomándo como base los anteriores ejercicios.
CREATE TABLE `ventas` (
`id` int(11) NOT NULL,
`idCliente` int(11) NOT NULL,
`idMesero` int(11) NOT NULL,
`idMesa` int(11) NOT NULL,
`idPromocion` int(11) NOT NULL,
`fecha` datetime NOT NULL,
`monto` decimal(10,2) NOT NULL,
`propina` decimal(10,2) NOT NULL,
`comensales` tinyint(4) NOT NULL,
`estado` tinyint(4) NOT NULL,
`baja` int(11) NOT NULL,
`alta_dt` datetime NOT NULL,
`baja_dt` datetime NOT NULL,
`cambio_dt` datetime NOT NULL
)
Realizaremos el proceso de validación utilizando el método de alta de objetos anteriores.
Realizaremos el proceso de validación utilizando el método de alta de objetos anteriores.
Realizaremos el proceso de validación utilizando el método de alta de objetos anteriores.
Crearemos un renglón de totales en la tabla de detalles.
UPDATE ventas AS v INNER JOIN (SELECT idVenta, SUM(cantidad*precio) AS suma_total_cantidad FROM ventas_detalle GROUP BY idVenta AS ventas_detalle ON v.id = ventas_detalle.idVenta SET v.monto = ventas_detalle.suma_total_cantidad;
return $this->db->queryNoSelect($sql);
}
Borraremos físicamente el registro del detalle y recalcularemos la comanda.
Borraremos físicamente el registro del detalle y recalcularemos la comanda.
Realizaremos el proceso de validación y modificación utilizando el método de alta anterior.
Necesitamos capturar la propina y calcular el impuesto.
Crearemos la vista de la comanda en una sola vista para capturar la propina y aplicar la promoción, si procede.
Después de actualizar, preguntaremos al usuario si desea facturar.
Después de actualizar, preguntaremos al usuario si desea facturar.
Utilizaremos la librería gratuita FPDF.
Crearemos una clase Imprimir para construir el documento.
Preparemos los datos restantes: cliente, venta y cantidades.
Por medio de los comandos de FPDF como:
Por medio de los comandos de FPDF como:
Cell(float w [, float h [, string txt [, mixed border [, int ln [, string align [, boolean fill [, mixed link]]]]]]])
iconv en PHP es una función que convierte cadenas de texto entre diferentes codificaciones de caracteres, como de UTF-8 a ISO-8859-1.
Por medio de los comandos de FPDF como:
Cell(float w [, float h [, string txt [, mixed border [, int ln [, string align [, boolean fill [, mixed link]]]]]]])
iconv en PHP es una función que convierte cadenas de texto entre diferentes codificaciones de caracteres, como de UTF-8 a ISO-8859-1.
Necesitamos cambiar el estatus de la venta para no volver a facturar.
La integridad referencial es propiedad de la base de datos. La misma significa que la clave externa de una tabla de referencia siempre debe aludir a una fila válida de la tabla a la que se haga referencia. La integridad referencial garantiza que la relación entre dos tablas permanezca sincronizada durante las operaciones de actualización y eliminación. (Wikipedia)
La integridad referencial es propiedad de la base de datos. La misma significa que la clave externa de una tabla de referencia siempre debe aludir a una fila válida de la tabla a la que se haga referencia. La integridad referencial garantiza que la relación entre dos tablas permanezca sincronizada durante las operaciones de actualización y eliminación. (Wikipedia)
La integridad referencial es propiedad de la base de datos. La misma significa que la clave externa de una tabla de referencia siempre debe aludir a una fila válida de la tabla a la que se haga referencia. La integridad referencial garantiza que la relación entre dos tablas permanezca sincronizada durante las operaciones de actualización y eliminación. (Wikipedia)
La integridad referencial es propiedad de la base de datos. La misma significa que la clave externa de una tabla de referencia siempre debe aludir a una fila válida de la tabla a la que se haga referencia. La integridad referencial garantiza que la relación entre dos tablas permanezca sincronizada durante las operaciones de actualización y eliminación. (Wikipedia)
Los administradores pueden respaldar la base de datos.
Preparar la vista “mensaje” para mandar dos botones.
Crear en Tablero el método para desplegar el mensaje con dos opciones.
Crear en Tablero el método “respaldarEjecutar()”.
Crear en el Modelo los métodos getTablas() y respaldarTabla().
Crear en MySQL dos métodos: queryCrudo() y getBaseDatos().
Los administradores pueden respaldar la base de datos.
Preparar la vista “mensaje” para mandar dos botones.
Crear en Tablero el método para desplegar el mensaje con dos opciones.
Crear en Tablero el método “respaldarEjecutar()”.
Crear en el Modelo los métodos getTablas() y respaldarTabla().
Crear en MySQL dos métodos: queryCrudo() y getBaseDatos().
Cualquier usuario podrá modificar sus datos y su clave de acceso.
Cualquier usuario podrá modificar sus datos y su clave de acceso.
Necesitamos crear el tablero especial para los operadores.
Añadiremos una imagen de fondo
Por medio de las herramientas de Bootstrap podemos hacer un menú responsivo.
Por medio de diferentes herramientas podemos comprimir nuestro código (opcional) para subirlo a producción.
En esta clase podrás obtener todos los archivos del curso.
Conocer los aspectos básicos de PHP y su instalación.
Crear la estructura Modelo, Vista y Controlador para construir la tienda virtual con PHP y MySQL.
Crear el controlador, el modelo y las vistas necesarias para permitir el acceso de los usuarios al sistema.
Crear el menú, controlador, modelo y las vistas necesarias para: el tablero, las cuentas, los movimientos.
Manejo de imágenes y paginación de consultas muy largas.
Una aplicación que es muy recurrente en Internet es el desarrollo de una aplicación para el control de un restaurante. Esta aplicación nos sirve para utilizar lenguajes del lado del cliente, como JavaScript y lenguajes del lado del servidor como PHP, así como conectarlo con bases de datos, en este caso como MySQL, herramientas que son las más utilizadas en la Web. En este curso construiremos las páginas web por medio de Bootstrap 5.3. lo cual nos permitirá tener una aplicación responsiva.
Partiremos desde una página completamente en blanco hasta concluir la parte del usuario (front-end) y la parte del administrador (back-end). Los objetivos del presente curso son:
Conocer los aspectos básicos de PHP y su instalación.
Crear la estructura Modelo, Vista y Controlador para construir la tienda virtual con PHP y MySQL.
Crear el controlador, el modelo y las vistas necesarias para permitir el acceso de los usuarios al sistema.
Crear el menú, controlador, modelo y las vistas necesarias para: el tablero, las cuentas, los movimientos.
Manejo de imágenes y paginación de consultas muy largas
Este curso intermedio, por lo que usted debe tener las bases de programación en Bootstrap, PHP, JavaScript y MySQL, aunque no debe de ser experto en ellos. Es una buena oportunidad para poner en práctica sus conocimientos. Usted debe de contar con una instalación de Apache-PHP-MySQL, como XAMPP, MAMP o WAMP.
Al final del curso contarás con todos los archivos del curso y los esquemas de la base de datos.