如何在octobercms中过滤多个类别的博文?

时间:2018-04-21 05:05:56

标签: octobercms octobercms-plugins octobercms-backend

10月CMS如何过滤多个类别的博文?我正在使用RainLab Blog插件。该插件仅允许使用一个类别进行过滤。我想要一个综合的结果。请帮忙。

2 个答案:

答案 0 :(得分:2)

您需要使用一些自定义代码根据多个类别进行过滤。如果仍使用PostList组件,请进行以下更改,您将能够根据多个类别筛选列表。

我在下面做的是修改PostList组件,首先通过分叉并用posts变量替换filteredPosts变量。然后,要设置filteredPosts,编写代码以获取所有博客帖子并仅返回包含$categories数组中类别的博客。 不可否认,这种方法绝对不是最有效的,可以进一步改进

  1. 将PostList组件添加到页面
  2. 标记

    中添加以下代码
    <ul class="post-list">
        {% for post in filteredPosts %}
        <li>
            <h3><a href="{{ post.url }}">{{ post.title }}</a></h3>
    
            <p class="info">
                Posted
                {% if post.categories.count %} in {% endif %}
                {% for category in post.categories %}
                    <a href="{{ category.url }}">{{ category.name }}</a>{% if not loop.last %}, {% endif %}
                {% endfor %}
                on {{ post.published_at|date('M d, Y') }}
            </p>
    
            <p class="excerpt">{{ post.summary|raw }}</p>
        </li>
    {% else %}
        <li class="no-data">{{ noPostsMessage }}</li>
    {% endfor %}
    </ul>
    
    {% if posts.lastPage > 1 %}
        <ul class="pagination">
            {% if posts.currentPage > 1 %}
                <li><a href="{{ this.page.baseFileName|page({ (pageParam): (posts.currentPage-1) }) }}">&larr; Prev</a></li>
            {% endif %}
    
            {% for page in 1..posts.lastPage %}
                <li class="{{ posts.currentPage == page ? 'active' : null }}">
                    <a href="{{ this.page.baseFileName|page({ (pageParam): page }) }}">{{ page }}</a>
                </li>
            {% endfor %}
    
           {% if posts.lastPage > posts.currentPage %}
                <li><a href="{{ this.page.baseFileName|page({ (pageParam):(posts.currentPage+1) }) }}">Next &rarr;</a></li>
            {% endif %}
        </ul>
    {% endif %}
    
  3. 在CMS的代码标签中添加以下代码。

    更改

    use RainLab\Blog\Models\Post as BlogPost;
    
    function onStart(){
        //This is where you list the categories you want to display
        $categories = ['cat-a','cat-b'];
        $posts = [];
        foreach(BlogPost::all() as $blog){
            foreach($blog->categories as $cat){
                if(in_array($cat->slug, $categories)) {
                    array_push($posts, $blog);
                    break;
                }
            }
        }
       $this['filteredPosts'] = $posts;
    }
    

答案 1 :(得分:2)

在CMS页面的“代码”标签中:

use RainLab\Blog\Models\Post as BlogPost;

function onStart(){    

       $this['filteredPosts'] = BlogPost::whereHas('categories', function($q) {
            $q->whereIn('slug', ['cat-a','cat-b']);
        })->get(); 

}