/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
Variabelt antal koloner i MySQL til menusy~
Fra : Kai Harrekilde-Peter~


Dato : 02-01-09 23:49

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
--
Kai Harrekilde-Petersen <khp(at)harrekilde(dot)dk>

 
 
Dan Storm (03-01-2009)
Kommentar
Fra : Dan Storm


Dato : 03-01-09 00:10

Kai Harrekilde-Petersen skrev:
> Hvordan ville du have løst det?

Jeg ville have benyttet mig af en mysql tabel, der så nogenlunde sådan ud:

page_id | title | url | sub_id


Så ville man f.eks. have forsiden:

1 | Forsiden | index.php | 0

Og nogle undersider til forsiden:

2 | Portfolio | portfolio.php | 1
3 | Kontakt mig | kontakt.php | 1
4 | Anden underside | underside.php | 1

Så vil forsiden med sub_id = 0 være det øverste element og alle siderne
med sub_id = 1 være undermenu punkt til page_id = 1

Ganske simpelt eksempel, men grundideen er der.
Min struktur har samme princip, dog bruger jeg nogle flags til at
aktivere visning i menuen eller sortering og andre ting, som kan være
relevant for min side.



--
Dan Storm - storm at err0r dot dk / http://err0r.dk

Tro ikke brugerne vil gøre noget for at undgå dit killfilter
- Så vigtig er du heller ikke!

Leif Neland (05-01-2009)
Kommentar
Fra : Leif Neland


Dato : 05-01-09 07:04

Dan Storm skrev:
> Kai Harrekilde-Petersen skrev:
>> Hvordan ville du have løst det?
>
> Jeg ville have benyttet mig af en mysql tabel, der så nogenlunde sådan ud:
>
> page_id | title | url | sub_id
>
>
Jeg ville blot kalde det parent_id, det lyder mere forklarende. (for mig
ihvertfald)

Leif

Philip Nunnegaard (03-01-2009)
Kommentar
Fra : Philip Nunnegaard


Dato : 03-01-09 06:22

"Kai Harrekilde-Petersen" <khp@harrekilde.dk> skrev

> Hvordan ville du have løst det?

Min metode ligger ret tæt op ad Dan Storms:

id | ref_id | tekst | titeltekst | url | sortering | adgang

id: Det felt som man jo altid har i en tabel
ref_id: Reference-id - dvs. er ref_id=0, er det en hovedmenu, mens
underpunkterne så har det id-nummer som punktet referer til i hovedmenuen.
tekst: Det der står i menuen
titeltekst: En lille forklarende bobletekst, der kan dukke op når musen
holdes hen over menupunktet
url: Siger sig selv; Hvilken side skal man komme ind på når man klikker på
punktet?
sortering: Den rækkefølge som jeg ønsker at menupunkterne skal forekomme i.
adgang: Angiver hvem der skal kunne komme til menupunktet; Alle, kun logget
ind eller kun administratorer/moderatorer.

Jeg har brugt en lignende fremgangsmåde til at strukturere debatfora i
træstruktur.
Første indlæg i hver tråd har ref_id=0, mens svar på hovedoplægget så har
ref_id=[noget_andet]. Disse svar kan så have andre svar under sig i et
uendeligt antal niveauer.

Tilbage til menuen: Også her giver strukturen mulighed for at man i
princippet kan have uendeligt mange niveauer, hvis man synes det er sjovt.
Jeg opererer dog kun med 2 niveauer.


Martin (03-01-2009)
Kommentar
Fra : Martin


Dato : 03-01-09 13:12

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 &amp; 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

Kai Harrekilde-Peter~ (04-01-2009)
Kommentar
Fra : Kai Harrekilde-Peter~


Dato : 04-01-09 18:53

Kai Harrekilde-Petersen <khp@harrekilde.dk> writes:

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

Takker for eksempler og indspark. Jeg skal senere have lavet noget
admin-login med username/password, så kan det være jeg vender tilbage
hvis jeg ikke forstår de ting som google støver op til mig :)


Kai
--
Kai Harrekilde-Petersen <khp(at)harrekilde(dot)dk>

Søg
Reklame
Statistik
Spørgsmål : 177580
Tips : 31968
Nyheder : 719565
Indlæg : 6409079
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste