Vytvoření komponenty a přesměrování z komponenty

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

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

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

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ěď.

libja
Člen | 8
+
+1
-

Pro přesměrování z komponenty na presenter zkus:

<?php
	$this->presenter->redirect('Default:');
?>

Taky začínám, tak nevím jestli je to nejde ještě nějak jinak, ale mně to funguje.

Editoval libja (31. 10. 2009 10:04)

Ondřej Mirtes
Člen | 1536
+
0
-

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

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

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

Vyki
Člen | 388
+
+1
-

A funguje ti tvoření odkazů v šabloně pomocí makra {plink :Modul:Presenter:akce}? Zkus také

<?php
	$this->getPresenter()->redirect(':Modul:Presenter:akce');
?>

Editoval Vyki (6. 7. 2010 14:26)

14113
Člen | 33
+
0
-

Jo v soblone mi to jde. Nepomuze ani

<?php
$this->getPresenter()->redirect(':Modul:Presenter:akce');
?>

vypise to: AbortException

Editoval 14113 (6. 7. 2010 15:17)

Majkl578
Moderator | 1364
+
0
-

Moment, jak vypise to: AbortException, AbortException je interní vyjímka, kterou bys ani vidět neměl. Jak tu komponentu používáš?

Aurielle
Člen | 1281
+
0
-

Nezachytáváš nějakým způsobem všechny instance Exception?

Ondrej
Člen | 110
+
0
-

14113 napsal(a):

Jo v soblone mi to jde. Nepomuze ani

<?php
$this->getPresenter()->redirect(':Modul:Presenter:akce');
?>

vypise to: AbortException

AbortException nasvedcuje tomu, ze presmerovavas pozde. Nemas toto volani az v renderovaci fazi?

14113
Člen | 33
+
0
-

Dik za rady, nekonec jsme to udelal tak at muzu delat odkazy az v sablone.

Vladik_hk
Člen | 50
+
0
-

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

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.