MVC pagina
Pagina: « vorige 1 2 3 4 volgende »
Iedere pagina krijgt zijn eigen PageController?
Iets in mij zegt dat je niet begrijpt wat ik bedoel, of dat ik niet begrijp wat jij bedoelt! :)
Kun je iets meer uitleg geven wat jij bedoelt, of wat jij/ik niet begrijp(t)?
* bump *
Naar mijn mening heb je gewoon 1 PageController die per pagina dan de data ophaalt en dat rendered. Waarom je per pagina een aparte controller moet hebben is mij een raadsel.
Stel ik heb een homepage en ik wil daarop een header, footer, een banner en nieuwsberichten. In totaal 4 modules. Waar geef je dan aan welke modules er op de pagina moeten komen?
Je moet toch iets hebben waarin je per pagina aangeeft wat er op die pagina moet komen?
Toevoeging op 22/02/2014 18:20:02:
Op de normale MVC manier werk je toch ook met page controllers?
Stel je hebt een route "contact". Dan wordt gebruik gemaakt van de contactController. Dat is wat ik bedoel met een page controller.
Gewijzigd op 22/02/2014 18:18:14 door Ozzie PHP
Quote:
Stel ik heb een homepage en ik wil daarop een header, footer, een banner en nieuwsberichten. In totaal 4 modules. Waar geef je dan aan welke modules er op de pagina moeten komen?
Je moet toch iets hebben waarin je per pagina aangeeft wat er op die pagina moet komen?
Je moet toch iets hebben waarin je per pagina aangeeft wat er op die pagina moet komen?
In de configuratie. Je hebt gewoon een Page klasse ofzo die je in de database opslaat die alle informatie bevat: welke modules, etc.
Een AboutController, ContactController, etc. maken vind ik niet echt een geweldig idee.
Dat is dan ook een beetje de ZF manier waar ik dit op baseer.
Kun je nog iets verder toelichten wat jij bedoelt met een Page klasse (bedoel je een object?) die je opslaat in de database?
In 1e instantie zat ik dus zelf te denken aan een simpel configuratiebestandje, dus stel de route is "contact", dan hebben we een contact config-bestand met daarin:
Maar nu las is dat bij hmvc de modules ook met elkaar moeten kunnen praten. Weer even tergvallend op het voorbeeldje van Ward met de banners (eerder in dit topic). Dat vereist onderlinge communicatie, en dat kun je niet regelen via een configuratiebestand.
Ik ben wel benieuwd hoe jij dit dan voor je ziet. Jij zegt dus, als ik je goed begrijp, dat een pagina (homepage, contact, over ons, assortiment e.d.) geen eigen (configuratie- of controller)bestand heeft, maar dat je een Page klasse in de database opslaat. Ik ben wel benieuwd wat je daar dan mee bedoelt en hoe je dat dan voor je ziet.
Gewijzigd op 22/02/2014 19:58:08 door Ozzie PHP
Het stoppen in de database heeft als kracht dat je straks doormiddel van een online admin interface dit allemaal mooi door de admin kan laten aanpassen.
En op wat voor manier geef je dan bijvoorbeeld aan welke modules er op een pagina moeten komen te staan?
Ja, lees eens wat in over ORM (Object (= klasse) Relation (= database, MySQL) Mapper (= het omzetten van het 1 in het andere).
>> En op wat voor manier geef je dan bijvoorbeeld aan welke modules er op een pagina moeten komen te staan?
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
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
<?php
$header = ModuleFactory::createModule('header');
$main = ModuleFactory::createModule('main')
->add(ModuleFactory::createModule('hero_unit'), Module::position('top'))
->add(ModuleFactory::createModule('content'), Module::position('bottom', 'left'))
->add(
ModuleFactory::createModule('sidebar')
->add(ModuleFactory::createModule('contact', array(
'show_map' => true
)),
Module::position('top')
),
Module::position('bottom', 'right')
)
;
$footer = ModuleFactory::createModule('footer');
$page = ModuleFactory::createModule('homepage')
->add($header, Module::position('top'))
->add($main, Module::positionAfter('header'))
->add($main, Module::position('bottom'))
;
$entityManager->persist($page); // sla pagina op
$entityManager->flush();
?>
$header = ModuleFactory::createModule('header');
$main = ModuleFactory::createModule('main')
->add(ModuleFactory::createModule('hero_unit'), Module::position('top'))
->add(ModuleFactory::createModule('content'), Module::position('bottom', 'left'))
->add(
ModuleFactory::createModule('sidebar')
->add(ModuleFactory::createModule('contact', array(
'show_map' => true
)),
Module::position('top')
),
Module::position('bottom', 'right')
)
;
$footer = ModuleFactory::createModule('footer');
$page = ModuleFactory::createModule('homepage')
->add($header, Module::position('top'))
->add($main, Module::positionAfter('header'))
->add($main, Module::position('bottom'))
;
$entityManager->persist($page); // sla pagina op
$entityManager->flush();
?>
Gewijzigd op 22/02/2014 21:55:54 door Wouter J
Oké... ziet er ingewikkeld uit. Ik zal eens gaan lezen over dat ORM.
Ozzie PHP op 22/02/2014 22:01:11:
Oké... ziet er ingewikkeld uit. Ik zal eens gaan lezen over dat ORM.
Dat is ook de hele rede waarom ik steeds roep dat je dit soort logica (wat je nu dus bij Wouter ziet) absoluut niet als server side logica wilt hebben.
Eerst wil je alleen nog "modules" laten zien. Daarna krijg je de wens dat je ook wilt in kunnen stellen waar je het wilt laten zien. Of het visible mag zijn of niet en noem maar op.
Overigens is de woordkeuze "module" ook niet echt op zijn plaats als je het hebt over het wel of niet tonen van een "header" boven in of een "menu" aan de zijnkant van je site. Zoiets noem je dan eerder een widget. Een module is een set van functionaliteiten dat een bepaald iets uitbreid. Bijvoorbeeld wanneer je een CMS hebt. Dan kun je een "module" schrijven die web statistoeken toont van de gebruikers (soort Google analytics). Dat noem je een module.
Maar goed, je komt er vanzelf wel achter of het allemaal wel of geen goed idee is om zo'n kant op te gaan.
Ik ben het met je eens dat mijn voorbeeldje een beetje overdreven was. Wat beter is is om in de templates aan te geven op welke plekken er modules kunnen komen. Je zal alsnog de modules moeten toewijzen aan hun plek in de PHP code, aangezien je wel wilt dat een admin dit kan aanpassen.
Hmmm... nu vraag ik me toch weer af of je begrijpt wat server-side betekent. Je wilt zoiets toch niet client-side gaan regelen?
>> Overigens is de woordkeuze "module" ook niet echt op zijn plaats als je het hebt over het wel of niet tonen van een "header" boven in of een "menu" aan de zijnkant van je site. Zoiets noem je dan eerder een widget.
Het is maar net welke naam je het beestje geeft nietwaar. In mijn optiek kun je een header prima beschouwen als een module. Modules kun je zien als blokken met een bepaalde functionaliteit waaruit een pagina wordt opgebouwd. Een van die blokken is de header.
>> Wat beter is is om in de templates aan te geven op welke plekken er modules kunnen komen.
En dan komen we weer terug op het eerdere verhaal. Hoort zoiets thuis in een view of een controller? Stel we hebben 3 modules. Een module die contactgegevens toont, een module voor een contactformulier en een module voor een plattegrond.
Stel iemand roept nu de contactpagina aan. Dan wordt er volgens jou dus een contact view/template aangeroepen:
Nu wil ik op een andere site ook een contactpagina maken, maar zonder de plattegrond. Ik roep dus weer de contact view/template aan. Maar nu heb ik een probleem, want in de view staat de plattegrond.
De vraag is dus, ga je zoals jij zegt in de view aangeven welke modules je wilt zien, of geef je dit in de parent controller aan. In het laatste geval kun je specifiek aangeven wat je wilt zien. In het eerste geval staat hetgeen wat je te zien krijgt al vast, en zul je dus indien nodig bepaalde modules moeten blokkeren.
Gewijzigd op 23/02/2014 16:18:39 door Ozzie PHP
Quote:
Wat beter is is om in de templates aan te geven op welke plekken er modules kunnen komen. Je zal alsnog de modules moeten toewijzen aan hun plek in de PHP code, aangezien je wel wilt dat een admin dit kan aanpassen.
Kortom, template:
Code (php)
1
2
3
2
3
<header class=page__header>{{ position('header') }}</header>
<div class=page__main>{{ position('main') }}</div>
<footer class=page__footer>{{ position('footer') }}</footer>
<div class=page__main>{{ position('main') }}</div>
<footer class=page__footer>{{ position('footer') }}</footer>
Vervolgens kun je op die plekken modules neerzetten:
Jij hebt nu bijvoorbeeld in je template al een header en footer element gecreëerd, maar wat als ik een pagina zonder header en footer wil? Dan staan er 2 lege elementen op de pagina. Lijkt me ook niet echt de bedoeling.
Ozzie PHP op 23/02/2014 16:51:27:
Maar dat is nog steeds niet wat ik bedoel. Volgens mij moet in de view van een module alleen datgene staan wat bij die module hoort. Dus in de view van de map/plattegrond module mag alleen een plattegrond staan, en geen verwijzingen naar een header of footer. De view moet volgens mij zo onafhankelijk mogelijk zijn. Als je wilt dat de header bovenaan komt, dan zul je die als eerste moeten aanroepen.
Jij hebt nu bijvoorbeeld in je template al een header en footer element gecreëerd, maar wat als ik een pagina zonder header en footer wil? Dan staan er 2 lege elementen op de pagina. Lijkt me ook niet echt de bedoeling.
Jij hebt nu bijvoorbeeld in je template al een header en footer element gecreëerd, maar wat als ik een pagina zonder header en footer wil? Dan staan er 2 lege elementen op de pagina. Lijkt me ook niet echt de bedoeling.
Ik ben het met je eens dat je de header en footer niet per view moet laden. Als je maar een aantal views heb zou ik er niet moeilijk om doen maar wanneer je er toch wat hebt dan zou ik een template specificeren in de controller, in dat template zeg je dan op welke plek je view moet komen. Zo schrijven de grote mvc frameworks dit ook voor.. Templating noemen we dat
Zou je hier (eventueel in pseudo code) een voorbeeldje van kunnen geven?
Ozzie PHP op 23/02/2014 17:09:19:
>> Als je maar een aantal views heb zou ik er niet moeilijk om doen maar wanneer je er toch wat hebt dan zou ik een template specificeren in de controller, in dat template zeg je dan op welke plek je view moet komen.
Zou je hier (eventueel in pseudo code) een voorbeeldje van kunnen geven?
Zou je hier (eventueel in pseudo code) een voorbeeldje van kunnen geven?
Tuurlijk, hier is een voorbeeld van een implementatie in codeigniter
Dit stukje code heb ik in de parent controller van elke klasse die gebruikt maakt van dit layout.
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
public function __construct() {
parent::__construct();
$this->template->set_layout('order_finish/index');
}
?>
public function __construct() {
parent::__construct();
$this->template->set_layout('order_finish/index');
}
?>
In de werkelijk controller die erft van de parent controller, zet je bepaalde
variabelen die je wilt gebruike in je view (zie set()) en
Nu wordt de view "my_view" in het layout geplaatst
Kan je je hier iets bij voorstellen?
Als je meer hierover wilt weten kan je kijken naar de bibliotheek die ik hiervoor gebruikt hebt http://getsparks.org/packages/template/show
Hmmm, oké... dit is een vrij specifieke implementatie. Ik ben vooral benieuwd naar de achterliggende gedachte en de meest handige implementatie. Bedankt voor jullie input tot zover. Ik ga eerst eens goed nadenken wat ik straks wil (moet het bijv. wel of niet dynamisch zijn en aan te passen zijn via een admin). Ik ga er nog eens een paar nachtjes over slapen. Ik kom hier waarschijnlijk over een tijdje wel weer op terug als ik een duidelijker beeld heb van wat ik wil. Thanks allemaal!