Kde Nette bere proměnnou z adresy?

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

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

Teď si přečti co jsi napsal a oprav druhý odstavec :))

A polož otázku.

_Martin_
Generous Backer | 679
+
0
-

Z té otázky nejsme úplně moudrý, pomohl by životní cyklus presenteru?

nanuqcz
Člen | 822
+
0
-

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)

Ani
Člen | 226
+
0
-

Já myslim, že se ptá na to kde v actionXXX nebo renderXXX vezme proměnou z url. Takže by měla být odpověd, že jí daná akce dostane jako parametr, ale čert ví na co se ptá :D

Editoval Ani (8. 6. 2011 0:58)

Filip Procházka
Moderator | 4668
+
0
-

Kazíte to… já se ho snažil vychovávat, aby se zeptal pořádně… :P

nanuqcz
Člen | 822
+
0
-

HosipLan: Jo, ale to máš pravdu, sry :-D

Editoval xxxObiWan (7. 6. 2011 23:11)

uestla
Backer | 799
+
0
-

Já si myslím, že se zatím na nic nezeptal.

Prosím, pane CZechBoY, jen žádný ostych, račte otázky pokládati, jak vám libo jest!

CZechBoY
Člen | 3608
+
0
-

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

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 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 :(

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

Pokud tě to hodně zajímá…

  1. v boostrap.php máš $application->run();
  2. tam je volání routeru, který url rozdělí podle masky a GET query
  3. vytvoří objekt Nette\Application\Request do kterého data naplní (název presenteru, akce, ostatní parametry, …)
  4. pomocí objektu $request zjistí jak, a vytvoří Presenter
  5. presenteru předá znovu ten request $presenter->run($request)
  6. 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řeba actionDefault($fff) jako $presenter->actionDefault(2). Detaily myslím řešit nemusíš, je tam magiereflexí

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é :)

CZechBoY
Člen | 3608
+
0
-

no jasně, mě moc nezajmá že to funguje, ale kdybych chtěl třeba předat parametry metodě tak abych věděl jak

grey
Člen | 94
+
0
-

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…

CZechBoY
Člen | 3608
+
0
-

jo takže parametry funkcí render/action jsou totožné s $GET?

do jakého souboru mám napsat když chci přidat formulář/komponentu? do modelu asi ne, takže do presenteru?
mám ten formulář dát do té třídy nebo samostatně bez třídy?

stále dělám ten tutoriál

grey
Člen | 94
+
0
-

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

takže když chci přidat formulář tak přidám createComponentTodoForm (Todo je presenter) do třídy TodoPreseneter a přidám ho do šablony přes {widget todoForm} ?

grey
Člen | 94
+
0
-

nemusí se to jmenovat podle presenteru, ale pokud logicky sedí todoForm, tak proč ne ;)
a makro widget je zastaralé, sice asi ještě bude fungovat, ale už se používá control – takže {control todoForm}

CZechBoY
Člen | 3608
+
0
-

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

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.

CZechBoY
Člen | 3608
+
0
-

jo, vlastně já dám createComponentTestovyFormular{new Form} to mi nedošlo :)
takže v šabloně budu mít napevno {control testovyFormular} nebo tam budu muset mít if, který bude kontrolovat stav formuláře?

_Martin_
Generous Backer | 679
+
0
-

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=)

CZechBoY
Člen | 3608
+
0
-

takže bych udělal metodu formSubmitted a tam bych zobrazil text „Úspěšně odesláno“ nebo jak?
prostě aby se ta stránka nezobrazila když formulář nebude odeslaný a zpracovaný

grey
Člen | 94
+
0
-

CZechBoY wrote:

takže bych udělal metodu formSubmitted a tam bych zobrazil text „Úspěšně odesláno“ nebo jak?
prostě aby se ta stránka nezobrazila když formulář nebude odeslaný a zpracovaný

To si někam přesměruj a přidej tam třeba flash message…

_Martin_
Generous Backer | 679
+
0
-

Tak předpokládám, že nechceš zobrazit pouze bílou stránku s textem v levém horním rohu ;) Můžeš buď přesměrovat na stránku, která hlášku obsahuje, a nebo, ještě lépe, využít flashMessage (jak píše grey).

CZechBoY
Člen | 3608
+
0
-

oukej, jak se pracuje s tím flashMessage? to jako přidám zprávu (můžu HTML?) a ta se zobrazí společně s layoutem?

Mikulas Dite
Člen | 756
+
0
-

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

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

Vykreslitelná komponenta ve smyslu Control to není (dědí pouze od Component), ale implementuje render(), takže více méně to vykreslitené je.

_Martin_
Generous Backer | 679
+
0
-

@22: To se omlouvám, máš pravdu – nějak jsem si to popletl, právě kvůli té funkci render.

22
Člen | 1478
+
0
-

nic se neděje, jak říkám, šlo mi jen o to, si to ujasnit, vzhledemk tomu, že poslední 3 dny dělam jen komponenty, tak to mám nějak v hledáčku. Normálně bych si toho asi ani nevšiml. :-)

CZechBoY
Člen | 3608
+
0
-

teď jsem trošku zkoumal ten příklad s TodoLitem a když v URL ručně přepíšu hodnotu showDoneTasks z 1 na třeba 99 tak se to samo přesměruje na showDoneTasks=1 to je nějaké zajímavé toto :)

Mikulas Dite
Člen | 756
+
0
-

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.

CZechBoY
Člen | 3608
+
0
-

zajímavé, ale 1 není bool ale int :) to samé platí pro 99, 999999, 888, 1.001 ne?

Mikulas Dite
Člen | 756
+
0
-

A jak jinak chceš v url zapsat boolean?

vranacik
Člen | 9
+
0
-

@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)

Filip Procházka
Moderator | 4668
+
0
-

Na tohle existují šikovné tabulky.

CZechBoY
Člen | 3608
+
0
-

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

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

@Tharos: Kdyby mě něco napadlo tak dám vědět :)

Editoval HosipLan (9. 6. 2011 9:43)

_Martin_
Generous Backer | 679
+
0
-

@CZechBoY: Co zkusit trochu hledat? Prvních několik odkazů vede do Nette dokumentace (a na další Nette stránky), kde najdeš odpovědi na své otázky.

CZechBoY
Člen | 3608
+
0
-

já mám dokumentaci přečtenou, ale prostě ji nechápu, v pozdějších krocích už se nepíše co kam patří tak v tom mám prostě bordel

_Martin_
Generous Backer | 679
+
0
-

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.