Předání proměnná z latte do componenty v presenteru

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

Ahoj,
potřeboval bych proměnou z latte šablony nějak dostat do componety v presenteru. Componenta je pro vytvoření formuláře. Půjde to nějak jednoduše udělat?

Filip Procházka
Moderator | 4668
+
0
-

A neměl bys to dělat úplně naopak? V šablonách se neprogramuje.

.:M@rt!n:.
Člen | 201
+
0
-

Ja tam neprogramuju jen jsem si vypsanou promenou z db ulozil do promenné a ted bych s ní potřeboval pracovat ve formuláři v presenteru.

elevate
Člen | 31
+
0
-

A ta se do šablony dostala jak? Z presenteru ne? ;)

.:M@rt!n:.
Člen | 201
+
0
-

To ano. Ale nechci resit zda do mam dobre nebo ne, ale zda je mozné tu promenou do te komponenty nejak dostat?

Děkuji

David Matějka
Moderator | 6445
+
0
-

muzes dostat promennou do render metody, ale predava se az pri vykreslovani.. pokud je tedy nutna treba pro zpracovani formulare, tak je to opravdu pozde, viz zivotni cyklus:

elevate
Člen | 31
+
0
-

nebo si můžeš v presenteru udělat jednoduše setter

//presenter
public function setXY($xy)
{
	$this->xy = $xy;
}

//šablona
{$presenter->setXY($variable)}
.:M@rt!n:.
Člen | 201
+
0
-

elevate napsal(a):

nebo si můžeš v presenteru udělat jednoduše setter

//presenter
public function setXY($xy)
{
	$this->xy = $xy;
}

//šablona
{$presenter->setXY($variable)}

díky to bude ono ;) akorat mam ten problem s ulozenim te hodnoty. Mám:

$this->xyRepository->create($this->xy, $this->user->getIdentity()->name . " " . $this->user->getIdentity()->surname, $form->values->text, new \Nette\DateTime);

takto ji nemohu použít pro uložení do db?

elevate
Člen | 31
+
0
-

Na to ti odpoví obrázek výše.

Předpokládám, že toto řešíš v eventu onSuccess nebo něčem takovym.
To znamená, že se komponenta vytvoří na úrovni handle<signal> a v té době je ještě property $xy prázdná. Hodnotu do ní přidáš až na úrovni render<View>

----edit

Pokud formulář neni odeslaný, tak se komponenta vytváří až při renderování. (Vždy se vytvoří až když je nutně potřeba), takže v tomto případě když nastavíš setXY před vykreslením komponenty (nad {control form}/{form form}), tak to funguje bez problémů.

Editoval elevate (11. 12. 2013 14:30)

.:M@rt!n:.
Člen | 201
+
0
-

teď tě moc už nechápu. v presenteru mám:

public function setXY($xy)
{
  $this->xy = $xy;
}
    protected function createComponentResponseForm() {
	//vytvoření a odeslání formuláře na responseFormsubmitted
    }


    public function responseFormSubmitted(Form $form) {
       $this->xyRepository->create($this->xy, $this->user->getIdentity()->name . " " . $this->user->getIdentity()->surname, $form->values->text, new \Nette\DateTime);


    }

a v šabloně:

 {$presenter->setXY($xy)}

{form responseForm}

EDIT: Tak jsem došel k funkčnímu řešení. při vytváření formu jsem tu proměnou uložil to hidden pole a jde to tak jak potřebuji. Díky za rady.

Editoval .:M@rt!n:. (11. 12. 2013 14:41)

elevate
Člen | 31
+
0
-

Takhle se volají metody:

startup
action
handle
render

Při obyčejném vykreslení, se ti komponenta vytváří až když je potřeba (v šabloně {form responseForm}).
Takže:
startup
action
handle
render: // nastavíš proměnnou, vytvoří se komponenta

Ale když je formulář odeslanej, tak zpracování formuláře probíhá na úrovni handle

startup
action
handle: vytvoří se komponenta a ty si z ní vytáhneš values a ukládáš, ale xy == null
render: //nastavíš proměnnou

Editoval elevate (11. 12. 2013 14:49)