neobnoví se snippet v komponentě
- trta911
- Člen | 32
Mám komponentu kterou mám umístěnou v šabloně:
<div class="row">
{snippetArea controlWrapper}
{control videoWizard}
{/snippetArea}
</div>
V komponentě mám nějakou základní šablonu do které includuju další sub-šablonu:
{snippetArea stepWrapper}
{include "step".$curentStep.".latte"}
{/snippetArea}
ta sub-šablona kromě jiného má v sobě
{snippet uploadedVideo}
<div class="row">
<div class="col-12">
{if !empty($items)}
.....
{/if}
</div>
</div>
{/snippet}
v rámci komponenty po uploadu volám
naja.makeRequest('GET', {plink videoWizard:refreshVideo!}, {});
v komponentě mám
class AddVideoWizardControl extends Control
{
...
public function handleRefreshVideo() : void
{
...
$this->getPresenter()->redrawControl("controlWrapper");
$this->redrawControl("stepWrapper");
$this->redrawControl("uploadedVideo");
}
...
}
ajax request se vykoná v pohodě, ale nepřekreslí se lautr nic. (v network tabu chromu vidím akorát {„state“: []}).
Kde prosím dělám chybu?
Editoval trta911 (19. 2. 2023 22:09)
- m.brecher
- Generous Backer | 758
@trta911
ajax request se vykoná v pohodě, ale nepřekreslí se lautr nic.
Ahoj, na 90% si myslím, že chybu děláš v tom, že v handle metodě komponenty voláš zbytečně snippetArea, která obaluje vykreslení komponenty. Komponenta z třídy UI/Control dle dokumentace Nette „si umí zapamatovat, jestli při signálu došlo ke změnám, které si vyžadují jej překreslit“, takže ji v šabloně obalovat do snippetArea je asi zbytečné.
Udělal jsem malý zjednodušený test podobný Tvému kódu:
class Test extends Control
{
public int $num = 1;
public function handleIncrement()
{
$this->num ++;
$this->presenter->redrawControl('controlWrapper'); // tohle se mě zdá zbytečné
$this->redrawControl('numWrapper');
}
public function render()
{
$this->template->num = $this->num;
$this->template->render(......);
}
}
šablona akce presenteru:
{snippetArea 'controlWrapper'}
{control 'test'}
{/snippetArea}
šablona komponenty:
<p><a n:href="increment!" class="ajax">Exec!</a></p>
{snippet 'numWrapper'}
<p>num: {$num}</p>
{/snippet}
Výsledek: Ajaxový request se pošle, ale šablona se NEPŘEKRESLÍ.
Vyřadil jsem dle mého názoru zbytečný snippetArea okolo komponenty:
class Test extends Control
{
public int $num = 1;
public function handleIncrement()
{
$this->num ++;
// $this->presenter->redrawControl('controlWrapper');
$this->redrawControl('numWrapper');
}
public function render()
{
$this->template->num = $this->num;
$this->template->render(......);
}
}
{* {snippetArea 'controlWrapper'}*}
{control 'test'}
{* {/snippetArea}*}
A takhle upravené už to funguje – Ajaxový request se pošle a šablona se PŘEKRESLUJE !
Editoval m.brecher (20. 2. 2023 2:06)
- trta911
- Člen | 32
@m.brecher
moc děkuji, tohle mě funguje, ale ne v té includované šabloně kde to potřebuji obnovit
basic.latte
{snippetArea stepWrapper}
{include "step".$curentStep.".latte"}
{/snippetArea}
step1.latte
{snippet uploadedVideo}
<div class="row">
<div class="col-12">
{if !empty($items)}
.....
{/if}
</div>
</div>
{/snippet}
tam jsem to zkoušel se snippety, bez snippetů, se snippet areou a nedokázal jsem to přemluvit. Pokud ale snippet přesunu z té zanořené šablony a po tvé radě.
- m.brecher
- Generous Backer | 758
@trta911
tam jsem to zkoušel se snippety, bez snippetů, se snippet areou a nedokázal jsem to přemluvit
OK, zkusil jsem tedy ještě vložit do šablony komponenty další šablonu – zde se již musí dle dokumentace Nette použít {snippetArea} a invalidovat nejprve snippetArea a potom vnořený snippet https://doc.nette.org/…ication/ajax#….
class Test extends Control
{
public int $num = 1;
public function handleIncrement()
{
$this->num ++;
$this->redrawControl('wrapper');
$this->redrawControl('increment');
}
public function render()
{
$this->template->num = $this->num;
$this->template->render(__DIR__.'/test.latte');
}
}
šablona akce
{control 'test'}
šablona komponenty test.latte
<p><strong>Test snippetu</strong></p>
{snippetArea 'wrapper'}
{include 'increment.latte'}
{/snippetArea}
vnořená šablona increment.latte
<p><a n:href="increment!" class="ajax">Inkrementuj</a></p>
{snippet 'increment'}
<p>num: {$num}</p>
{/snippet}
Vyzkoušeno a překreslování funguje.
Takže můžeš vyjít z toho, že takhle použité snippetArea a snippet funguje – v souladu s dokumentací. Chybu budeš mít někde jinde – dodání dat do šablon, nebo javascriptový request, …?
- trta911
- Člen | 32
@m.brecher
mockrát díky! Tak jsem díky tomu zjistil, že se mi v tom handlu (jinak to bylo právě v pohodě tak jsem ani nepojal podezření) ne úplně dobře předávala ta nejdůležitější reference (která nastavuje tu includovanou sub-šablonu) a díky tomu se to nevykreslovalo. Teď už je to ok.