Překreslení konkrétního dynamického snippetu nefunguje

Nax
Člen | 35
+
0
-

Zdravím,

na eshopu mám nette s verzí 2.3.10.

Pokouším se udělat asynchroní načítání elementů (konkrétně http://shatle.com/cs/blog jednotlivých blogů) tak, aby se každý vždy selectnul z db a zobrazil pouze když to bude potřeba.

Zatím jsem k tomu přistoupil tak, že mám jednu snippetArea s názvem items a v ní v cyklu vytvářím snippety s názvem item-$itemId.

Na začátku si z databáze vyselectim všechna IDčka blogu ktere lze zobrazit, to do tempalte pošlu jako $allPosts a potom pošlu do templaty prazdny $posts. Idea byla taková:

{snippetArea items}
	<div class="post clearfix" n:foreach="$allPosts as $postId">
        {snippet item-$postId}
			<a href="javascript:" n:if="!isset($posts[$postId])">
				Pouze prázdný post bez opravdových dat, jen texty "načítám" a bíly obrázek
				<div class="title-img">
					<img src="{$basePath}/img/blog/white.jpg">
				</div>
				<div class="header">
					<div class="title">
                        {_'Načítám'}
					</div>
				</div>
				<div class="abstract">
					<p>{_'Načítám'}</p>
				</div>
				<time>{_'Načítám'}</time>
			</a>
            {if isset($posts[$postId])}
				Pokud je prazdny element výše na obrazovce, zavolej handleGetPostPreview, nastav do $posts[$postId] data k tomuto postu a překresli
				<a n:href="read $post->id, $title">
					<div class="title-img">
						opravdicka data
					</div>
					<div class="header">
						opravdicka data
					</div>
					<div class="abstract">
						opravdicka data
					</div>
					<time>opravdicka data</time>
				</a>
            {/if}
        {/snippet}
	</div>
{/snippetArea}

A po té handle:

public function handleGetPostPreview($postId) {
        $this->template->allPosts = $this->blogModel->getPostsIds();

        $this->template->posts = [
            $postId => $this->blogModel->findAll([
                'active' => 1,
                'id' => $postId,
            ])
        ];

        $this->redrawControl("items");
    }

Nyní bych očekával že funkce handleGetPostPreview při ajaxovém zavolání vrátí jeden konkrétní překreslený snippet podle ID co jsem poslal a já si ho nastavím v browseru tam kam patří, nicméně skutečnost je taková, že v odpovědi dostanu opět všechny elementy prazdne, jako by se posts vubec nenastavilo.

Nevím teď jestli jsem pouze pochopil ty snippety špatně a funguje to uplně jinak, nebo mam něco špatně.

Děkuji za jakoukoliv reakci, už se s tím dělám nějakou dobu a na nic jsem nepřišel :)

Editoval Nax (25. 2. 2018 14:12)

David Matějka
Moderator | 6445
+
0
-

neprepisujes ty promenne v render metode?

Nax
Člen | 35
+
0
-

David Matějka napsal(a):

neprepisujes ty promenne v render metode?

Takto při renderDefault pouze

public function renderDefault() {
        $this->template->posts = [];
        $this->template->allPosts = $this->blogModel->getPostsIds();
    }

Jinak metoda renderGetPostPreview ani neexistuje, jen ten handle

Editoval Nax (25. 2. 2018 14:14)

David Matějka
Moderator | 6445
+
+1
-

nazev akce a signalu jsou dve ruzne veci a i pri zpracovani signalu se budou volat prislusne action a render metody. viz zivotni cyklus presenteru

takze se ti zavola actionDefault, handleGetPostPreview a renderDefault

Nax
Člen | 35
+
0
-

David Matějka napsal(a):

nazev akce a signalu jsou dve ruzne veci a i pri zpracovani signalu se budou volat prislusne action a render metody. viz zivotni cyklus presenteru

takze se ti zavola actionDefault, handleGetPostPreview a renderDefault

Páni, tak to jsem nevěděl. Díky moc. Řešení mého problému by tedy mělo být obalení setování posts a allPosts do if(!$this->isAjax())

Díky ještě jednou