Ik werk volgens het MVC2 model, en heb dus een aantal models met namen als:
Page() (in page.mdl.php)
Settings() (in settings.mdl.php)
Het probleem waar ik echter mee zit is het volgende, als ik 1 pagina wil ophalen wordt dit
$oPage = new Page();
$oPage -> id = x
$oPage -> getData(); // en ik heb nu mijn volledige object gevult adhv de id
Maar als ik alle pagina's wil hebben dan wordt het:
$oPages = new Page();
$aPages = $oPages -> getAllRows(); // Array met alle paginas in als object
Het probleem vind ik nu de naamgeving, als ik 1 pagina moet hebben klopt new Page() perfect maar mag dit ook gewoon als ik meerdere pagina objecten ophaal?
Of moet ik hier een apart model pages.mdl.php voor maken?
En hoe doe ik het met settings? Settings.mdl.php bevat 1 rij uit de database met informatie over mijn website, zoals title, description, language,... echter is Setting een betere naam (classe namen altijd enkelvoud houden), maar dan dekt het weer niet de content namelijk dat het meerdere Settings zijn.
Ik hoop dat mijn probleem een beetje duidelijk is. En iemand meer opheldering kan geven wat nu de mooiste manier is.
Ik werk volgens het MVC2 model, en heb dus een aantal models met namen als:
Page() (in page.mdl.php)
Settings() (in settings.mdl.php)
Het probleem waar ik echter mee zit is het volgende, als ik 1 pagina wil ophalen wordt dit
$oPage = new Page();
$oPage -> id = x
$oPage -> getData(); // en ik heb nu mijn volledige object gevult adhv de id
Maar als ik alle pagina's wil hebben dan wordt het:
$oPages = new Page();
$aPages = $oPages -> getAllRows(); // Array met alle paginas in als object
Het probleem vind ik nu de naamgeving, als ik 1 pagina moet hebben klopt new Page() perfect maar mag dit ook gewoon als ik meerdere pagina objecten ophaal?
Of moet ik hier een apart model pages.mdl.php voor maken?
En hoe doe ik het met settings? Settings.mdl.php bevat 1 rij uit de database met informatie over mijn website, zoals title, description, language,... echter is Setting een betere naam (classe namen altijd enkelvoud houden), maar dan dekt het weer niet de content namelijk dat het meerdere Settings zijn.
Ik hoop dat mijn probleem een beetje duidelijk is. En iemand meer opheldering kan geven wat nu de mooiste manier is.
je kan aan en pagina NOOIT alle paginas vragen!
want en PAGE is maar 1 pagina.
je zal voor elke page en nieuwe page aan moeten maken.
bv oPage1, oPage2, oPage3 etc...
of en pageBeheerder oid moeten maken en daar alle pages in zetten.
Ik zou het model en het ophalen van de data uit de database van het model scheiden, dus meer denken in de richting van:
Page_Provider->find($id) -> geeft 1 Page terug
Page_Provider->find_all(array('parent' => 24)) -> geeft array terug met Page-objecten
Je hoeft ze op zich niet eens echt te scheiden (dus twee klassen te maken per model) Ik heb het zelf gedaan door alle models van één abstract model te laten erven. Dat ene abstracte model heeft twee static methods, find & find_all, en omdat alle modellen van dat abstracte model overerven kan het abstracte model bij de protected methods van de modellen. Ieder model heeft 2 verplichte methods, _table_name & _properties, waarbij de eerste de table-naam teruggeeft, en de tweede een array met kolommen uit de database.
<?php
class Bedrijf extends IHG_Record {
protected function _table_name() {
return 'Bedrijven';
}
protected function _properties() {
return array('id', 'naam', 'url');
}
}
$een_bedrijf = IHG_Record::find($pdo, 'Bedrijf', array('id' => 24));
?>
En om niet overal een instantie van $pdo mee te nemen waar ik modellen wil ophalen, heb ik een Provider-"component" gemaakt wat als het ware door de hele applicatie beschikbaar is:
<?php
class IHG_Record_Provider {
public function __construct($pdo, $record_type) {
}
public function find($conditions) {
return IHG_Record::find($this->pdo, $this->record_type, $conditions);
}
}
$this->app->bedrijven = new IHG_Record_Provider($pdo, 'Bedrijf');
// en dan bijv. in een controller
$this->bedrijven->find(array('id' => 24));
?>