En este momento estás viendo Pasos para desarrollar una Tienda Virtual – PHP 8 y MYSQl (MVC)

Pasos para desarrollar una Tienda Virtual – PHP 8 y MYSQl (MVC)

Compartir en

En esta sección encontraras los pasos para construir una Tienda Virtual desde cero.

Primero que nada comenzaremos crear la estructura del proyecto – tomando las primera partes del sistema de venta PHP.

Que aprenderás:

Trabajar con localStorage.
Enviar correos electrónicos.
Optimar códigos para reutilizar.
Búsquedas en tiempo real con Vanilla Javascript.
Paginación de Productos.
Implementar método de pago Paypal
etc.

Requisitos:

Ganas de Aprender.

Herramientas Necesarias:

Se necesita un servidor local.
Una base de datos.
Editor de texto.

Para este proyecto utilizaré Xampp que trae por defecto todo lo necesario, Servidor Apache, Base de Datos Maria DB.

Página oficial para descargar Xampp.
https://www.apachefriends.org/es/download.html

Como editor de texto utilizare Visual Studio Code

Página oficial para descargar.
https://code.visualstudio.com/

Estructura del Proyecto

Crear el archivo .htaccess en la raíz – Nos servirá para crear url amigables

.htaccess
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]

Crear al archivo de configuración en la raiz

index.php
<?php
require_once 'Config/Config.php';
$ruta = !empty($_GET['url']) ? $_GET['url'] : "home/index";
$array = explode("/", $ruta);
$controller = ucfirst($array[0]);
$metodo = "index";
$parametro = "";
if (!empty($array[1])) {
    if (!empty($array[1] != "")) {
        $metodo = $array[1];
    }
}
if (!empty($array[2])) {
    if (!empty($array[2] != "")) {
        for ($i = 2; $i < count($array); $i++) {
            $parametro .= $array[$i] . ",";
        }
        $parametro = trim($parametro, ",");
    }
}
require_once 'Config/App/Autoload.php';
require_once 'Config/Helpers.php';
$dirControllers = "Controllers/" . $controller . ".php";
if (file_exists($dirControllers)) {
    require_once $dirControllers;
    $controller = new $controller();
    if (method_exists($controller, $metodo)) {
        $controller->$metodo($parametro);
    } else {
        header('Location: '.BASE_URL.'errors');
    }
} else {
    header('Location: ' . BASE_URL . 'errors');
}
?>

En la raíz creamos el directorio Config

Definir Constantes

Config/config.php
<?php
const BASE_URL = "http://localhost/eccommerce/";
const HOST = "localhost";
const USER = "root";
const PASS = "";
const DB = "carrito";
const CHARSET = "charset=utf8";
const TITLE = "TIENDA ONLINE";
const MONEDA = "USD";
const CLIENT_ID = "";
?>

Dentro del directorio Config crearemos una sub carpeta App

Crear conexión Controller con Model y Views

Config/App/Controller.php
<?php
class Controller{
    public function __construct()
    {
        $this->views = new Views();
        $this->cargarModel();
    }
    public function cargarModel()
    {
        $model = get_class($this)."Model";
        $ruta = "Models/".$model.".php";
        if (file_exists($ruta)) {
            require_once $ruta;
            $this->model = new $model();
        }
    }
}

?>

Autoload para cargar las clases de forma automática

Config/App/Autoload.php
<?php
spl_autoload_register(function($class){
    if (file_exists("Config/App/".$class.".php")) {
        require_once "Config/App/" . $class . ".php";
    }
})
?>

Método para cargar la vista

Config/App/Views.php
<?php
class Views{

    public function getView($ruta, $vista, $data="")
    {
        if ($ruta == "home") {
            $vista = "Views/".$vista.".php";
        }else{
            $vista = "Views/".$ruta."/".$vista.".php";
        }
        require $vista;
    }
}
?>

Crear consultas preparadas

Config/App/Query.php
<?php
class Query extends Conexion{
    private $pdo, $con, $sql, $datos;
    public function __construct() {
        $this->pdo = new Conexion();
        $this->con = $this->pdo->conect();
    }
    public function select(string $sql)
    {
        $this->sql = $sql;
        $resul = $this->con->prepare($this->sql);
        $resul->execute();
        $data = $resul->fetch(PDO::FETCH_ASSOC);
        return $data;
    }
    public function selectAll(string $sql)
    {
        $this->sql = $sql;
        $resul = $this->con->prepare($this->sql);
        $resul->execute();
        $data = $resul->fetchAll(PDO::FETCH_ASSOC);
        return $data;
    }
    public function save(string $sql, array $datos)
    {
        $this->sql = $sql;
        $this->datos = $datos;
        $insert = $this->con->prepare($this->sql);
        $data = $insert->execute($this->datos);
        if ($data) {
            $res = 1;
        }else{
            $res = 0;
        }
        return $res;
    }
    public function insertar(string $sql, array $datos)
    {
        $this->sql = $sql;
        $this->datos = $datos;
        $insert = $this->con->prepare($this->sql);
        $data = $insert->execute($this->datos);
        if ($data) {
            $res = $this->con->lastInsertId();
        } else {
            $res = 0;
        }
        return $res;
    }
}
?>

Conexión a la base de datos

Config/App/Conexion.php
<?php
class Conexion{
    private $conect;
    public function __construct()
    {
        $pdo = "mysql:host=".HOST.";dbname=".DB.";".CHARSET;
        try {
            $this->conect = new PDO($pdo, USER, PASS);
            $this->conect->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        } catch (PDOException $e) {
            echo "Error en la conexion".$e->getMessage();
        }
    }
    public function conect()
    {
        return $this->conect;
    }
}

?>

Crear directorio Controllers en la raíz

crear nuevo controlador

Controllers/Home.php
<?php
class Home extends Controller
{
    public function __construct() {
        parent::__construct();
        session_start();
    }
    public function index()
    {
        $data['title'] = 'Pagina Principal';
        $this->views->getView('home', "index", $data);
    }
}

Crear modelo Home

Models/HomeModel.php
<?php
class HomeModel extends Query{

    public function __construct()
    {
        parent::__construct();
    }
}

?>

Controlador errors

Controllers/Errors.php
<?php
class Errors extends Controller
{
    public function __construct()
    {
        parent::__construct();
    }
    public function index()
    {
        $this->views->getView('errors', "index");
    }
}

Crear el directorio Views en la raíz

  • Dentro de ellos crear las sub-carpetas

Pagina de not found

errors/index.php
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title><?php echo TITLE . ' - Pagina no encontrada'; ?></title>
    <link rel="stylesheet" href="<?php echo BASE_URL; ?>assets/css/bootstrap.min.css">
</head>

<body class="d-flex h-100 text-center text-white bg-dark">

    <div class="cover-container d-flex w-100 h-100 p-3 mx-auto flex-column">

        <main class="px-3">
            <h1>Not Found.</h1>
            <p class="lead">La página que buscas no existe</p>
            <p class="lead">
                <a href="<?php echo BASE_URL; ?>" class="btn btn-lg btn-secondary fw-bold border-white bg-white text-dark"><?php echo TITLE; ?></a>
            </p>
        </main>
    </div>

</body>

</html>
3.3 3 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments