Komponenty – odkazování na jiné a renderování (jiné)-
- Klobás
- Člen | 113
Ahoj,
rád bych si ujasnil 2 věci:
- Lze vůbec nějak rozumně odkazovat z jedné komponenty na druhou? (pro
jednoduchost komponenta A, B)
- pokud jsou obě komponenty v presenteru
- pokud jsou vytvořeny v jiných komponentách
Co jsem si tak zkoušel hrát s URL (tak když pošlu v GETu správnou URL
(?komponenta-nejakyparametr=hodnota&do=komponenta-handle), tak to funguje,
tak mě tedy asi jenom zajímá, dá se udělat přes nějakou metodu či makro
smysluplný link?
(Vím, že v komponentě funguje {link handle!, params}, na presenter je to
{plink), ale nic z toho mi nezacílí komponentu B odkazem volaným z A).
- V komponentě si můžu udělat víc render metod, renderFoo, renderBar… a pak controlku zavolat {control:foo}, {control:bar), to je fajn. Ale když ji překreslím ajaxem, tak se volá default, což je tedy jen render(), dá se to nějak smysluplně obejít, resp. nastavit.
Díky.
- duke
- Člen | 650
ad 1) Komponenty jsou samostatné jednotky a jako takové by se vůbec neměly spoléhat na to, co je mimo ně (včetně jiných komponent, které nejsou jejich subkomponentami). Chceš-li zajistit komunikaci s paralelně existujícími komponentami, řeš to pomocí reakcí na události v nadřazené komponentě (presenteru).
ad 2) Pokud vím, tak to nejde. Proto tyto specifické render metody komponent příliš nepoužívám (rozhodně ne tam, kde vím, že budu chtít používat ajax).
- Klobás
- Člen | 113
duke napsal(a):
ad 1) Komponenty jsou samostatné jednotky a jako takové by se vůbec neměly spoléhat na to, co je mimo ně (včetně jiných komponent, které nejsou jejich subkomponentami). Chceš-li zajistit komunikaci s paralelně existujícími komponentami, řeš to pomocí reakcí na události v nadřazené komponentě (presenteru).
ad 2) Pokud vím, tak to nejde. Proto tyto specifické render metody komponent příliš nepoužívám (rozhodně ne tam, kde vím, že budu chtít používat ajax).
- Jasně, myslel jsem si, že to bude mít nějaký takový důvod.
- Na tuto bariéru jsem taky narazil, čím víc nad tím přemýšlím, tak si myslím, že komponenta by měla mít pouze render metodu a žádnu další vykreslovací a v případě, že bych chtěl mít víc renderMetod, tak to řešit vícero komponentami, to je v pořádku ne?
- Rád bych ještě jednu věc, jak efektivně řešit výměnu šablony v renderu na základě např. handleMetody?
Např. Kontaktní formulář se vyrenderuje, a po odeslání ho handle metoda vrátí zase na „this“, ale chci zobrazit např. jen hlášku, že byl odeslán (tj. 2 šablona).
takže ideálně ContactFormComponent
– default.latte (formular)
– success.latte (jen hlaska o odeslani a pripadne merici kod atd.)
Nechci to resit nejakou pomocnou promennou a ifovat to v sablonach, takže mě napadlo toto:
<?php
class B extends Nette\Application\UI\Control {
/** @persistent */
public $view = 'b1';
public function setView($view)
{
$this->view = $view;
}
public function render()
{
$this->template->setFile(__DIR__ . '/../templates/components/'.$this->view.'.latte');
$this->template->render();
}
.
.
.
// uz nepodstatny kod
?>
Samozřejmostí by bylo ošetření a „whitelist“ šablon.
Je to v pořádku, nebo řešit jinak / lépe?
- Klobás
- Člen | 113
CZechBoY napsal(a):
Jetsli máš komponentu závislou na nějaký druhý tak je něco špatně. Jedině že bys měl jednu komponentu subkomponentou té druhé.
Tak úplně to není, ale zdědil jsem projekt na Nette 2.0, který je z části modifikován (hlavně komponenty jsou tam dosti magické) a vznikla mi potřeba překreslit kontrolku A z
- nějaké metody v nějakém presenteru
- z komponenty X
- z komponennty Z … atd
Takže jsem hledal co nejsnažší způsob, a nakonec jsem vytvořil klasickou továrnu v BasePresenteru + handle v BP a teď už si na ní snadno dostanu a můžu s ní pracovat.
Jen mě to zajímalo jak to je.