[2.0.12] Ajax vrati prazdny JSON
- HappyFace
- Člen | 162
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
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
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)
- HappyFace
- Člen | 162
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
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
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 :)