Kde Nette bere proměnnou z adresy?
- CZechBoY
- Člen | 3608
Zdravim,
tak píšu můj první zásek – dokumentace není pro mě dostatečně
napsaná, na rootu tam zase nepíšou, který soubor se má upravit :(
Takže můj problém je, že nevím kde v ukázkovém příkladě
s TodoListem
kdyby mi mohl někdo vysvětlil jaká třída/funkce se volá při načtení
stránky jako první tak by mi to pomohlo taky ;)
díky za vaše rady amatérům :)
jo verze 0.9.6, prostě vše stejné jako v tom tutoriálu
Editoval CZechBoY (7. 6. 2011 20:46)
- Filip Procházka
- Moderator | 4668
Teď si přečti co jsi napsal a oprav druhý odstavec :))
A polož otázku.
- _Martin_
- Generous Backer | 679
Z té otázky nejsme úplně moudrý, pomohl by životní cyklus presenteru?
- nanuqcz
- Člen | 822
Myslím, že se ptá na to, kde se v routování nastavuje defaultní presenter a defaultní akce.
CZechBoY: V prvním
díle je tak trochu nakousnuté tzv. routování, v souboru
bootstrap.php
. Konkrétně tento kód
$router[] = new NRoute('index.php', array(
'presenter' => 'Homepage',
'action' => 'default',
), NRoute::ONE_WAY);
$router[] = new NRoute('<presenter>/<action>/<id>', array(
'presenter' => 'Homepage',
'action' => 'default',
'id' => NULL,
));
ti zajistí, že při prázdné URL (www.example.com), nebo pokud je tam jen
index.php
(www.example.com/index.php) se spustí
HomepagePresenter
a jeho metoda actionDefault
a pak
renderDefault
. Víc o routování zde .
Jestli jsem správně nepochopil dotaz, tak sry, není to moc srozumitelně napsané ;-)
Editoval xxxObiWan (7. 6. 2011 22:13)
- CZechBoY
- Člen | 3608
to jsem to napsal tak špatně? no nevadí snad
potřebuju zjistit kde Nette přijde na to, že v URL adrese je ten parametr a
jak ho dokáže nějak zavést do skriptu
prostě mi není jasné, když tam není žádné $_GET ani nic podobného, žádné volání třídy tak jak může mít najednou ta proměnná hodnotu
samozřejmě vidím stejné názvy parametru proměnné actionShow/renderShow jako v $GET, ale stále mi to není jasné :(
takže kdybys měl v adrese ještě další proměnnou test s hodnotou 123 tak se budou action/render Show funkce volat s 2 parametrama – showDoneTasks a test?
jo přečetl jsem si první článek – včera jsem byl celej den ospalej tak jsem to napsal nějak špatně už večer :(
Editoval CZechBoY (8. 6. 2011 7:40)
- grey
- Člen | 94
CZechBoY wrote:
to jsem to napsal tak špatně? no nevadí snad
potřebuju zjistit kde Nette přijde na to, že v URL adrese je ten parametr a jak ho dokáže nějak zavést do skriptuprostě mi není jasné, když tam není žádné $_GET ani nic podobného, žádné volání třídy tak jak může mít najednou ta proměnná hodnotu
samozřejmě vidím stejné názvy parametru proměnné actionShow/renderShow jako v $GET, ale stále mi to není jasné :(
takže kdybys měl v adrese ještě další proměnnou test s hodnotou 123 tak se budou action/render Show funkce volat s 2 parametrama – showDoneTasks a test?
jo přečetl jsem si první článek – včera jsem byl celej den ospalej tak jsem to napsal nějak špatně už večer :(
To se prostě děje ve frameworku pod pokličkou a jako začátečník bych to neřešil… A jo, když si tam přidáš proměnnou test, tak můžeš buď přidat parametr to metody, nebo se k ní dostat přes $this->getParam(‚test‘)…
- Filip Procházka
- Moderator | 4668
Pokud tě to hodně zajímá…
- v
boostrap.php
máš$application->run();
- tam je volání routeru, který url rozdělí podle masky a GET query
- vytvoří objekt
Nette\Application\Request
do kterého data naplní (název presenteru, akce, ostatní parametry, …) - pomocí objektu
$request
zjistí jak, a vytvoříPresenter
- presenteru předá znovu ten request
$presenter->run($request)
- v
Presenter
je magická metoda, která umí podle zadaných parametrůarray('ooo' => 1, 'fff' => 2)
volat metodu, tak aby ty klíče seděly na metodu. Takže pak zavolá třebaactionDefault($fff)
jako$presenter->actionDefault(2)
. Detaily myslím řešit nemusíš, je tam magie s reflexí
No a přes $component->getParams()
jsou v komponentách
(takže i v presenteru) přístupné ty parametry z request. Je to všecko
takhle krásně propojené :)
- grey
- Člen | 94
Tak do tvejch vlastních metod se ti žádné get parametry cpát nebudou, ale zase, můžeš je v presenteru volat přes $this->getParam(‚xyz‘) nebo v komponentě přes $this->presenter->getParam(‚xyz‘) v jakékoliv metodě, nebo za předpokladu že tu metodu voláš z action/render metody, tak tak prostě dáš parametry co jsi dostal jako parametry té action/render…
- grey
- Člen | 94
Jo, do presenteru, vždycky do toho v jehož šablonách se bude ta komponenta vykreslovat, nebo nějakého nad tím (do presenteru který ten současný dědí)… pokud je formulář velký, tak si ho můžeš dát do vlastní třídy, ale akorát na úrovní že ti bude vracet ten form, ale v presenteru si zase budeš muset udělat createComponentXyz metodu…
- CZechBoY
- Člen | 3608
no tak já tohle neovládám, říkám že jsem začátečník a v tutoriálu je napsané widget, za to já nemůžu :)
takže když dám do presenteru createComponentNeco{} tak to automaticky
rozpozná že to je form nebo tam musim za jméno formu dát ještě
„Form“?
když odešlu formulář tak se místo toho <form… zobrazí například:
ůúspěšně odesláno" samo?
- _Martin_
- Generous Backer | 679
createComponentNeco
vytvoří komponentu se jménem
Neco. Nezáleží na tom, co je ta komponenta zač. Pokud je
vykreslitelná (což formuláře jsou), tak při zadání
{control neco}
do šablony se komponenta v tom místě
vykreslí.
Co se ti vykreslí po odeslání záleží na tobě. Na formulář se dají navěsit různé události, tzn. kód, který se zavolá např. po odeslání, po stisku tlačítka,… V těchto událostech si nějak zpracuješ data, která uživatel vyplnil a následně mu můžeš zobrazit hlášku.
- _Martin_
- Generous Backer | 679
Obvykle bývá formulář na jiné stránce, než kam uživatele přesměruješ po úspěšném vyplnění dat – v takovém případě bys měl dvě různé šablony a nemusel bys nic testovat.
On sám koncept PRG ti nějaké testování stavu neumožňuje – zkrátka po úspěšném odeslání by mělo dojít k přesměrování a tak při nejbližším přístupu k formuláři bude ten opět ve stavu neodesláno=)
- Mikulas Dite
- Člen | 756
Flash message jsou více méně jenom zprávy (proměnné), které se předávají do šablony.
Vypsat se musí pomocí
<div n:if="$flashes" n:snippet"flashes">
<div class="flash" n:foreach="$flashes as $flash" class="{$flash->type}">$flash->message</div>
</div>
nejlépe v @layout.latte
.
První parametr je zpráva, druhý třídy, které flash message má mít
($flash->type
).
Pro vypsání html stačí vložit místo stringu
Nette\Utils\Html
.
Edit: pro další otázky prosím udělej nový thread
Editoval Mikulas Dite (8. 6. 2011 17:43)
- 22
- Člen | 1478
_Martin_ napsal(a):
createComponentNeco
vytvoří komponentu se jménem Neco. Nezáleží na tom, co je ta komponenta zač. Pokud je vykreslitelná (což formuláře jsou), tak při zadání{control neco}
do šablony se komponenta v tom místě vykreslí.
sry, že tě chytám zase za slovo, ale je formulář opravdu vykresiltelná komponenta? opět se odvolám na tento draft. O nic nejde, jen v tom chci mít jasno. Chapal jsem to tak, že komponenta musí mít metodu render(), což tady je a není pravda.
- Mikulas Dite
- Člen | 756
Vykreslitelná komponenta ve smyslu Control
to není (dědí
pouze od Component
), ale implementuje render()
, takže
více méně to vykreslitené je.
- Mikulas Dite
- Člen | 756
Protože Nette argumenty automaticky přetypovává. Jestli je v presenteru něco jako
public function actionDefault($showDoneTasks = TRUE) { /*...*/ }
Nette pozná, že chceš boolean.
- vranacik
- Člen | 9
@CZechBoY
Skúšal si niekedy niečo takéto?
$int99 = 99;
$int0 = 0;
if ($int0){
echo "TRUE";
}else{
echo "FALSE";
}
if ($int99){
echo "TRUE";
}else{
echo "FALSE";
}
Reku skús čo ti to vyhodí :D
PHP si to pretypuje aj samo, 0 je teda vždy false, a číslo vždy true (aj
záporne) a podobne je to s reťazcom (prázdny false a neprázdny true) –
toto teda platí ak sa ma s premennou pracovať ako s boolean → nie je to
teda len o Nette
Editoval vranacik (8. 6. 2011 19:37)
- CZechBoY
- Člen | 3608
však já vim co je INT, ale nechápu proč to přesměrovává :)
takže formulář bude na stránce form/show a když to budu odesílat tak se
přejde na stránku form/post?
potom v té třídě s vytvářením formu(createComponentNejForm) bude
další funkce processNejForm(AppForm $form).
Ta se spustí při odeslání formuláře nebo přejití na stránku
form/post?
$form[‚save‘]->isSubmittedBy() znamená, že musí být formulář
odeslán přes tlačítko nebo funguje i odeslání JavaScriptem, nebo enterem
nad nějakým textboxem?
- Tharos
- Člen | 1030
HosipLan napsal(a):
Na tohle existují šikovné tabulky.
Nechápu, jak mi tahle stránka mohla celá ta léta bastlení unikat ;), díky za užitečný tip. Nevíš, co dál takhle šikovného jsem ještě přehlédl :)?
- Filip Procházka
- Moderator | 4668
@Tharos: Kdyby mě něco napadlo tak dám vědět :)
Editoval HosipLan (9. 6. 2011 9:43)
- _Martin_
- Generous Backer | 679
Pokud to je součástí presenteru, tak to nebude ani stránka
form/show
, ani stránka form/post
. Stránka se bude
jmenovat podle toho, co na ní je, například contact
(ContactPresenter). Protože stránka s kontaktem se dále nedělí,
vykreslíš formulář ve výchozí šabloně.
O odesílání se nestaráš, pouze při definici formuláře určíš, co
se má zavolat po úspěšném odeslání (či po neúspěšném odeslání, po
kliknutí na konkrétní tlačítko,…). A v této metodě, která bude po
odeslání zavolána, si data zpracuješ a provedeš přesměrování.
V případě kontaktnís tránky to může být klidně na tu stejnou stránku
($this->redirect('this');
), v případě přidávání/editace
nějakého záznamu například na výpis všech záznamů.
Hlášku určíš pomocí
$this->flashMessage('Díky za info, brzy se vám ozveme');
// tady bude přesměrování
a v šabloně se následně vykreslí (viz. příklady)
K tlačítkům: Při odeslání na Enter se za odesílací tlačítko považuje první tlačítko formuláře. V případě JS záleží, jakým způsobem odesíláš – při odeslání formuláře se bude opět detekovat první tlačítko, při odeslání přes kliknutí na tlačítku se detekuje ono tlačítko.