Kai Harrekilde-Petersen skrev:
> Jeg har sådan set selv løst mit problem, men jeg kunne godt tænke mig
> at høre om alternative forslag til hvordan andre ville løse samme
> generelle problem.
>
> Jeg koder pt en hjemmeside, hvor jeg har en hierarkist menustruktur.
> Her har jeg naturligt et behov for at kunne have et variabelt antal
> under-punkter/menuer til et givent menupunkt.
>
> Jeg havde oprindelig tænkt mig at implementere menu-hierarkiet som en
> MySQL tabel, men det virker på mig som om SQL ikke tillader et
> variabelt antal kolonner i en tabel. Min egen løsning er at lave
> hierarkiet med et array i PHP, hvilket løser problemet ret direkte:
> $menu[0] = array("0" => 0,
> "1" => "DMC",
> "2" => "Kurser",
> "3" => "Sikkerhed",
> "4" => "Sponsorer",
> "5" => "Anmeldelser",
> "6" => "Kontakt",
> "7" => "Links");
> $menu[1] = array("1" => 0,
> "1.1" => "Om instruktørerne",
> "1.2" => "Instruktørliste");
> $menu[2] = array("2" => 0,
> "2.1" => "Generelt",
> "2.2" => "BRONZE-kursus",
> "2.3" => "GULD-kursus",
> "2.4" => "Tilmelding",
> "2.5" => "Priser & betaling",
> "2.6" => "Kursus oversigt",
> "2.7" => "Forsikring");
> ...
>
> Og så videre. En smule kode senere har jeg så et menusystem, hvor
> jeg kan vandre op/ned i hierarkiet. Resultatet (+ en del ekstra) kan
> ses her:
>
http://dmc-kursus.harrekilde.dk/
>
> Hvad ville være den "indlysende" måde at løse de samme vha en MySQL
> tabel istedet for at kode sig ud af det i PHP som jeg har gjort?
>
> Mit umiddelbare gæt er at man er nødt til at have nogle parent-id's
> som man så søger efter og så bruger til at hægte det sammen med (går
> ud fra det er "standard måden" at lave en webshop på)
>
> Hvordan ville du have løst det?
>
>
> Kai
også lige lidt kode også :)
Bygger på samme database struktur som de andre
class Menu
{
public function getMenu($parent=0,$asNested=true,$id=false) {
$select = array('g.id AS id','g.name AS name','g.parent_id AS parent');
$from = array('groups AS g');
$where = array();
if($id!==false) {
$where[] = 'g.id = "'.$id.'"';
} else {
if ($parent === null || $parent == 0) {
$where[] = 'g.parent_id IS NULL OR g.parent_id = "0"';
} else {
$where[] = 'g.parent_id = "'.$parent.'"';
}
}
$lists = $this->db->b_fetchobject($select,$from,$where,'g.sorter');
// En lille database klasse jeg bruger, som looper hele det hele igennem
// og kaster et array retur
if($asNested) {
foreach ($lists AS $key => $list) {
$lists[$key]['childs']=$this->getMenu($list['id'],$asNested,false);
}
}
return $lists;
}
}
Bruges
$obj = new Menu;
$menu = $obj->getMenu();
// Udgiver hele arrayet over menuen
$menu = $obj->getMenu(0,false);
// Udgiver hele menuen, dog kun fra dem som har 0 i parent_id og det
bliver ikke nested array
$menu = $obj->getMenu(0,true,20);
// Udgiver arrayet fra ID 20, og bliver nested