[2.0.12] Ajax vrati prazdny JSON

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

Ahojte, viem ze to tu uz na fore sa objavilo niekolko krat ale cca tak 3–4 roky dozadu.

skusam naimplementovat ajax podla kucharky ale zial bezuspesne :/

presenter je absolutne totozny sablona index.phtml nasledovne:

	{block content}
		<div id="content">
			{snippet ajaxChange}
				{$anyVariable}
			{/snippet}

			<a n:href="changeVariable!" class="ajax">Change variable!</a>
		</div>
	{/block}
	{block script}
		{control js 'jquery-2.0.3.js', 'nette.ajax.js'}
		<script>
		$(function () {
			$.nette.init();
		});
		</script>
	{/block}

po kliknuti sa mi vrati len odpover v tvaru:

{"state":{"lang":"cs","server":"test.localhost.com"}}

Co robim spatne? da sa to nejako oddebagovat alebo zisiti ci vobec ten snippet bol invalidovany a nanovo vykresleny ? ..

Dakujem

Editoval HappyFace (10. 9. 2013 13:12)

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Pokud by byl, server by ho vrátil v odpovědi v poli snippets. Invaliduješ ten snippet na serveru v onom signálu? Nemůže tomu něco zabránit?

HappyFace
Člen | 162
+
0
-

vojtech.dobes napsal(a):

Pokud by byl, server by ho vrátil v odpovědi v poli snippets. Invaliduješ ten snippet na serveru v onom signálu? Nemůže tomu něco zabránit?

lang a server su predpokladam persistentne hodnoty,ktore si nette preposiela.

public function beforeRender()
{
	parent::beforeRender();
	if ($this->isAjax()) {
		$snippet = 'ajaxChange';
		print('Start invalidateControl: ');
		$this->invalidateControl($snippet);
		print($this->isControlInvalid($snippet));
	}
}

pre istotu som prehodil tu invalidaciu do before render aby bolo iste ze vo vykresleniu nic nezabranuje a pridal print aby som si overil ze k invalidacii aj doslo.
vysledok:

Start invalidateControl: 1{"state":{"lang":"cs","server":"test.localhost.com"}}

vyzera ze vsetko sa vykonalo spravne ale data pre snippet nikde :/ .. prosim ta co by tomu mohlo zabranit ? premyslal som ze by to mohlo robit acl-ko ale to sa skontrolovalo uz daavno

Editoval HappyFace (10. 9. 2013 13:59)

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Ukaž celý presenter, prosím.

HappyFace
Člen | 162
+
0
-

vojtech.dobes napsal(a):

Ukaž celý presenter, prosím.

nieje problem ale je to presne to same co na tej stranke

	class HomePresenter extends \BasePresenter
	{
		/** @var string */
		private $anyVariable;

		public function handleChangeVariable()
		{
			$this->anyVariable = 'changed value via ajax';
			if ($this->isAjax()) {
				$snippet = 'ajaxChange';
				print('Start invalidateControl: ');
				$this->invalidateControl($snippet);
				print($this->isControlInvalid($snippet));
			}
		}


		public function renderIndex()
		{
			if ($this->anyVariable === NULL) {
				$this->anyVariable = 'default value';
			}
			$this->template->anyVariable = $this->anyVariable;
		}
	}

print si nevsimaj je mi jasne ze prijde nevalidny JSON.

uz som to skusal aj prehodit spat k tomu signalu zial JSON stale bez snippetu :/

v tejto verzii uz sa nepouzivaju ziadne „@“ alebo ine hacky? ked sa sablona pridava cez extends alebo includuje block a podobne?

Editoval HappyFace (10. 9. 2013 14:32)

HappyFace
Člen | 162
+
0
-

Uz som absolutne nadne :/ pre istotu ci to nesposobuje nejaka ta moja vychytavka som si vytvoril nasledovny presenter:

namespace DemoModule
{
	class HomepagePresenter extends \Nette\Application\UI\Presenter
	{
		/** @var string */
		private $anyVariable;


		public function handleChangeVariable()
		{
			$this->anyVariable = 'changed value via ajax';
			if ($this->isAjax()) {
				$this->invalidateControl();
			}
		}


		public function renderIndex()
		{
			if ($this->anyVariable === NULL) {
				$this->anyVariable = 'default value';
			}
			$this->template->anyVariable = $this->anyVariable;
		}
	}
}

a k nemu sablonu index.phtml:

{block #content}
	<div id="content">
		{snippet ajaxChange}
			{$anyVariable}
		{/snippet}

		<a n:href="changeVariable!" class="ajax">Change variable!</a>
	</div>

	<script type="text/javascript" src="/js/jsloader-462bbf86873b-jquery-2.0.3.js?1378731241"></script>
	<script type="text/javascript" src="/js/jsloader-5b31f0cd85f3-nette.ajax.js?1378731241"></script>
	<script>
	$(function () {
		$.nette.init();
	});
	</script>
{/block}

@layout neexistuje

zial vystup je nasledovny:

{"state":[]}

mam taky pocit, ze podla vsetkeho je v mojej verzii nette nejaky bug :(

Editoval HappyFace (10. 9. 2013 16:17)

HappyFace
Člen | 162
+
0
-

Ok, vyriesene .. kaslalo sa to koli mojim macram :/ potom co som ich vylucil tak vsetko o5 zacalo fungovat ako ma .. teraz len prist nato, ktore macro to robi a preco sa tomu tak deje .. vojtech.dobes dik za snahu :)

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Heh, rádo se stalo :). Jaké makro to rozbilo?

HappyFace
Člen | 162
+
0
-

vojtech.dobes napsal(a):

Heh, rádo se stalo :). Jaké makro to rozbilo?

Ospravedlnujem sa ze to tak dlho trvalo :) … robilo to moje macro „autoextends“ alternativa zend extends u sablon .. momentalne to riesim bez macra za pomoci funkcie v latte ale je to naozaj velmi nepekny kusok riadku :( .. funkcne je to cele velmi primitivne ide len o vylepsenie macra extends ke funkcia „$_presenter->template“, prvy parameter meno templaty, druhy parameter sluzi ako poistka aby nedoslo k pripadnemu zacykleniu.. funkcia sa napaja na logiku vyhladavania sablon pre presenter a vrati presnu cestu k pozadovanej sablone, dalej podla pravidla kto prvy prijde prvy berie :) mozes mat defaultnu sablonu napr.„skeletor“ niekde mimo a ak vytvoris rovnomennu sablonu napriklad u presenteru tak sa ti pouzije ta u presenteru … typ *.phtml ma umna prednost pred *.latte.. vravim je to velmi easy way ako pracovat s templatami bez nejakeho premyslania aka je cesta k sablone s moznostou kedykolvek „injectnut“/podstrcit inu bez jedinej upravy kodu :)

{extends $_presenter->template('skeletor',, $template->getFile())}

ak by si vedel mi poradit ako to napisat funkcne do macra bol by som mooc vdacny :)