Nefunkční snippety ve více šablonách pro více render metod
- Casper
- Člen | 253
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.
- Casper
- Člen | 253
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?
- hrach
- Člen | 1838
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
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ů“.
- hrach
- Člen | 1838
@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 :)