Jak přiřadit proměnnou vlastnímu view?

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

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)

sin
Člen | 82
+
0
-

NE $this->template->$title = ‚pokus‘; ale $this->template->title = ‚pokus‘; bez $ u title

Šaman
Člen | 2663
+
0
-

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

sin napsal(a):

NE $this->template->$title = ‚pokus‘; ale $this->template->title = ‚pokus‘; bez $ u title

Jasně, sorry, to je překlep. Ale chyba byla jinde.

Foowie
Člen | 269
+
0
-

Uložit si do session, jestli uživatel navštívíl krok1… (nebo předávat přes formulář nějakou pomocnou informaci)

Editoval Foowie (25. 1. 2010 11:43)

Šaman
Člen | 2663
+
0
-

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.

Vyki
Člen | 388
+
0
-

Tak to osetri v presenteru v metode startup

<?php
class MyPresenter extends BasePresenter
{
	public function startup()
	{
		if($this->getAction() == "kalkulator1") {
			throw new BadRequestException('Stránka neexistuje');
		}
		parent::startup();
	}
}
?>
Ondřej Mirtes
Člen | 1536
+
0
-

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)

Vyki
Člen | 388
+
0
-

Také moc nechápu na co to potřebuješ. Možná by stálo za to zamyslet se znovu nad celým návrhem té aplikace. Určitě by to šlo udělat čistěji. Potom zjistíš jak používat moduly a celá logika toho návrhu se posune o úroveň víše.

Šaman
Člen | 2663
+
0
-

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:

  1. 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.
  2. 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
+
0
-

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`createComponentFormkrok5 a 5 callbacků formSubmittedkrok1($form)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
+
0
-

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

Vyki
Člen | 388
+
0
-

Nemusím z toho samozřejmě hned dělat modul, ale rozčlenit do do více presenterů mi přijde přehlednější. Měl jsem také na mysli případ kdy to nejsou 2 mini formuláře, ale třeba 5 formulářů o 10ti položkách.

Editoval Vyki (28. 1. 2010 11:32)

Šaman
Člen | 2663
+
0
-

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)