Menu UL/LI structuur

Door Kees Schepers, 15 jaar geleden, 4.804x bekeken

Dit is een klasse die ik gisteren heb ontwikkelt voor een klant van mij. Wellicht kunnen jullie er wat mee. Het is een klasse bedoelt om een menu te maken, maar is nog niet helemaal "af" in functionaliteiten, er zit nog niet zoveel in.

Ik post de class omdat ik het "OOP" niveau hier mager vind, en ik denk dat ik hier wel toegevoegde waarde voor kan bieden. Ik ben overigens ook niet perfect dus wellicht zijn er andere mensen die tips voor me hebben :)

Voorbeeldcode:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
  $menu
= new Site_Menu('nav');
  $menu->addItem(new Site_Menu_Item('test 1','http://www.google.nl','root'));
  $menu->addItem(new Site_Menu_Item('test 1','http://www.google.nl','root'));
  $menu->addItem(new Site_Menu_Item('test 3','http://www.google.nl','test 1'));  
echo $menu->getHTML();
?>


Dat stukje code genereert dus een UL/LI structuur. Met voldoende CSS kun je hier dus een in en -uitklap menu van maken.

Voorbeeld: http://bmvv.webautomatisering.nl

Gesponsorde koppelingen

PHP script bestanden

  1. menu-ulli-structuur

 

Er zijn 21 reacties op 'Menu ulli structuur'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
PHP erik
PHP erik
15 jaar geleden
 
0 +1 -0 -1
Wederom mijn complimenten kees (:
Jelmer -
Jelmer -
15 jaar geleden
 
0 +1 -0 -1
Leuk voorbeeld inderdaad. Misschien was het leuk geweest om de Site_Menu_Item's zichzelf te laten tekenen. Dan zou je ook andere dingen dan menu-items kunnen toevoegen, of aparte menu-items bijvoorbeeld buttons, of links die een onclick-element gebruiken.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<a '.(!is_null($item->class) ? 'class="'.$item->class.'"' : '').' href="'.$item->href.'" title="'.$item->title.'">'.$item->title.'</a>';

vervangen met
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$item->draw()

en draw() in Site_Menu_Item implementeren. Eventueel een leuke interface erbij maken die draw() verplicht stelt.

Waarom heb je eigelijk __get & __set gebruikt?
Kumkwat Trender
Kumkwat Trender
15 jaar geleden
 
0 +1 -0 -1
Yo kees,
zo'n menu zocht ik al. Bedankt :P

alleen een vraagje
kun je de onderkant van de menu zeg maar rond krijgen, want nu heb je normaal vierkant wanneer je het menu open hebt.

vb: http://h1.ripway.com/phphulp123/test.htm

ik hoop dat je snapt wat ik bedoel :)
Peter
Robert Deiman
Robert Deiman
15 jaar geleden
 
0 +1 -0 -1
Leuk scriptje goed gedaan.

Voorbeeld is ook leuk, maar toch een maar -> Wanneer een menu-item 2 regels beslaat, dan moet je via de "bovenste regel" naar rechts toe (bij een sub-item). Zogauw ik vanaf de onderste regel, schuin naar het submenu item ga, klapt het menu al dicht. -> Misschien een vertraging van een halve seconde inbouwen om dit op te lossen?
Kees Schepers
kees Schepers
15 jaar geleden
 
0 +1 -0 -1
@peter:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
$item
= new Site_Menu_Item('&nbsp;','','root');
$item->class = 'bottom';
$menu->addItem($item);
?>

CSS:
li.bottom {
background-image:url('bottom.gif');
}

Zoiets zou wel moeten werken :)

@robert

Dan komt er javascript van te pas en dit menu is CSS (javascript slechts voor IE6 maar niet 100% nog), maar is wel goede kritiek, ik ga kijken of ik er iets aan kan doen.


@Jelmer:
Van jouw had ik op z'n minst een reactie verwacht :p maar ik weet dat jij wat verder bent en dat is leuk!

Je idee is goed alleen heb ik het overwogen om het niet te doen vanwege de recursie. Je kunt namelijk heel makkelijk zeggen $item->getHTML(); maar die tekent de complete <li></li> dus als het element childs bevat gaat het niet op.

Wellicht $item->addChild($childItem); en DOM structuur toepassen :)

Ik heb de __get en __set gebruikt omdat ik deze makkelijk vind en in PHP zit. Vaak gebruik ik deze magic functions ook bij property classes.
Kumkwat Trender
Kumkwat Trender
15 jaar geleden
 
0 +1 -0 -1
ik krijg een error.
http://h1.ripway.com/phphulp123/test.php ??

ik heb het script letterlijk overgenomen en dan heb ik eerst
de grootste php script als eerst geplaatst dan css dan dat enne kleine, of moest het anders?
Kees Schepers
kees Schepers
15 jaar geleden
 
0 +1 -0 -1
Stuur broncode op via prive bericht of hier, dan kijk ik wel even voor je :)
Kumkwat Trender
Kumkwat Trender
15 jaar geleden
 
0 +1 -0 -1
is gewoon de code die jij boven hebt aangegeven, ik pm het wel
Jelmer -
Jelmer -
15 jaar geleden
 
0 +1 -0 -1
Peter, dat komt omdat jij nog PHP versie 4 gebruikt, en classes zoals deze alleen in PHP 5 of hoger werken. Je kan proberen alle public/private/protected weg te halen, en bij de variabelen in het begin 'var' te gebruiken.

Echter werken exceptions ook pas sinds versie 5, dus die zal je er ook uit moeten slopen.
Frank -
Frank -
15 jaar geleden
 
0 +1 -0 -1
Kortom, ga upgraden naar PHP versie 5. Binnenkort wordt 4 ook niet meer ondersteund, het heeft weinig zin om daar dan nog tijd in te gaan steken.
Wessel Johnson
Wessel Johnson
15 jaar geleden
 
0 +1 -0 -1
Leuk gedaan, mijn complimenten.
Pim Vernooij
Pim Vernooij
15 jaar geleden
 
0 +1 -0 -1
Leuk script, maar waarom maak je geen gebruik van DOMDocument? Dan word de boel in 1 klap een stuk schaalbaarder! Ik heb zelf op zo'n manier een Formulier generator gebouwd die tevens automatisch het formulier valideerd etc. Mijn DOM Form generator is ongeveer 7x zo snel (in php parse tijd) dan FormHandler, welke gebruikt maakt van de methode die jij ook gebruikt ($html .= " class="... etc).

En inderdaad; het OO niveau hier op PHPHulp is nogal karig...
Kees Schepers
kees Schepers
15 jaar geleden
 
0 +1 -0 -1
@Pim Vermooij:

Been there, done that. Heb wel eens een hele applicatie proberen draaiend te krijgen op PHP DOM (zie ook wat andere classes die ik gepost heb)

Iedere keer als ik een bepaald probleem had of vast zat kwam ik uit op de bug pages van PHP.net!! En uiteindelijk tot de conclusie gekomen dat destijds (ruim half jaar terug) PHP DOM nog bagger in elkaar zat.

Oplossing was toen ook DOM zelf te herschrijven met de interfaces die W3 beschikbaar heeft, maar is een beetje veel werk ;)

Overigens denk ik wel dat het gebruiken van DOM voor dit wel schaalbaar is :) alleen DOM is heel irritant met entities.
PHP Newbie
PHP Newbie
15 jaar geleden
 
0 +1 -0 -1
@Pim

Zou je die dan niet met ons willen delen?
Jelmer -
Jelmer -
15 jaar geleden
 
0 +1 -0 -1
Sommige scripts die je voor bijvoorbeeld websites van bedrijven maakt wil je niet altijd delen ;)

Het nadeel van DOM is dat je ook DOM als invoer moet geven dan, of je moet rekening gaan houden met 2 verschillende soorten invoer. Daarnaast vraag ik me af of DOM sneller is doordat je geen string-operaties hebt, of dat Pim z'n Form-klasse sneller is dan FormHandler doordat het niet tig verschillende bestanden hoeft in te laden.

Daarnaast OOP & DOM op PHPhulp, niet te veel in 1 klap willen he ;)

Ow, je docComments kloppen overigens niet helemaal meer volgens mij. En als je ook nog even een @return erbij vermeldt, dan is mijn IDE (PDT/Zend Studio etc.) ook weer blij en gaat hij die voortaan automatisch aanvullen. Dat zou dit voorbeeld helemaal compleet maken. Oja, en nog even en om je CSS zetten.

Ik herinner me net een script van een tijdje geleden. Dit menu doet ongeveer hetzelfde, maar is dan niet object georiƫnteerd. Misschien leuk voor anderen om dat met deze te vergelijken.
Kees Schepers
kees Schepers
15 jaar geleden
 
0 +1 -0 -1
Heey Jelmer, bedankt voor je comments!

Ik heb de comments aangepast, en heb ook meteen members e.t.c. commented, hopelijk is het duidelijker nu :)

Lang leve Zend studio he ;-)
Pim Vernooij
Pim Vernooij
15 jaar geleden
 
0 +1 -0 -1
ZDE Owned inderdaad :D

Ik heb redelijk vaak met DOMDocument gewerkt en ben eigenlijk nog maar weinig problemen tegen gekomen wat betreft entities. Gewoon zorgen dat je alles met UTF-8 doet.

@PHP Newbie: ik zal er eens over denken, heb alles wel gedocumenteerd etc (voor zend), maar een mogelijkheid om custom masks toe te voegen zit er nog niet in. Nog niet zo heel bruikbaar dus als je 'andere' formulieren dan de standaard variant wil genereren...

Toevallig heb ik deze middag vrij, dus ga ik daar maar eens mee aan de slag :) Wie weet staat het pakket hier binnenkort wel ergens online ;)

Een voorproefje kan ik al wel geven:
http://dev.ysimo.net/sandbox/Form/
http://dev.ysimo.net/sandbox/Form/?highlight

Zit ook javascript validatie bij etc, maar dat zit nog niet in het voorbeeld; dat is al vrij oud...
Kees Schepers
kees Schepers
15 jaar geleden
 
0 +1 -0 -1
Heeft iemand trouwens het niveau en de categorie gewijzigd ? (een mod) want ik zie dat hij nu op beginners staat, en had het op gevorden gezet. De code vind ik gevorderd, maar het gebruik is wellicht ook geschikt voor beginners :)
PHP erik
PHP erik
15 jaar geleden
 
0 +1 -0 -1
Blijkbaar. Ik heb het nu terug veranderd naar Gevorderd. Dit is geen beginnerscript.
Kees Schepers
kees Schepers
15 jaar geleden
 
0 +1 -0 -1
Bumpen lijkt me niet echt nodig? Niet ik die code wel zou willen zien maar je kunt beter een prive bericht sturen naar Pim dan hier veel posts zetten die hij wellicht toch niet leest :)
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Jord
Jord
15 jaar geleden
 
0 +1 -0 -1
Ik heb hetzelfde probleem als peter :S
Ik hoop dat je het bij hem op het kunnen lossen
alvast bedankt !

Om te reageren heb je een account nodig en je moet ingelogd zijn.

Inhoudsopgave

  1. menu-ulli-structuur

Labels

  • Geen tags toegevoegd.

Navigatie

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.