Překlesení template komponenty ajaxem

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

Dobrý den,

mám komponentu na formulář:

public function createComponentProfileForm() {
	$form = new UI\Form;
	...
 	$form->onSuccess[] = $this->processForm;
    return $form;
}

metoda po odeslání:

public function processForm(UI\Form $form) {
	if ($this->presenter->isAjax()) {
		$this->template->test = "AJAX";
		$this->invalidateControl();
		$this->redrawControl();
	}
}

Snažím se tedy po odeslání formuláře přepsat proměnnou „test“, ale nepřepíše se, a na stránce mám pořád „NO AJAX“. Nevíte čím to může být?

render vypadá takto:

public function render() {
	$this->template->setFile(__DIR__ . '/ProfileForm.latte');
	if($this->presenter->isAjax() !== true)
	$this->template->test = "NO AJAX";
	$this->template->render();
}

v šabloně mám pak:

{snippet profileForm}
{form profileForm class=>ajax}
	{ifset $test}{$test}{/ifset}
	...

Využívám knihovnu nette.ajax.js.

Děkuji všem za pomoc.

Jan Suchánek
Člen | 404
+
0
-

Ahoj, udělej si proměnou test a ukládej do ní průběžně, tzn. v render neřeš zda máš či nemáš ajax ale řeš uložení do šablony.

protected $test = 'NO AJAX';

public function processForm(UI\Form $form) {
    if($this->presenter->isAjax()) $this->redrawControl();
    $this->test = "AJAX";
}

public function render() {
    $this->template->test = $this->test;
    $this->template->setFile(__DIR__ . '/ProfileForm.latte');
    $this->template->render();
}

Editoval Jan Suchánek (24. 8. 2015 15:05)

BuGeR
Člen | 45
+
0
-

Ahoj,

děkuji za reakci. Bohužel to nepomohlo, a proměnná se stále nepřepisuje.

Jan Suchánek
Člen | 404
+
0
-

Ještě jsem upravil $this->isAjax() na $this->presenter->isAjax(); Tak zkus a nebo pošli celou komponentu na gist.

BuGeR
Člen | 45
+
0
-

Stále bohužel nefunguje.
Komponenta:

class ProfileForm extends UI\Control {

	/** @var \Kdyby\Translation\Translator */
	private $translator;

	public $test = "NO AJAX";


	public function setTranslator(\Kdyby\Translation\Translator $translator) {
		$this->translator = $translator;
	}


	public function createComponentProfileForm() {

        $form = new UI\Form;
      	// formulářové prvky..
 		$form->onSuccess[] = $this->processForm;
        return $form;
	}

	public function processForm(UI\Form $form) {
		if($this->presenter->isAjax()) $this->redrawControl();
   		 $this->test = "AJAX";
	}

	public function render() {
	    $this->template->test = $this->test;
	    $this->template->setFile(__DIR__ . '/ProfileForm.latte');
	    $this->template->render();
	}
}

Šablona latte je stejná jako v prvním příspěvku.

Michal Hlávka
Člen | 190
+
0
-

Dostaneš se do podmínky v processForm? A ještě jedna věc – co ti vrací server po odeslání ajax požadavku?

Editoval emptywall (24. 8. 2015 15:14)

BuGeR
Člen | 45
+
0
-

Ano, podmínka se splní.

Už jsem teď ale konečně přišel na to, v čem byl problém, v presenteru se mi v metodě afterRender() kontroloval isAjax() a do toho spouštěl kód, který vracel chybu, a tam se to asi seklo. Tímpádem je to vyřešeno, děkuji.

Každopádně, neexistuje nějaké elegantnější řešení, než to házet do proměnné instance a z ní to pak tahat? Chtěl bych zpracovávat chybové hlášky – addError nad tím formulářem, a popřípadě flashmessages, neumím si moc představit, jak to dávat do těch proměnných instance.

Editoval BuGeR (24. 8. 2015 15:20)

Michal Hlávka
Člen | 190
+
+1
-

Snippet umísti do presenter templatu nad Controlem a pak volej redrawControl přes presenter.

Michal Hlávka
Člen | 190
+
0
-

Nepříjde mi tak hrozný mít proměnnou v instanci a házet do ní chybové hlášky. Udělej z ní pole, které pak posílej do šablony a tam s tím pracuj. :-)

akadlec
Člen | 1326
+
0
-

@BuGeR to chceš jen na hlášky z formu? Od toho máš flashmessages tam to můžeš sypat. Máš je k dispozici jak v komponentách tak i v presenterech. A pokud chceš flashky řešit globálně tak můžeš třeba pomocí extension