Jak přiřadit proměnnou vlastnímu view?
- Šaman
- Člen | 2663
Ahoj,
potřeboval jsem několik view pro jednu action – postupoval jsem podle tohoto článku.
<?php
public function renderDefault()
{
$this->template->title = "Kalkulátor";
if ($_POST['pomocna_promenna'] === null)
{
$this->view = 'Krok1';
}
else
{
$this->view = 'Krok2';
}
}
?>
Nefunguje mi ale přiřazování proměnných do šablon, resp. do šablony
se přiřadí jen hodnoty nastavené v renderDefault(). Když v metodě
renderPokus() zavolám $this->template->$title = 'pokus';
,
tak v odpovídající šabloně mám v proměnné $title
pořád
‚Kalkulator‘.
Nevíte někdo co s tím, pls?
// Edit: Sorry, už to mám. Nepostupoval jsem podle toho článku a místo
do actionDefault()
jsem to nacpal do renderDefault()
.
V actionDefault()
všechno šlape podle očekávání.
Editoval Šaman (25. 1. 2010 11:13)
- Šaman
- Člen | 2663
Mám ještě jeden problém ohledně vlastních view. Potřeboval bych je
zobrazit jen z action Default
. Tam se totiž vybere správné view
podle stavu dat (nemám data → formulář, mám data → výsledky). Ale teď
je možné volat přímo v url ?action=krok2
a to vede na
krok2
bez kontroly jestli proběhl krok1
.
Dá se tomu jednoduše zabránit, nebo to je záležitost routování?
- Šaman
- Člen | 2663
Foowie napsal(a):
Uložit si do session, jestli uživatel navštívíl krok1… (nebo předávat přes formulář nějakou pomocnou informaci)
To si kontroluju. Ale chtěl bych aby ?action=kalkulator1
vrátilo not found
, i když existuje metoda
renderKalkulator1()
. Jediná platná akce je u mě
?action=default
a ta si výběr pohledu řeší sama.
- Ondřej Mirtes
- Člen | 1536
Pro změnu view včetně šablon musíš tu změnu volat v actionDefault, ne renderDefault.
A brát data přímo z $_POST není hezké – předpokládám, že jde o nějaký formulář, tak tu logiku zpracuj už v odesílací metodě formuláře, ne?
Editoval Ondřej Mirtes (25. 1. 2010 15:22)
- Šaman
- Člen | 2663
Vyki napsal(a):
Tak to osetri v presenteru v metode startup
Díky, tohle pomohlo.
A potřeboval jsem to kvůli formuláři (krok1) a následnému zobrazení
výsledku (krok2).
Zkoušel jsem dvě možnosti:
- Dvě action a dva view. Nevýhodou je, že může přijít požadavek na krok2 v URL (i když nemam data z kroku1). Takže musím kontrolovat v nějaké pomocné proměnné, jestli mám všechna potřebná data pro výpočet.
- Jedna akce a dva view. Proto jsem řešil ty problémy výše. Nevýhodou
je, že jakmile mám vyplněný a odeslaný formulář, už se na něj
nedostanu, protože odkaz na
action=kalkulator
se mi rovnou přesměruje na krok2. Takže musím ručně přidat odkaz na krok1 a vytvořit ho tím, že kontrolní proměnnou vynuluji.
Asi se vrátím k variantě A. I když mi B přijde čistější (aplikace má jen jedno URL bez parametru). Není na to nějaké best practice pravidlo?
K uložení proměnných už používám session, ten kód nahoře byl jen první nástřel.
- Vyki
- Člen | 388
Asi také záleží kolik těch kroků máš. Protože jestli to dobře
chápu tak pro každý krok děláš v presenteru továrničku pro formulář a
potom callback po odeslání. Když těch kroků je 5 tak bys měl v jednom
presenteru 5 form továrniček createComponentFormkrok1
až
`createComponentFormkrok5
a 5 callbacků
formSubmittedkrok1($form)
až
formSubmittedkrok5($form)
+ případně další pomocné funkce.
V takovém případě by se vyplatilo dát každou továrničku + callback do
zvláštního presenteru a přesměrovávat vrámci presenterů. To už
v podstatě odpovídá modulární struktuře webu tak jak je to ukázáno zde:
Distribuce/Examples/Modules-usage
Ve finále to dáš do složky MyformModule a je to :o) Také nejsem kdo ví jak
zkušený nettista, ale když jsem se držel examples z distribuce, vždy se to
vyplatilo.
Editoval Vyki (28. 1. 2010 11:15)
- Ondřej Mirtes
- Člen | 1536
Jeden vícekrokový formulář bych nechával v jednom presenteru, vytvářet pro každý krok vlastní presenter a oddělit to do samostatného modulu je už úplně šílené :)
- Šaman
- Člen | 2663
No, me to taky prijde prehlednejsi v jednom presenteru. Ano, bude to vicekrokovy formular (s mezivysledky), ale opticky oddelit (at ziji lomitka) kazdou tovarnicku a prislusnou obsluhu tlacitek mi nepripada takove zlo, jako provadet pripadne upravy v nekolika souborech. Navic mam krome KalkulatorPresenteru tridu KalkulatorData, ve ktere ukladam data a kterou prenasim v session. A tyhle dve tridy si musi odpovidat (zmena ve formulari – napr. pridani nove polozky – se musi reflektovat i do tridy Data, jinak bude novou polozku ignorovat).
Ackoliv, uvidim az budu mit zpracovane vsechny kroky – mozna to nabobtna tak moc, ze budu delit presenter na mensi casti. Zatim to jde.
Diky vsem za spolupraci. Narazil jsem jeste na par speku, ale casto me reseni napadlo v dobe, kdy jsem sepisoval otazku sem na forum. Uz sama pritomnost tady na foru cloveka tak nejak osvecuje (jako ze clovek se stava osvicenym). Asi je to diky vetsimu nez malemu mnozstvi pritomnych Nette Guru.
Editoval Šaman (28. 1. 2010 12:40)