Překreslení konkrétního dynamického snippetu nefunguje
- Nax
- Člen | 35
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)
- Nax
- Člen | 35
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
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
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