Nefunkční ajax a snippety
- wotaen
- Člen | 82
Ahoj,
Mám jednoduchou komponentu, která snižuje číslo o jedničku. Vždy po
kliknutí na odkaz se odešle ajaxový požadavek, odečte se jedna
z proměnné a chtěl bych to číslo aktualizovat. Požadavek se odešle
správně, v komponentě se zavolá správná metoda ‚handleSpinDown‘, ale
server mi vrátí jenom tohle ‚{„state“:[]}‘
Z příkladu fifteen jsem pochopil, že ve state se vrátí zdroj té
překreslené komponenty (v mém případě toho spinu), ale neděje
se tak.
Moje komponenta
class ArticlePlacementGrid extends Control {
/** @persistent int */
private $test;
public function __construct() {
parent::__construct();
if (!isset($this->test)) $this->test = 10;
}
public function handleSpinDown() {
$this->test--;
}
public function render() {
$template = $this->template;
$template->test = $this->test;
$template->setFile(dirname(__FILE__) . '/articlePlacementGrid.phtml');
$template->render();
}
}
template té komponenty je…
{snippet}
{$test}
<a href="{link spinDown, 1,0}" class="spinner">Down</a>
{/snippet}
továrnička presenteru, která se stará o vytvoření komponenty…
protected function createArticlePlacementGrid() {
return new ArticlePlacementGrid;
}
view, který zobrazuje komponentu…
@{control articlePlacementGrid}
Tak nevím, co je špatně :(
Díky za pomoc, Michal
- wotaen
- Člen | 82
Takže jsem pokročil, atribut test třídy ArticlePlacementGrid má být
public. Po této změně se již state uloží do odezvy: {„state“:{articlePlacementGrid-test
Nicméně stále mi to nevrací tělo toho snippetu :(
- lucass
- Člen | 89
Zdravím,
já zase zápasím s tímto problémem:
Mám v presenteru šablonu a v ní následují HTML kód:
@{block #content}
<div id="sitemap">
{snippet sitemapForm}
{control sitemapForm}
{/snippet}
{snippet resourceForm}
<div class="inner-form">
<h3 id="add-resource">{=_('Přidat nový zdroj/presenter')}</h3>
{control resourceForm}
</div>
{/snippet}
<div class="inner-form">
<h3 id="add-action">{=_('Přidat novou akci')}</h3>
@{control actionForm}
</div>
</div>
@{/block}
Po odeslání formuláře se provede AJAXové volání obsluhy, ve FireBugu status 200 OK, v JSON poli také cajk. Ale nedojde k překreslení snippetů. Pokud všem udělám následující úpravu, tj. vypustím obalový DIV, vše funguje, tj. snippety se překreslí.
@{block #content}
{snippet sitemapForm}
{control sitemapForm}
{/snippet}
{snippet resourceForm}
<div class="inner-form">
<h3 id="add-resource">{=_('Přidat nový zdroj/presenter')}</h3>
{control resourceForm}
</div>
{/snippet}
{* odstranen actionForm *}
@{/block}
Ještě jsem tedy malinko zaloboroval a zkusil následující:
@{block #content}
{snippet sitemapForm}
{control sitemapForm}
{/snippet}
<div class="inner-form">
<h3 id="add-resource">{=_('Přidat nový zdroj/presenter')}</h3>
{snippet resourceForm}
{control resourceForm}
{/snippet}
</div>
<div class="inner-form">
<h3 id="add-action">{=_('Přidat novou akci')}</h3>
@{control actionForm}
</div>
@{/block}
A výsledek? Stejný jako v prvním případě. Kde by mohl bejt zakopanej čoklik?
Verze Nette 0.9.1 z 9. 10. 2009.
A pak bych měl ještě dotaz: dá se nějak pěkně osnippetit jen jeden FormControl formuláře, aniž bych musel překreslovat celý? Příklad: vyplňuju sitemapu, kde mám SELECT box s existujícími presentery. Jsem uprostřed vyplňování a zjistím, že tam nemám ještě presenter, k němuž novou stránku vytvářím. A tak jej tam chci přidat AJAXovsky. Jenže bych jej dostal do seznamu v SELECT boxu, musím formulář obnovit, a tak přijdu stejně o vyplněná data. Takže bych chtěl jen aktualizovat ten FormControl.
Napadlo mě si formulář vykreslit v šabloně ručně a obalit tedy SELECT snippetem, ale tuším v kostech, že to bude mít David zmáknuté lépe;)
Díky.
Editoval lucass (14. 10. 2009 16:54)
- lucass
- Člen | 89
A to sa môže mať dva snippety s rovnakým názvom?
Pardon, to samozřejmě nemůže, ale tuto chybu tam nemám. Stala se při psaní příkladu, jinak by ta šablona byla dlouhá. Takže jsem ten příspěvek upravil, tak to neber v potaz.
A ešte v tom snippete pred ten form dávať zavináč?
Odstranění zavináčů před voláním widgetu unvitř snippetu problém neřeší. V celé aplikaci mám jen tyto dva snippety, které jsou v příkladu.
- lucass
- Člen | 89
Tak tu mám poslední poznatek, který to vše rozchodil. Předchozí příklady jsem upravil, aby se to více podobalo mému případu.
Co jsem musel udělat? Opět zavináč. Musel jsem ho odstranit u posledního actionFormu, který není osnippetován. Což už teď vůbec nechápu, ale funguje to, což je důležité (update: už to chápu, přečtl jsem si https://forum.nette.org/…agie-v-praxi, kde je jasně napsáno, že se nedává před Form – sorry). Viz:
@{block #content}
{snippet sitemapForm}
{control sitemapForm}
{/snippet}
<div class="inner-form">
<h3 id="add-resource">{=_('Přidat nový zdroj/presenter')}</h3>
{snippet resourceForm}
{control resourceForm}
{/snippet}
</div>
<div class="inner-form">
<h3 id="add-action">{=_('Přidat novou akci')}</h3>
{control actionForm} {* tady nesmi byt zavinac, ac nejsme uvnitr snippetu *}
</div>
@{/block}
Teď bych ještě poprosil o vyřešení dotazu, jak osnippetovat jen jeden FormControl z AppFormu.
Editoval lucass (14. 10. 2009 16:57)