Hola que tal gente, estoy intentando crear un menú de filtros que permita al usuario filtrar los productos de una tienda por más de un parámetro a la vez si así lo quisiera, por ejemplo si el usuario se encuentra en la categoría de calzados y elige filtrar por el tipo de producto botas, pues mostraría todos los productos de calzado que sean botas, pero si también se le antoja filtrar por otro tipo de producto como por ejemplo tennis, pues en vez de mostrar solo los productos de calzado que sean tenis debería añadirse al filtro que existía anteriormente en este caso el de botas y mostrar botas y tenis. Pero no consigo lograr hacer esto, por eso les pido su ayuda con este código:
FORM
<form id="form-filter" name="form-filter">
<div class="form-wrapper small">
<div class="input-wrapper">
<button class="navbar-button form-label" type="button" id="product-btn">TIPO DE PRODUCTO <span class="form-span"><i class="fas fa-caret-down"></span></i></button>
<?php $tipoProductos = Utils::showTiposProductos(); ?>
<div class="product-wrapper" id="produc-category">
<?php while($tipo = $tipoProductos->fetch_object()): ?>
<label class="label-wrapper" for="<?=$tipo->nombre?>"><?=$tipo->nombre?>
<input class="checkbox" type="checkbox" name="id_tipo" id="<?=$tipo->nombre?>" value="<?=$tipo->id?>">
<span class="checkmark"></span>
</label>
<?php endwhile; ?>
</div>
</div>
</div>
</form>
Les explico brevemente con la función: Utils::showTiposProductos(); recojo todos los tipos de productos una categoría y luego itero con un ciclo while para generar un checkbox por cada tipo de producto que haya en una categoría. Con una función de js capturo el name y el value del/los input checkbox que estén checkeados y se los envió por GET a mi controlador.
CONTROLADOR
<?php
require_once 'models/Categoria.php';
require_once 'models/Producto.php';
class CategoriaController{
public function filtro(){
if (isset($_GET['id_tipo'])) {
$id_tipo = $_GET['id_tipo'];
$tipo = new Categoria();
$tipo->setId($id_tipo);
$tipo = $tipo->getOneType();
$producto = new Producto();
$producto->setTipo_id($id_tipo);
$productos = $producto->getAllType();
}
require_once 'views/categoria/ver.php';
}
}
De nuevo les explico brevemente, con if isset valido que lo que sea que le este llegando por GET exista, y luego le asigno ese valor a una variable que en este caso se llama $id_tipo, luego procedo a crear un objeto de la clase categoría y le asigno a setId el valor que hay en la variable $id_tipo después ejecuto el método del modelo Categoría.php:
getOneType();
public function getOneType(){
$tipo = $this->db->query("SELECT * FROM tipo_productos WHERE id = {$this->getId()}");
return $tipo->fetch_object();
}
Posteriormente creo un objeto de la clase producto y le asigno a setTipo_id el valor que hay en la variable $id_tipo, luego ejecuto el método del modelo Producto.php:
getAllType()
public function getAllType(){
$sql = "SELECT p.*, tp.nombre AS 'tiponombre' FROM productos p "
. "INNER JOIN tipo_productos tp ON tp.id = p.tipo_id "
. "WHERE p.tipo_id = {$this->getTipo_id()} "
. " ORDER BY id DESC";
$productos = $this->db->query($sql);
return $productos;
}
Finalmente cargo la vista ver.php la cual muestra los productos filtrados.
PD: ese no es todo el formulario completo es solo un fragmento existen mas input checkbox y tampoco es toda la lógica del controlador existen mas condicionales if isset.