Nefunkční ajax a snippety

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

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
+
0
-

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 :(

wotaen
Člen | 82
+
0
-

Aha, asi nebudu první kdo podcenil zavináče :), v šablony @layout.html chyběl u


@{$content}

Těd to valí ok

P.S. Snad tenhle monolog někomu pomůže :)

Editoval wotaen (8. 9. 2009 15:35)

Kenn
Člen | 110
+
0
-

Díky moc za ten monolog :) hraju si tady s něčím podobným asi hodinku a tohle problém vyřešilo.

lucass
Člen | 89
+
0
-

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)

Jod
Člen | 701
+
0
-

A to sa môže mať dva snippety s rovnakým názvom?
A ešte v tom snippete pred ten form dávať zavináč?

lucass
Člen | 89
+
0
-

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
+
0
-

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)

lucass
Člen | 89
+
0
-

Ola napsal(a):

Viz https://forum.nette.org/…agie-v-praxi

Už se stalo. Právě mě napadlo si to přečíst důkladněji, díky.