Vytvoření komponenty a přesměrování z komponenty
- doomed
- Člen | 17
Zdravím, rád bych vás požádal o radu, resp. dvě (no, možná tři ;o).
Předně bych chtěl ještě upozornit, že Nette je první framework se kterým
mám tu čest a s architekturou MVP či MVC se rovněž teprve seznamuji,
ostatně není tomu příliš dávno, kdy jsem začal s OOP obecně ;o)
Prosím, buďte ke mně proto shovívaví. Budu vděčný za každou radu.
Ale k věci. Jedná se o to, že jsem si vytvořil komponentu. Nevím, jestli
správně, každopádně funguje.
DeufaultPresenter.php
<?php
...
createComponentMojeKomponenta() {
$komponenta = new MojeKomponenta;
return $komponenta;
}
...
?>
MojeKomponenta.php
<?php
class MojeKomponenta extends Control
{
public function __construct() {
$form = new AppForm($this, 'MujForm');
...
$form->onSubmit[] = array($this, 'odeslano');
}
public function odeslano() {
...
//zpracování formuláře
...
$this->redirect('Default:'); //Nefunguje. Nevím proč.
}
public function render()
{
$template = $this->template;
$template->setFile(dirname(__FILE__) . '/MojeKomponenta.phtml');
$template->form = $this['MujForm'];
$template->render();
}
}
?>
Poté stačí, když v některém z pohledů zapíšu {control MojeKomponenta}.
Teď k dotazům. První dotaz souvisí s přesměrováním na defaultni pohled presenteru Default po zpracování formuláře v metodě odeslano(). Jak je již v komentáři v kódu uvedeno, $this->redirect(‚Default:‘); mi prostě nejde a laděnka ohlásí toto: „Component with name ‚Default‘ does not exist.“ Můžete mi, prosím, poradit, jak správně přesměrovat nebo zda lze toto vyřešit jinak než přesměrováním?
Další dotaz. Lze vytvořit komponentu nějak elegantněji nebo snadněji, než jak jsem to provedl já? V jednom topicu jsem totiž viděl toto:
<?php
class MyControl extends Control
{
protected function createComponent($name)
{
// kód vytvárajúci komponent ...
}
public function __toString()
{
// toto volanie vytvára komponent (ak ešte neexistuje)
$this->template->form = $this->getComponent('DataGridNumRows');
// ...
}
}
?>
Moc to nechápu, hlavně metodu __toString. Musím taky ve třídě MyControl vytvoři metodu render()? Jak potom v presentru vytvořím, resp. připojím komponentu?
Mockrát děkuji za odpověď.
Editoval doomed (29. 10. 2009 15:59)
- JakubKohout
- Člen | 92
Jo je to dobrý, ale ten formulař nedávej do __construct ale do „továrničky“.
protected function createComponentMujForm($name) {
$form = new AppForm($this, $name);
...
$form->onSubmit[] = array($this, 'odeslano');
}
a pak si v šabloně ($template->setFile(dirname(__FILE__) .
‚/MojeKomponenta.phtml‘);
) zavoláš jenom {control mujForm}
Ale celé by jsi to mohl posunout do presenteru. Tedy v presenteru dáš ten příklad výše a v šabloně presenteru zavoláš {control mujForm}, samozřejmě metodu odeslano musíš také posunout do presenteru
A pokud chceš přesměrovat tak buď dej $this->redirect(‚this‘); (udělá refresh), tvůj zápis sem ještě neviděl. Já osobně když někam potřebuju přesměrovat používám zápis $this->redirect(‚:modul:presenter:akce‘);
__ToString() se volá v případě že zavoláš echo $objekt ;)
Editoval dRaGen (29. 10. 2009 16:14)
- doomed
- Člen | 17
Zdravím, mockrát děkuju za odpověď. Jde mi ale o to, že se potřebuju přesměrovat na jinej pohled případně presenter, kde oznámím, že formulář byl úspěšně odeslán. Tomuhle zápisu: $this->redirect(‚:modul:presenter:akce‘); nerozumím. Co je to ten modul? Já když uvedu $this->redirect(‚presenter:akce‘); tak mi laděnka začne povídat o tom, že komponenta s názvem presenteru neexistuje. Dík za odpověď.
- Ondřej Mirtes
- Člen | 1536
doomed napsal(a):
Zdravím, mockrát děkuju za odpověď. Jde mi ale o to, že se potřebuju přesměrovat na jinej pohled případně presenter, kde oznámím, že formulář byl úspěšně odeslán. Tomuhle zápisu: $this->redirect(‚:modul:presenter:akce‘); nerozumím. Co je to ten modul? Já když uvedu $this->redirect(‚presenter:akce‘); tak mi laděnka začne povídat o tom, že komponenta s názvem presenteru neexistuje. Dík za odpověď.
Ukaž kód, nic takového by ti to psát nemělo.
- Mortaelth
- Člen | 24
Dela mi to to same. pouzivam prezenter Auth z prikladu Akrabat (CD collection) a zkousim ji rozsirit o „logout“. Udelal jsem si odkaz na signal {link Auth:logout!}, pridal do Auth handleLogout() a vysledek je v ladence „InvalidArgumentException, Component with name ‚Auth‘ does not exist.“
Máte někdo tušení čím to? Já žádnou komponentu Auth nepotrebuji, potřebuji jen zavolat sign out a vratit se na nejakou uvodni stranku.
Editoval Mortaelth (24. 2. 2010 21:47)
- 14113
- Člen | 33
Mam stejny problem, nevim proc ale v komponente mi nejde odkazovat…
vlastne na nic krom toho co mam v komponente. Kdyz napisu
$this->redirect(„Default:“); tak to nejde. Napise:
InvalidArgumentException
Component with name ‚XXX‘ does not exist.
Nevi nekdo co mam spatne??
PRedem dik
- Vladik_hk
- Člen | 50
ahoj, treba to jeste nekomu pomuze. Mel jsem stejny problem, tedy hlasku Component with name ‚XY‘ does not exist.“ pokud jsem pouzil volani redirect z komponenty ve tvaru $this->redirect(‚modul:presenter:akce‘); Mrkl jsem do dokumentace a tam stoji „Protože Control samotný neumí generovat odkazy, ale jen signály, potřebujeme jej svázat s Presenterem.“ Takze funkci redirect() nemuzeme volat na instanci komponenty, protoze neumi generovat odkazy. Musime ziskat presenter pomoci $instanceKomponenty->getPresenter() a na nej zavolat redirect i s prislusnymi parametry. Takhle jsem to alespon pochopil a funguje to. Btw. diky za Nette, je to fajnee:)
- Patrik Votoček
- Člen | 2221
to není tak úplně pravda protože $this->redirect(...);
totiž dělá to samé viz: https://api.nette.org/…ent.php.html#359
jde o to že to můžeš provádět pouze v komponentě která už je
attachnutá s presenterem.