Více komponent stejné třídy v Presenter

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
wotaen
Člen | 82
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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.

wotaen
Člen | 82
+
0
-

Souhlas, v tomto je moje řešení slabší než továrničky, na druhou stranu, pokud vím, co na dané stránce má být, tak v tom nevidím rozdíl. Trochu mi to připomíná analogii netypové a typové jazyky

kravčo
Člen | 721
+
0
-

Zásadný rozdiel je aj v údržbe. Pokiaľ ti nejaký komponent pribudne/ubudne, musíš ho ručne pridať do/odobrať z konštruktora. V druhom prípade preň stačí napísať továrničku a ostatné sa udeje behind the scene