neobnoví se snippet v komponentě

trta911
Člen | 35
+
0
-

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 | 794
+
+1
-

@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 | 35
+
0
-

@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 | 794
+
+1
-

@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 | 35
+
0
-

@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.