Překlesení template komponenty ajaxem
- BuGeR
- Člen | 45
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
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)
- Jan Suchánek
- Člen | 404
Ještě jsem upravil $this->isAjax() na $this->presenter->isAjax(); Tak zkus a nebo pošli celou komponentu na gist.
- BuGeR
- Člen | 45
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
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
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
Snippet umísti do presenter templatu nad Controlem
a pak volej
redrawControl
přes presenter.
- Michal Hlávka
- Člen | 190
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. :-)