Komponenta neodešle JSON invalidované snippety, pokud její persistentní parametry nabývají výchozích hodnot

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

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
    );
  }
}