En este momento estás viendo Tienda Online PHP y MySQL (MVC) desde cero

Tienda Online PHP y MySQL (MVC) desde cero

Materiales

Xampp.- https://www.apachefriends.org/es/index.html

Visual Studio Code.- https://code.visualstudio.com/

Crear urls amígables.

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

Crear el 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 crearemos un directorio Config.

Luego un archivo Config/Config.php
<?php
const BASE_URL = "http://localhost/ecommerce/";
const HOST = "localhost";
const USER = "root";
const PASS = "";
const DB = "carrito";
const CHARSET = "charset=utf8";
const TITLE = "SHOP";
const MONEDA = "USD";
const CLIENT_ID = "";
?>

Dentro del directorio Config una nueva subcarpeta APP

Config/App/Controller.php
<?php
class Controller{
    //esta linea no lo veras en el video es necesario para solucionar las advertencias
      protected $views, $model;
    //
    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();
        }
    }
}
 
?>

Crear el archivo Autoload.php

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

Crear el archivo Views.php

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;
    }
}
?>

Crear la conexion

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.

Dentro un nuevo archivo – 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 Directorio Models en la raíz.

Dentro un archivo HomeModel.php
<?php
class HomeModel extends Query{
 
    public function __construct()
    {
        parent::__construct();
    }

}
 
?>

Crear controlador Errors.php

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

Crear directorio Views en la raiz.

Luego puedes crear subdirectorios para separar las vistas
<!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>

Dentro del directorio Views crear index.php

Views/index.php – pagina principal

Descargar template

Esta entrada tiene 9 comentarios

  1. jean

    buenas estoy realizando el proyecto de la tienda en linea y no encuentro la segunda parte de la plantilla

  2. alberto

    Buenas tardes, disculpe.. falta el archivo Helpers.php , puede ser?

  3. Abraham

    Hermano que buen proyecto

  4. More33

    estoy aprendiendo tu modelo de programacion es ELEGANTE Y ORDENADO gracias poe el aporte angel

  5. Hernando Navarro

    Buenos días.
    Soy estudiante de análisis y programación de sistemas.
    e informes que se necesita la BD se solicite por facebook o instagram
    Solicito tu colaboración si puedes enviar la Base de Datos de programa:
    VidaInformatico /Tienda-online-PHP-mvc-y-Mysql
    Te agradezco tu ayuda…
    Atte

    1. angelsifuentes

      Hola, el link de descarga directa se encuentra en los comentarios de instagram

Responder a alberto Cancelar la respuesta