Navigation class
Ik ben na lange tijd maar weer is achter de PHP classes oefeningen gedoken.
Voor een nieuwe oefening dacht ik een navigatie menu te maken d.m.v. een Navigation class. Waar ik nu precies naar benieuwd ben, wat moet er zoal in en waar moet ik rekening mee houden. zijn er dingen die minimaal in een navigaton class moeten komen? ( denk hierbij aan de interface class ) etc...
alle tips zijn welkom :)
Offtopic:
ik post de vraag ook op andere fora dus wees niet verrast als je het tegenkomt, uiteraard zal ik het uiteindelijke resultaat overal neerzetten.
Gewijzigd op 04/11/2012 17:57:29 door Reshad F
Ik zou voorstellen dat jij eerst gaat nadenken. Waar kom jij op? Het moet immers jij zijn die het gaat leren, wij weten het al.
navigationInterface
setMenuItem(); //Menus opgeven vb Home, contact etc etc
getMenuItem(); // return de Menu items
display(); //de navigationMenu dispatchen naar het scherm
en aan de hand hiervan een navigation class bouwen
Gewijzigd op 04/11/2012 16:23:33 door Reshad F
EDIT: Beetje verkeerd begrepen, als dit alleen om het menu gaat kan dit er mee door. Je kan ook alles als een element zien.
Maar die posities horen helemaal niet in PHP thuis, dat doe je maar lekker client-side... :)
Gewijzigd op 04/11/2012 16:06:38 door Wouter J
en dan een object menu met een array als property. in deze array kunnen menuItems of submenu-objecten staan.
dan uiteraard de nodige setters/getters en een output functie
Code (php)
1
2
3
4
5
6
2
3
4
5
6
array menu -> item('home')
array submenu ->item('subitem1')
item('subitem2')
item('subitem3')
item('contact')
item('about')
array submenu ->item('subitem1')
item('subitem2')
item('subitem3')
item('contact')
item('about')
zoiets dus
Gewijzigd op 04/11/2012 16:07:51 door Frank Nietbelangrijk
@WouterJ bedoel je daarmee de links met de bijbehorende attributen?
Zie je een pattern ontstaan in de tekst hierboven? Wat kunnen die items en wat is allemaal een item? Heb je een mooiere naam voor een item? Is het een idee om hier een interface van te maken?
Tevens kun je ook wat verder denken: Je kunt het hele principe toepassen voor een complete HTML pagina.
Gewijzigd op 04/11/2012 16:20:32 door Wouter J
Maar als je het zo in PHP gooit (dus statisch), waarom niet gewoon direct in (statische) html?
dus
en dat deze dus in een array door alle waarde heen loopt in mijn class
hetgeen wat ik nu heb is het volgende:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<?php
class Navigation implements navigationInterface {
public $menu = null;
public $name = null;
public $klasse = null;
public function __construct($name, $klasse) {
$this->name = $name;
$this->klasse = $klasse;
}
public function getName() {
return $this->name;
}
public function getClass() {
return $this->klasse;
}
public function setMenuItem($items) {
$this->menuItem = $items;
}
public function getMenuItem() {
return $this->menuItem;
}
public function display() {
$menu = '<nav class="' . $this->getName() . '">';
$menu .= '<li><a class="' . $this->getClass() . '" href="index.php?page=' . $this->getMenuItem() . '.php">' . $this->getMenuItem() . '</a></li>';
$menu .= '</nav>';
return $menu;
}
}
?>
class Navigation implements navigationInterface {
public $menu = null;
public $name = null;
public $klasse = null;
public function __construct($name, $klasse) {
$this->name = $name;
$this->klasse = $klasse;
}
public function getName() {
return $this->name;
}
public function getClass() {
return $this->klasse;
}
public function setMenuItem($items) {
$this->menuItem = $items;
}
public function getMenuItem() {
return $this->menuItem;
}
public function display() {
$menu = '<nav class="' . $this->getName() . '">';
$menu .= '<li><a class="' . $this->getClass() . '" href="index.php?page=' . $this->getMenuItem() . '.php">' . $this->getMenuItem() . '</a></li>';
$menu .= '</nav>';
return $menu;
}
}
?>
Code (php)
Gewijzigd op 04/11/2012 17:29:39 door Reshad F
Want terwijl we nog helemaal niet klaar zijn met onze OO structuur heb jij al de code af!
zie
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
+-----------------------------+
|Interface navigationInterface|
|-----------------------------|
| setMenuItem($items); |
| getMenuItem(); |
| display(); |
+-----------------------------+
+-------------------+
|class Navigation |
|-------------------|
|+menu |
|+name |
|+klasse |
+-------------------+
|getName(); |
|getClass(); |
|setMenuItem(items);|
|getMenuItem(); |
|display(); |
+-------------------+
|Interface navigationInterface|
|-----------------------------|
| setMenuItem($items); |
| getMenuItem(); |
| display(); |
+-----------------------------+
+-------------------+
|class Navigation |
|-------------------|
|+menu |
|+name |
|+klasse |
+-------------------+
|getName(); |
|getClass(); |
|setMenuItem(items);|
|getMenuItem(); |
|display(); |
+-------------------+
Maar wat mis ik verder volgens jou? ( en in antwoord op jou voorlaatste reactie: ik wil het eerst werkend hebben met gewone menu zonder subitems) omdat ik de class nu nog zo klein en schoon mogelijk wil houden alleen maar om te oefenen. Uiteraard is het later nog uit te breiden.
Quote:
ik wil het eerst werkend hebben met gewone menu zonder subitems) omdat ik de class nu nog zo klein en schoon mogelijk wil houden alleen maar om te oefenen. Uiteraard is het later nog uit te breiden.
Als je OO bouwt moet je het altijd bouwen met het oog op de toekomst: Wat kan er in de toekomst veranderen en hoe maak ik het zo simpel mogelijk om die verandering toe te passen. Daarom moet je nu al gaan nadenken hoe het straks wordt.
Wat hier mis is dat de Navigatie klasse nu meerdere taken heeft => mag niet in OO. Vervolgens ga je hier maar uit van 1 menu item, richt je je blik niet op de toekomst en is je code veel te gespecialiseerd voor deze applicatie i.p.v. als een component die in elke applicatie kan werken.
Klein opzetje:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
<?php
$nav = new Navigation;
$nav_item = new Navigation_Item;
$nav_item->setLink('/home');
$nav_item->setText('Startpagina');
$nav->addItem($nav_item);
echo $nav->render();
?>
$nav = new Navigation;
$nav_item = new Navigation_Item;
$nav_item->setLink('/home');
$nav_item->setText('Startpagina');
$nav->addItem($nav_item);
echo $nav->render();
?>
( het benoemen, geven van css class namen etc scheiden van het creëren van menu items? )
@Raoul
het volgende heb ik nu.
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
$menu = new Navigation("Test", "mainmenu");
$menu->setMenuItem("home", "test");
echo $menu->display();
?>
$menu = new Navigation("Test", "mainmenu");
$menu->setMenuItem("home", "test");
echo $menu->display();
?>
en volgens mij denk ik nu wat WouterJ ook gelijk bedoelt, ( zie commentaar op WouterJ )
Je kunt dan een AnchorElement maken en een NavItem element. Elk NavItem kan via appendChild een nieuw NavItem bevatten, om zo subitems te maken, maar ook een Anchor element die vervolgens weer wat tekst kan bevatten of een nieuw element als een SpanElement.
Als laatst heb je dan een NavItem die de hele navigatie voorstelt en gebruik je een RendererInterface met daaronder HTMLRenderer en XMLRenderer of YamlRenderen of wat je maar wilt, die de uiteindelijke HTML code maakt.
Dit idee is gebaseerd op knpmenu, die ik vaak met het Symfony2 Framework (icm KnpMenuBundle) gebruik, maar dan nog wat verder gedacht.
Wat voorbeeldjes van dit idee: http://www.phphulp.nl/php/forum/topic/oop-forms/85477/#610520 en http://www.phphulp.nl/php/forum/topic/paginering-oop/84869/#605327
Het ziet er goed uit vooral pim's voorbeeldje wat ik wel snap ( kwa code ) en deels ook kwa werking.. maar de connectie met de appendChild enz zie ik er zo 1,2,3 niet in.
Reshad F op 04/11/2012 17:54:40:
@Raoul
het volgende heb ik nu.
@Raoul
het volgende heb ik nu.
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
$menu = new Navigation("Test", "mainmenu");
$menu->setMenuItem("home", "test");
echo $menu->display();
?>
$menu = new Navigation("Test", "mainmenu");
$menu->setMenuItem("home", "test");
echo $menu->display();
?>
Ja dus? Dat is nog steeds niet correct OO. Alles is een object in OOP, onthoud dat altijd goed.
In dit geval is Navigation, een object, een zelfstandig werkwoord. Dat klopt al, maar, een menu-item, dat is ook een apart object.
->setMenuItem() is geen apart object maar een method in je Navigatie functie!!!
Omdat een menu-item ook nog steeds een apart object is, doe je het, zoals ik al zei, beter in een aparte class!!!
Gewijzigd op 04/11/2012 18:47:26 door - Raoul -
Zou het er uiteindelijk niet zo uit moeten zien?
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
<?php
$menu = new Navigatie('...');
$menuItem = new Item('...');
$anotherItem = new Item('...');
$menu->append($menuItem);
$menu->append($anotherItem);
echo $menu->display();
?>
$menu = new Navigatie('...');
$menuItem = new Item('...');
$anotherItem = new Item('...');
$menu->append($menuItem);
$menu->append($anotherItem);
echo $menu->display();
?>
Jasper, zo kan je het doen. Maar je kan nog wat verder erin gaan. Kijk maar eens naar het voorbeeld dat ik gaf (http://github.com/knplabs/knpmenu )
en vervolgens in mijn display(); methode de methodes ervan ook aanroepen?
of is hier een andere manier voor..
Offtopic:
Jammer dat je niks met mijn idee doet, maar goed ik respecteer je keuze.