Closed piotr-placzek closed 4 years ago
Jakie pliki modyfikowałeś?
Puki co to żadnych. To jest fragment pliku archive.html mojego motywu (ma ma celu wyświetlenie listy wszystkich dostępnych postów (z paginacją oczywiście).
Zmienna $blog jest dostępna tylko w szablonie blog.html i użycie jej poza tym szablonem zwróci błąd 'Undefined variable: blog'
Ok. Jak w takim układzie wyświetlić na np. home.html tylko kilka wybranych postów(nowości) oznaczonych konkretnym tagiem ?
Zamysł jest prosty. Strona główna z kilkoma (otagowanymi) postami, do tego strona bloga ze spisem wszystkich postów i sidebar z chmurą tagów widoczny zawsze (na każdym elemencie szablonu).
Czy skoro zmienna $blog jest dostępna tylko w blog.html to znaczy że wykonanie takiej strony w oparciu o BF jest niemożliwe?
Jest możliwe.
{$latestPosts}
— array with the latest posts
{$allTags}
— array with all tags
Ok. może nie jasno się opisałem. Nie oczekuję 5 najnowszych postów. Na home.html chcę pokazać skróty wszystkich postów jakie zostały oznaczone tagiem AT_HOME.
Musisz w takim razie edytować metodę _getLatestPosts()
https://github.com/sruupl/batflat/blob/master/inc/modules/blog/Site.php#L46
Dodać do niej leftJoin
oraz where
, tak jak tutaj: https://github.com/sruupl/batflat/blob/master/inc/modules/blog/Site.php#L105
Następnie w templatce będziesz mógł pobrać posty w pętli {$latestPosts}
, gdzie możesz użyć warunku, by wyświetlić wyłącznie posty o tagu jaki chcesz.
Przy następnej aktualizacji BF to zrobię, bo faktycznie może się przydać.
Dobra, po modyfikacji wygląda to tak:
public function _getLatestPosts()
{
$limit = $this->settings('blog.latestPostsCount');
$rows = $this->db('blog')
->leftJoin('users', 'users.id = blog.user_id')
->where('status', 2)
// ->where('published_at', '<=', time())
->where('lang', $_SESSION['lang'])
->desc('published_at')
// ->limit($limit)
->select(['blog.id', 'blog.title', 'blog.slug', 'blog.cover_photo', 'blog.intro', 'blog.content', 'users.username', 'users.fullname'])
->toArray();
foreach ($rows as &$row) {
// cover url
$row['cover_url'] = url(UPLOADS.'/blog/'.$row['cover_photo']).'?'.$row['published_at'];
// tags
$row['tags'] = $this->db('blog_tags')
->leftJoin('blog_tags_relationship', 'blog_tags.id = blog_tags_relationship.tag_id')
->where('blog_tags_relationship.blog_id', $row['id'])
->toArray();
if ($row['tags']) {
array_walk($row['tags'], function (&$tag) {
$tag['url'] = url('blog/tag/'.$tag['slug']);
});
}
$this->filterRecord($row);
}
return $rows;
}
A listę artykułów przedstawiam tak:
{loop: $latestPosts}
{? $item = $value ?}
{loop: $value.tags}
{if: $value.name == "AT_HOME"}
<article class="project">
<header>
{if: $item.cover_photo}
<a href="{$item.url}">
<img src="{$item.cover_url}" alt="{$item.title}" class="thumbnail">
</a>
{/if}
<h3>{$item.title}</h3>
</header>
<p>{$item.intro}</p>
<div class="text-right">
<a href="{$item.url}" target="blank">Zobacz więcej szczegółów</a>
</div>
</article>
{/if}
{/loop}
{/loop}
Z niecierpliwością czekam na kolejna aktualizację BF.
@klocus help wanted
label mean that you want somebody help to solve an issue. question
label is more relevant in this situation.
I've got 2 posts but I can't display list.
The following code does not return anything.
The following code does return only "1".
Where do I make a mistake?