Bueno, antes de nada, gracias por ayudarme con el problemilla.
Para que quede claro, lo que intento es filtrar los productos según categoría, es decir, que cuando cargue la página por primera vez se muestren todos los productos sin filtrar, y cuando cambie de categoría en el "combo", cargue de nuevo los productos, pero solo los de esa categoría (salvo que vuelva a seleccionar la opción por defecto).
Yo he creído que lo mejor sería con Json, pero desconozco si habrá alguna otra forma mas sencilla o recomendable.
En cualquier caso, pongo como tengo todo escrito:
- Página principal:
Código PHP:
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Ejercício</title>
<script type="text/javascript" src="../js/jquery.js"></script>
<script type="text/javascript" src="js.js"></script>
<?php include "clases.php"; ?>
</head>
<body>
<div>
<select name="filtro" id="filtro">
<option value="0" >Categoría</option>
<option value="1" >Calzado</option>
<option value="2" >Ropa</option>
<option value="3" >Accesorios</option>
</select>
</div>
<div name="productos" id="productos">
<?php
$lista = new listado_productos();
echo $lista -> mostrar();
?>
</div>
</body>
</html>
- clases.php:
Código PHP:
<?php
class listado_productos{
private $productos = array();
public function __construct() {
$this -> productos[] = array(1,"Zapato",1);
$this -> productos[] = array(2,"Zapatilla",1);
$this -> productos[] = array(3,"Bota",1);
$this -> productos[] = array(4,"Falda",2);
$this -> productos[] = array(5,"Pantalón",2);
$this -> productos[] = array(6,"Camisa",2);
$this -> productos[] = array(7,"Bolso",3);
$this -> productos[] = array(8,"Pulsera",3);
}
function mostrar($categoria = 0){
$lista = "";
if ($categoria==0){
for($i = 0 ; $i < count($this -> productos[0]) ; $i++){
$lista .= "<li>".$this -> productos[$i][1]."</li>";
}
return "<ul>".$lista."</ul>";
}
else{
for($i = 0 ; $i < count($this -> productos[0]) ; $i++){
if ($categoria == $this -> productos[$i][2]){
$lista .= "<li>".$this -> productos[$i][1]."</li>";
}
}
return "<ul>".$lista."</ul>";
}
}
}
?>
- js.js:
Código HTML:
$(document).ready(function(){
$("#sFiltro").change(function(){
$("#dCarrito").hide();
$.post("ajax.php?cat=algo",{ cat:$("#sFiltro").val()},function(datos){
alert("datos");
},"json");
});
});
- ajax.php:
Código PHP:
<?php
include "clases.php";
$vr = $_GET["lista"];
$categoria = $_POST["categoria"];
switch ($vr){
case "filtro":
$filtro = new listado_productos();
$filtrado = $filtro -> mostrar($categoria);
echo json_encode($filtrado);
break;
}
?>
Tal como está, la primera vez me carga los datos mas o menos bien, salvo por que me he dado cuenta de que no recorre todas las filas del array bidimensional, si no solo las 3 primeras. Se debe a que "
count($this -> productos[0])" me da un valor de 3, que es el nº de "columnas" no de filas, he probado con "
count($this -> productos[])" o "
count($this -> productos)", y me salta error, pero bueno, es algo secundario.
El tema está en que cuando cambio de opción en el combo, me pasa bien los parámetros y el POST al
ajax.php, pero no vuelve a la página principal.
En el
firebug me pone en la pestaña de respuesta:
Código:
"<ul><li>Zapato<\/li><li>Zapatilla<\/li><li>Bota<\/li><\/ul>"
pero no aparece la pestaña de JSON que aparece cuando todo está OK.