Neřešitelný problém?

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

Opět jsem narazil na další problémek, který neumím vyřešit.

Mám AJAXový login formulář (možná že to není nejlepší nápad, ale mám ho :-)), který je v @layout.phtml, neboli je na všech stránkách. Login funguje perfektně, problém je, když uživatel zadá špatné heslo. Chci mu vrátit hlášku, že zadal špatné heslo, protože jinak to vypadá, jako by se formulář vůbec neodeslal. Navíc formulář renderuju ručně a to už se pomalu dostávám k problému.

Po zadání špatného hesla mi totiž vyhodí Nette chybu, že už komponenta formuláře existuje. Pokud formulář nerenderuju ručně, ale pouze vložím {widget loginForm}, je všechno v pořádku, problém je s tím ručním renderováním. Komponentu vytvářím ve funkci beforeRender v BasePresenteru nějak takto (samozřejmě pouze pokud není uživatel přihlášen)

<?php
$this->template->loginForm = $this->createComponentLoginForm();
?>

Nejspíš bych potřeboval nějakou funkci (nenašel jsem), která zjistí, zda už komponenta neexistuje a podle toho ji vytvářet. No a nebo se prostě zbavím toho AJAXového login formuláře, což se mi po té práci co mi to dalo moc nechce.

Aurielle
Člen | 1281
+
0
-

Netačilo by ti $this->template->loginForm = $this['loginForm'];?

Kenn
Člen | 110
+
0
-

Díky moc. Složitě vypadající problémy mají vždycky snadné řešení :)

Ola
Člen | 385
+
0
-

Vysvětlím příčinu: createComponentXXX je továrna. Továrna vždy vrací vytvořený produkt (v našem případě komponentu). Tento produkt ale vytvořením není automaticky poslaný do oběhu (v našem případě připojen k presenteru) – musí projít různými testy a bůh ví čím. To je jasné. Ale teď se zaměřím na tvojí konkrétní situaci. To co potřebujeme vědět, je že signály (a tedy i zpracování formulářů) se dějí ještě před beforeRender. Co se tedy v tomto případě stane: formulář se odešle, zavolá se signál xxxform-submit, ten VYTVOŘÍ KOMPONENTU XXX A PŘIPOJÍ JI K PRESENTERU (to je důležité). Dále se přesouváme k jádru problému – funkce createComponentXXX vyrábí produkt. Pokud bys ho hned v oné funkci neregistroval v konstruktoru (tedy v naší metafoře neověřil ho testy na kvalitu bílkovin apod.) vše by mělo být v pořádku. Zásadní rozdíl mezi funkcemi getComponent (což je alias pro přístup přes offset) a createComponentXXX je ten, že getComponent se podívá, zda komponenta již není připojená, pokud je, vrátí tu samou, jinak si vyžádá tvorbu komponenty (produktu)

Editoval Ola (13. 2. 2010 20:13)