sruupl / batflat

Lightweight, fast and easy CMS for free. Bootstrap ready. https://batflat.org
MIT License
134 stars 54 forks source link

Blog module #27

Closed piotr-placzek closed 4 years ago

piotr-placzek commented 6 years ago

I've got 2 posts but I can't display list.

The following code does not return anything.

{loop: $blog.posts}
<article class="project">
    <header>
        {if: $value.cover_photo}
            <a href="{$value.url}">
                <img src="{$value.cover_url}" alt="{$value.title}" class="thumbnail">
            </a>
        {/if}
        <h3>{$value.title}</h3>
    </header>
    <p>{$value.desc}</p>
    <div class="text-right">
        <a href="{$value.url}" target="blank">(...)</a>
    </div>
</article>
{/loop}

The following code does return only "1".

{?= print_r($blog.posts) ?}

Where do I make a mistake?

klocus commented 6 years ago

Jakie pliki modyfikowałeś?

piotr-placzek commented 6 years ago

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

michu2k commented 6 years ago

Zmienna $blog jest dostępna tylko w szablonie blog.html i użycie jej poza tym szablonem zwróci błąd 'Undefined variable: blog'

piotr-placzek commented 6 years ago

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?

klocus commented 6 years ago

Jest możliwe.

{$latestPosts} — array with the latest posts

{$allTags} — array with all tags

piotr-placzek commented 6 years ago

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.

klocus commented 6 years ago

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

piotr-placzek commented 6 years ago

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.

sim2github commented 5 years ago

@klocus help wanted label mean that you want somebody help to solve an issue. question label is more relevant in this situation.