Ztráta proměnné po odeslání

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

Mám následující zkrácený kód, asi blbě bych řek', protože po odeslání dostavám:
Notice: The variable 'edit' does not exist in template. in C:\Inetpub\wwwroot\test\Fepo_nette\libs\Nette\loader.php on line 4202
První načtení proběhne v pořádku, ale po odeslání tomu zmizí zmíněná proměnná. Jak tomu zabránit? A dneska už fakt končím…

<?php
final class UserUpdPresenter extends BasePresenter{

	public $SQL;
	public function startup(){
		parent::startup();
		$this->SQL = new SQL;
	}

	protected function createComponentActualForm(){
		$data = $this->template->edit;

		$form = new AppForm;
		...
		...
		return $form;

	}

	public function OkClicked(SubmitButton $button)
	{
		$set = $button->getForm()->getValues();
		unset ($set['jina'],$set['pass'],$set['pass2'],$set['user']);
		$this->SQL->updateRecord('user',$set,$set['id']);

		$this->flashMessage('Změna byla uložena...','Success');
		//$this->redirect('this');
	}

	public function CancelClicked(SubmitButton $button)
	{
		$this->redirect('Admin:');
	}

	public function renderDefault($id){
		$data = $this->SQL->getRecord('user',$id);
		$this->template->edit = $data;
	}
}

Editoval 22 (24. 2. 2010 20:48)

toka
Člen | 253
+
0
-

Je to záměrné, předávat si z renderu do vytváření komponenty obsah proměnné přes šablonu? Opravdu ji v té šabloně potřebuješ? Nebylo by lepší, nestačilo by:

...
public $data;
...

protected function createComponentActualForm() {
  $data = $this->data;
...
}

public function renderDefault($id){
  $this->data = $this->SQL->getRecord('user',$id);
}

Editoval toka (24. 2. 2010 20:56)

Ondřej Mirtes
Člen | 1536
+
0
-

To pořád nemůže fungovat, protože pokud se ten form vytvoří dřív, než ve fázi render, tak $this->data je prázdné.

Co:

protected function createComponentActualForm() {
  $data = $this->SQL->getRecord('user',$id);
...
}

:)

22
Člen | 1478
+
0
-

@toka: předem díky moc za tvoji celodenní spolupráci dnes a všem ostatním, co to museli číst.
Jasně, v template to nepotřebuju, definovaním public proměnné se to vyřešilo.

22
Člen | 1478
+
0
-

@Ondřej: no komponenta se volá v renderDefault(), takže data tam jsou, prazdný to je až po odeslání, tedy teď $this-data

Editoval 22 (24. 2. 2010 21:19)

toka
Člen | 253
+
0
-

Ondřej Mirtes napsal(a):

To pořád nemůže fungovat, protože pokud se ten form vytvoří dřív, než ve fázi render, tak $this->data je prázdné.

Co:

protected function createComponentActualForm() {
  $data = $this->SQL->getRecord('user',$id);
...
}

:)

Věřím ti, ale někde jsem to takto tuším použil, a nebyl s tím problém. Zatím tedy vždy vše fungovalo v pořadí render a createComponent. Tak nevím, jestli na to spoléhám špatně.

toka
Člen | 253
+
0
-

Nejde spíš o to, co obsahuje $id v renderDefault() po odeslání?

22
Člen | 1478
+
0
-

no asi by se tam to $id mělo eventuelně vracet po OK clicku:

$form->addHidden('id');
...
public function OkClicked(SubmitButton $button){
	$set = $button->getForm()->getValues();
        unset ($set['jina'],$set['pass'],$set['pass2'],$set['user']);
        $this->SQL->updateRecord('user',$set,$set['id']);

        $this->flashMessage('Změna byla uložena...','Success');
        $this->redirect('this',array('id'=>$set['id']));

???

Editoval 22 (24. 2. 2010 22:06)