widget v blocku ⇒ problém s AJAXem

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

Zdravím. Narazil jsem na problém s ajaxovým požadavkem zavolaným komponenty vnořené do blocku. Pro účely vysvětlení uvádím triviální příklad – inkrementátor, stránku obsahující pouze číslo (0) a odkaz pro jeho inkrementování. Následují zdrojové kódy:

presenter:

<?php
class DefaultPresenter extends Presenter
{
	public $oldLayoutMode = FALSE;
	public function createComponentInc($name) { return new Inc; }
	protected function beforeRender() {
		if (!Environment::getSession()->isStarted()) {
			Environment::getSession()->start();
		}
	}
}
?>

komponenta:

<?php
class Inc extends Control {
	/** @persistent */
	public $n = 0;

	public function render() {
		$template = $this->template;
		$template->n = $this->n;
		$template->setFile(dirname(__FILE__) . '/Inc.phtml');
		$template->render();
	}

	public function handleInc() {
		$this->n++;
		$this->invalidateControl('n');
	}
}
?>

její šablona:

{snippet n}
<a href="{link inc}" class="ajax">inc</a>: {$n}
{/snippet}

K šabloně celého presenteru mám dvě varianty, pro stručnost uvádím pouze obsah tagu body, v hlavičce mám includované jquery.js, jquery.nette.js a navázání ajaxováho volání na odkazy třídy ajax.

První varianta:

@{control inc}

Druhá varianta:

@{block #a}
	@{control inc}
{/block}

Zatímco v první variantě vše funguje jak má, v druhé variantě mi ajaxové volání vrací (mou „oblíbenou“) chybu.

InvalidStateException

Cannot send header after HTTP headers have been sent (output started at /home/miroslav/www/nic/app/temp/c-Nette.Template/_72a2be4003a9de39463a481571904ab5.Default.default.phtml.php:61).

Na řádce 61 není naprosto nic zajímavého, je tam <?php, které následuje po </html>.

Zkusil jsem i variantu bez komponenty, s celým kódem pouze v presenteru a ta funguje s blockem i bez blocku. Toto je tedy minimální příklad, ve kterém nastává můj problém.

Nevíte prosím někdo, co dělám špatně?

Díky!

EDIT: ještě doplním, že revize Nette je 492 ze svn (teď se dívám, že tedy asi poslední, co vůbec v svn vyšla a vyjde??).

Editoval buff (22. 9. 2009 10:05)

vlki
Člen | 218
+
0
-

Hm, mohl bys někam nahodit ten soubor z cache? (temp/c-Nette.Template/_72a2be4003a9de39463a481571904ab5.Default.default.phtml.php)

Nějak se mi nelíbí to nastavení sessions v beforeRender. Ač by to mělo být v pohodě, co když to zakomentuješ/přesuneš do startup?

Ondřej Brejla
Člen | 746
+
0
-

Co zkusit zavináč před /block? Tedy @{/block}

buff
Člen | 63
+
0
-

No jo, ono fakt to @{/block} zabralo. A to jsem si myslel, že zavináčům víceméně rozumím :-P

Takže to vygenerované php z šablony už nikam nepošlu, pokud nebude ten zájem trvat.

Děkuju moc.