Nefunkční snippety ve více šablonách pro více render metod

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

Zdravím, pokud má komponenta více render metod vykreslených na stránce na různých místech pomocí {control test} a {control test:count}, pak se při ajaxu při invalidace komponenty neposílají snippety ze všech těchto částí, ale pouze z té hlavní (ty v render() metodě).

Zkoušel jsem to pro klasické latte šablony i pro šablony generované pomocí setSource (viz ukázka).

Ukázka:

class TestComponent extends \Nette\Application\UI\Control {

  public $test = 1;

  public function render() {
    $this->template->setSource('{snippet main}{$body}{/snippet}');
    //$this->template->setFile(APP_DIR."/components/main.latte");
    $this->template->body = Html::el('a')->href($this->link("test!"))
                                         ->setText($this->test)
                                         ->class("ajax");
    $this->template->render();
  }

  public function renderCount() {
    $this->template->setSource('{snippet count}{$body}{/snippet}'); // tento snippet se nepošle
    //$this->template->setFile(APP_DIR."/components/count.latte");
    $this->template->body = $this->test;
    $this->template->render();
  }


  public function handleTest() {
    $this->test = 2;
    $this->invalidateControl();
  }


  protected function createTemplate($class = NULL) {
    return parent::createTemplate(/**/'\Nette\Templating\Template'/**/);
  }
}

Zkoušel jsem na Nette 2.0.3 stabilní, uvolněný 4. 4. 2012
i na RC verzi 2.0.4.

Ani v této RC verzi jsem však nenašel commit, který má opravovat podobný problém. Takže jsem to zkoušel i s tímto zmíněným commitem, ovšem bez úspěchu. Doufám, že nedělám něco špatně, nebo to není feature.

newPOPE
Člen | 648
+
0
-

Nesuvisi to s tymto https://github.com/…e/issues/160 ?

Casper
Člen | 253
+
0
-

newPOPE napsal(a):

Nesuvisi to s tymto https://github.com/…e/issues/160 ?

Vypadá to tak, nicméně nějaký funkční fix jsem tam nenašel, zkoušel jsem doporučení, které tam píše vojtech-dobes, nicméně bez úspěchu.

Z komentářů tohoto issue jsem však ve výsledku nepochopil, jestli skutečně jde o bug, který by se měl řešit nebo ne. Jak to tedy bude? Popřípadě existuje nějaký workaround nebo něco?

duke
Člen | 650
+
0
-

Co render nahradit za renderMain a udělat nový render a v něm volat renderMain i renderCount, v šablonách pak volat renderMain nebo renderCount a render nechat jen pro ajax?

hrach
Člen | 1834
+
0
-

Jednoduche. Do metody render prijdej

public function render() {
    $this->template->setSource('{snippet main}{$body}{/snippet}');
    //$this->template->setFile(APP_DIR."/components/main.latte");
    $this->template->body = Html::el('a')->href($this->link("test!"))
                                         ->setText($this->test)
                                         ->class("ajax");
    $this->template->render();
    if ($this->isAjax()) {
         $this->renderCount();
    }
}

problem by mel resit tento commit od pavla ptacka.

Editoval hrach (8. 7. 2012 16:07)

Casper
Člen | 253
+
0
-

To je přeci nesmysl, oba dva předpokládáte, že jde o dvě části komponenty, které se vykreslují hned za sebou, jenže to není to co potřebuji. Potřebuji obě části vykreslit jinde na stránce jak jsem psal v prvním příspěvku.

newPOPE
Člen | 648
+
0
-

@Casper sko tam ide o to, ze sa vzdy poslu spat vsetky snippety. Co v principe nevadi :-) aj ked je to otazka vkusu. Problem tam vidim s parametrami ktore do tych renderov mozu vstupovat.

hrach
Člen | 1834
+
0
-

jak pise newPOPE, volani render v ajaxu to nevypise za sebou, ale posle dva snippety, ktery se ti zmeni na tech ruznych mistech. Neni to pekne, je to funkcni.

Casper
Člen | 253
+
0
-

hrach napsal(a):

jak pise newPOPE, volani render v ajaxu to nevypise za sebou, ale posle dva snippety, ktery se ti zmeni na tech ruznych mistech. Neni to pekne, je to funkcni.

Aha, už chápu. Díky za odpověď, alespoň nějaký workaround, co funguje. Nicméně bude se to řešit jako bug Nette? Myslím, že by bylo vhodně, aby toto fungovalo v distribučním balíku bez takoývhto „hacků“.

newPOPE
Člen | 648
+
0
-

To je tazko (jeden to za bug povazuje iny nie :-D).

Riesenie nie je uplne easy uz nejeden sa o to pokusal…

Ja osobne pouzivam snippety len na urovni presenterov a nie komponent (tam sa mi zda to funguje korektne).

hrach
Člen | 1834
+
+1
-

@Casper: pokud se na to podivas z perspektivy

public function render()
{
    $this->renderLabel();
    $this->renderInput();
}
public function renderLabel() {}
public function renderInput() {}

a v sablone pouzivas jen {control xxx:label} a {control xxx:input}, uz to moc jako hack nevypada a da se to povazovat za „pekny“ kod, toto radil uz @duke :)

newPOPE
Člen | 648
+
0
-

@hrach napada ma, ze este by si mal dat pozor na

<?php
	{control xxx}
?>

Nie som si isty co sa stane, predpokladam vsak, ze sa vyrenderuju 1-x renderov, ci?

hrach
Člen | 1834
+
0
-

@newPope jojo, to bys pak nemel pouzivat, no… :)