View Full Version : [php/mysql] Organizzare categorie e sottocategorie
frizzo28
28-10-2008, 11:30
Visto che un'esempio vale piu' di mille parole vi posto subito un immaggine:
http://img521.imageshack.us/img521/3828/screenshotjb2.th.jpg (http://img521.imageshack.us/my.php?image=screenshotjb2.jpg)http://img521.imageshack.us/images/thpix.gif (http://g.imageshack.us/thpix.php)
Sulla destra vedete la tabella SQL sulla sinistra il risultato che vorrei ottenere tramite il PHP. Praticamente stampare a video quella tabella come una serie di liste nidificate( UL,LI ).
Il mio problema e' proprio a livello di algoritmo non riesco a trovare un modo per gestire correttamente categorie e sottocategorie...
Avete qualche idea?
p.s La tabella che vedete nell'immaggine e' cosi' organizzata
id_cat=Id della categoria univoco
nome=Il nome della categoria/sottogategoria
id_principale=Settato a 0 se e' un categoria principale altrimenti settato al valore dalla categoria "padre"...
grazie
ciao
mi sono imbattuto in una situazione simile alla tua, se non identica e ho risolto creando prima un array contenente tutti i dati:
while ($row = $stmt->fetch())
{
if ($row['id_principale'] == 0)
{
$db_data[$row['nome']] = array();
$db_data[$row['nome']]['desc'] = $row['desc'];
$db_data[$row['nome']]['link'] = $row['link'];
$db_data[$row['nome']]['selected'] = ($item == $row['nome']) ? 1 : 0;
$db_data[$row['nome']]['subs'] = array();
}
else
{
if (array_key_exists($row['id_principale'], $db_data))
{
$db_data[$row['id_principale']]['subs'][$row['nome']] = array();
$db_data[$row['id_principale']]['subs'][$row['nome']]['desc'] = $row['desc'];
$db_data[$row['id_principale']]['subs'][$row['nome']]['link'] = $row['link'];
$db_data[$row['id_principale']]['subs'][$row['nome']]['selected'] = ($item == $row['nome']) ? 1 : 0;
}
}
}
a questo punto ti è più comodo, visto che se un padre ha dei figli te li ritrovi nell'array subs.
se hai domande chiedi pure.
edit: però ho visto solo ora che tu hai più livelli, io ne avevo solo due...vedi se riesci a riadattare il codice =)
frizzo28
28-10-2008, 13:14
@vizz ti ringrazio ma in effetti il codice che hai postato e' per solo 2 livelli invecie io dovrei gestirne N di livelli...
Scritto adesso:
<?
function output_categorie($id_principale)
{
$sql = "SELECT * FROM categorie WHERE id_principale = '$id_principale'";
$res = mysql_query($sql);
echo "<ul>";
while ($row = mysql_fetch_assoc($res))
{
echo "<li>";
echo $row['nome'];
//Stampa sottocategorie
output_categorie($row['id_cat']);
echo "</li>";
}
echo "</ul>";
}
output_categorie(0);
?>
Se vuoi fare in modo che si espandano (cioè siano visibili le sottocategorie) solo quando sono selezionate, beh, è un po' più complicato.
frizzo28
28-10-2008, 17:44
La tua soluzione funzione alla grande ecco come l'ho modificata per visualizzare solo una categoria e/o sottocategoria e tutte le sue sottocategorie quando ci si clicca...
principale.php
<?
require "connect.php";
function output_categorie($id_principale)
{
$sql = "SELECT * FROM downcat WHERE id_principale = \"$id_principale\"";
$res = mysql_query($sql);
echo "<ul>";
while ($row = mysql_fetch_assoc($res))
{
echo "<li>";
echo "<a href=apricat.php?id=".$row['id_cat'].">".$row['nome']."</a>";
//Stampa sottocategorie
output_categorie($row['id_cat']);
echo "</li>";
}
echo "</ul>";
}
output_categorie(0);
?>
e poi apricat.php
<?
require "connect.php";
function output_categorie($id_principale)
{
$sql = "SELECT * FROM downcat WHERE id_principale = \"$id_principale\"";
$res = mysql_query($sql);
echo "<ul>";
while ($row = mysql_fetch_assoc($res))
{
echo "<li>";
echo "<a href=apricat.php?".$row['id_cat'].">".$row['nome']."</a>";
//Stampa sottocategorie
output_categorie($row['id_cat']);
echo "</li>";
}
echo "</ul>";
}
if(isset($_GET['id'])){
$id=$_GET['id'];
$sql = "SELECT * FROM downcat WHERE id_cat = \"$id\"";
$res = mysql_query($sql);
echo "<ul>";
while ($row = mysql_fetch_assoc($res))
{
echo "<li>";
echo "<a href=apricat.php?".$row['id_cat'].">".$row['nome']."</a>";
echo "</li>";}
output_categorie($id);
echo "</ul>";
}
else output_categorie(0);
?>
grazie
ciao :)
amadeusorrento
28-01-2009, 19:16
Scritto adesso:
<?
function output_categorie($id_principale)
{
$sql = "SELECT * FROM categorie WHERE id_principale = '$id_principale'";
$res = mysql_query($sql);
echo "<ul>";
while ($row = mysql_fetch_assoc($res))
{
echo "<li>";
echo $row['nome'];
//Stampa sottocategorie
output_categorie($row['id_cat']);
echo "</li>";
}
echo "</ul>";
}
output_categorie(0);
?>
Se vuoi fare in modo che si espandano (cioè siano visibili le sottocategorie) solo quando sono selezionate, beh, è un po' più complicato.
Ciao..sto leggendo questo post...e quello che devo fare è proprio questo...fare in modo che le categorie si espandono solo se cliccate...qualcuno mi sa aiutare??
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.