Komponenta neodešle JSON invalidované snippety, pokud její persistentní parametry nabývají výchozích hodnot
- tomask
- Člen | 9
PHP 5.3.10 / Nette 2.0.3 (testováno i na Nette-dev 2.1 2012–04–23)
Dovolím si prvně uvést kód (Presenter, šablona, továrnička, komponenta, šablona komponenty – v které se mění persistentní stavová vlastnost komponenty), následně slovně popíšu bug. Příklad jsem ořezal na samotnou dřeň, abych zbytečně neudělal botu.
Presenter
class ThreadPresenter extends BasePresenter
{
public function renderDefault()
{
// nothing
}
protected function createComponentThread($name)
{
return new \Diskuze\Controls\ThreadControl(
$this,
$name
);
}
}
Komponenta se vyrábí v šabloně default.phtml
{control thread}
Komponenta
namespace Diskuze\Controls;
class ThreadControl extends \Nette\Application\UI\Control
{
/** @persistent */
public $i = 5;
public function __construct($parent, $name)
{
parent::__construct($parent, $name);
$this->invalidateControl('itemsperpage');
//stejne se chova invalidace cele komponenty: $this->invalidateControl();
}
public function render()
{
$template = $this->createTemplate()
->setFile(dirname(__FILE__) . '/threadControl.phtml');
$template->i = $this->i;
$template->render();
}
}
Šablona Komponenty
{**
* @param int $i
*}
{snippet itemsperpage}
Záznamů na stránku:
{foreach [5,10,15,20,30] as $step}
<a n:href="this i => $step" n:tag-if="$step !== $i" class="ajax">
<b n:tag-if="$step === $i">{$step}</b>
</a>
{sep}<span class="sep">/</span>{/sep}
{/foreach}
{/snippet itemsperpage}
Jak je vidět, v příkladu měním AJAXově vlastnost
$i komponenty, která je nastavena jako persistentní a má
výchozí hodnotu 5. Jakmile kliknu na jakoukoliv jinou než výchozí hodnotu
(10,15…), v JSONu se správně pošlou nová data snippetu
itemsperpage
. Jakmile kliknu na 5 – výchozí hodnota –
nedostanu žádnou JSON odpověď, server odešle celou HTML stránku. To
považuji za bug.
Vypozoroval jsem, že pokud vytvořím komponentu už v render metodě, odešle se JSON i pro výchozí hodnotu persistentního parametru. Ale tím by pozbývaly továrničky na komponenty smyslu.
class ThreadPresenter extends BasePresenter
{
public function renderDefault()
{
$this['thread'];
}
protected function createComponentThread($name)
{
return new \Diskuze\Controls\ThreadControl(
$this,
$name
);
}
}