Více komponent stejné třídy v Presenter
- wotaen
- Člen | 82
Ahoj všichni,
můj presenter vypadá takto
class MagazinePresenter extends HudHudPresenter {
protected $components = array(
‚topRibbon‘=>array(‚class‘=>‚Ribbon‘), ‚categoryRibbon‘=>array(‚class‘=>‚Ribbon‘,‚category‘=>24,‚categoryName‘=>‚Akhbar‘)
}
public function prepareDefault() {
$this->createComponents();
}
a metoda createComponents zase takto
protected function createComponents() {
foreach($this->components as $componentKey=>$values) {
if (is_int($componentKey)) {
$componentKey = $values;
$values = array();
}
$objectName = isset($values[‚class‘]) ? $values[‚class‘] :
ucfirst($componentKey);
$object = new $objectName();
$object->params = $values;
$this->addComponent($object,$componentKey);
$this->template->{$componentKey} = $object;
}
}
tímto zaregistruju komponenty které potřebuju a předám jim parametry.
Komponenty jsou vloženy do template. To vše donedávna fungovalo. A co jsem
udělal, že se to po…?
V konstrukteru objektu, který dědí z Control a je rodičem všech mých
komponent jsem nezavolal parent::__construct(), následkem čehož se mi při
zpracování signálů komponentě ztratily předávané parametry. To jsem
opravil doplnění parent::__construct() ale rozhodilo mi to celý systém
komponent. A jak to vypadá, když je to rozhozené?
Při registraci komponent v protected $components mám jednu a tu samou
komponentu Ribbon, jméno je různé. Komponenta se má zobrazovat 2×
v template dělá v podstatě to samé, akorát se trochu jinak zobrazuje
(proto 2×, rozlišuje se to na úrovni parametrů komponentě
předávaných) – to je žádaný stav. Po opravě konstruktoru se sice
zobrazí 2× Ribbon, ale v obou případech je to ta samá komponenta (ta
první ‚topRibbon‘).
Tak nevím tušíte někdo, co dělám špatně?
Díky, Michal
- Ondřej Brejla
- Člen | 746
Tohle je spíš návrh…nevím jakou používáš revizi, ale co přestat
používat prepare
metody a komponenty vytvářet podle nového
přehledného způsobu? Určitě by se ti lépe debugovalo.
- wotaen
- Člen | 82
Souhlasím nový způsob vypadá zajímavě, ale moc se do nové verze nechci pouštět. Můj nynější způsob mi nepřijde složitý a kódu je také minimum. Co nechápu je to, že v presenteru (když vypíšu výsledek getComponents) mám všechny komponenty zaregistrované správně, přesto se zobrazí pouze ta první…pro ilustraci ještě doložím kousek z templatu
<div id=„magazine-ribbon“ class=„ribbon“>
{?$topRibbon->render()}
</div>
<br class=„clear“/>
<div id=„category-ribbon“ class=„ribbon“>
{?$categoryRibbon->render()}
</div>
- wotaen
- Člen | 82
Takže vyřešeno, problém byl ten, že se komponentě nepředávaly parametry, resp., původně bylo
$object = new $objectName();
$object->params = $values;
$this->addComponent($object,$componentKey);
změnil jsem na
$object = new $objectName();
$this->addComponent($object,$componentKey);
$object->params = $values;
a funguje to, při addComponent se ty parametry někam vytratí, akorát nevím kde, čtu addComponent zvrchu dolů a nějak na to nemůžu přijít
- Ondřej Mirtes
- Člen | 1536
Ten tvůj způsob se mi nelíbí, likviduje totiž tu ideu, že továrničky na komponenty jsou udělané lazy způsobem, tzn. vytvoří se, až když je třeba.
Souhlas s Wardenem, mrkni na nový způsob.