Ajax v beforeRendery na zmenu casti obrazovky

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

Ahojte,

chcel by som vytvorit v BasePresentery v beforeRendery kus kodu na zmenu casti obrazovky.

V sablone mam:

{snippet}
{foreach $scc as $sc}
<a class="ajax pull-left" n:href="changeScreen! $sc->id"></a>
<a class="ajax pull-left" n:href="changeScreen! $sc->id"></a>
{/foreach}
Text
{/snippet}

V skratke by sa po kliknut na prvy link by sa mal na obrazovke zobrazit nejaky text (Text 1) a po kliknuti na druhy link zasee nejaky iny text (Text 2).

V basepresentery v beforeRender metode mam:

if (!$this->presenter->isAjax()) {
       \Tracy\Debugger::barDump("nie je ajax");
        //$this->redirect('this');
} else {
	$textID;														 //potrebujem dostat z toho linku
	$this->text = $this->change_text_model->getTextForID($textID);	//tento text tam potrebujem zobrazit
}

No, dostavam sa iba do prvej vetvy (takze ajax nepozna!). Nette ajax mam pritom includnuty a aj v konzole vidim, ze ajaxovo prebieha poziadavka GET.

cendak
Člen | 21
+
0
-

Problém bude patrně v tom, že nemáš pojmenovaný snippet v šabloně a že ho pak v presenteru neinvaliduješ. Mrkni sem.

{snippet header}
  {foreach $scc as $sc}
    <a class="ajax pull-left" n:href="changeScreen! $sc->id"></a>
    <a class="ajax pull-left" n:href="changeScreen! $sc->id"></a>
  {/foreach}
  Text
{/snippet}
if ( $this->isAjax() ) {
  $this->redrawControl("header");
} else {
  $this->redirect("this");
}

Editoval cendak (25. 4. 2016 10:29)

CZechBoY
Člen | 3608
+
0
-

Musíš do latte dát snippet s textem

{foreach $scc as $sc}
	<a class="ajax pull-left" n:href="changeScreen! $sc->id"></a>
	<a class="ajax pull-left" n:href="changeScreen! $sc->id"></a>
{/foreach}

{snippet text}
	Text
{/snippet}

a pak v tom presenteru

public function handleChangeScreen($id)
{
	if (!$this->presenter->isAjax()) {
		\Tracy\Debugger::barDump("nie je ajax");
		//$this->redirect('this');
	} else {
		$textID = $id;                                                         //potrebujem dostat z toho linku
		$this->template->text = $this->change_text_model->getTextForID($textID);  //tento text tam potrebujem zobrazit
		$this->redrawControl('text');
	}
}

Editoval CZechBoY (25. 4. 2016 10:31)

oneRow
Člen | 10
+
0
-

Chalani, dakujem za odpovede, ale chyba musi byt niekde inde. Toto som skusal a nejde to stale – stale spadam do vetvy !$this->presenter->isAjax().

Este asi dodam, ze ten problem je trosku komplexnejsi, iba som sa ho snazil zjednoduchcit. V tej sablone – v tom snippete je totiz este formular (mozno to zmeni nieco na veci), vyzera takto:

{foreach $scc as $sc}
    <a class="ajax pull-left" n:href="changeScreen! $sc->id"></a>
    <a class="ajax pull-left" n:href="changeScreen! $sc->id"></a>
{/foreach}

{snippet}
    Text

	{control mojFormular}
	Tu Vypis hodnotu formularu mojFormular po ajaxovom volani
{/snippet}

Tento formular je velmi jednoduchy a ked kliknem na jeden button, tak sa mi AJAXovo premaze tento formular a do databazy sa odosle hodnota formulara. To mi vsetko dobre funguje – skutocne sa po kliknuti na button formular premaze a odosle do databazy. Problem je iba s tymto 2. AJAXom – teda touto zmenou textu.

Cize vlastne ako keby sa v 1 snippete snazim menit 2 prvky pomocou 2 ajaxovych volani – da sa nieco take vobec?

Prekvapivo, v spracovani toho formlaru uz nespadam do vetvy !$this->presenter->isAjax(), ale AJAX rozozna a spracuje – toto je pre mna zahada.
Tam to spracovanie vyzera takto:

if (!$this->presenter->isAjax()) {
               $this->redirect('this');
           } else {
               $this->redrawControl();
               $this->udaje_model->pridajStav($values['stav']) 		//dostanem sa sem, narozdiel od prveho pripadu

Editoval oneRow (25. 4. 2016 10:51)

CZechBoY
Člen | 3608
+
+1
-

No ty musíš ještě invalidovat snippet, který je v šabloně presenteru…

class BasePresenter extends Presenter
{
	protected function createComponentForm()
	{
		$form = $this->formFactory->create();

		$form->onSuccess[] = $this->redrawControl('jmeno snippetu');

		return $form;
	}
}