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)