You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在OctoberCMS中按分类列出相关博客文章并插入分类ID

在OctoberCMS中为博客文章添加分类关联并展示相关文章

刚好之前做OctoberCMS博客定制的时候解决过类似问题,其实核心就是把分类选择整合到文章编辑流程,再通过模型关联实现相关文章的查询。下面一步步来搞定:

1. 给博客文章模型建立分类关联

既然你已经在rainlab_blog_posts表加了category_id外键,首先得让博客文章模型(RainLab\Blog\Models\Post)知道这个字段对应分类模型。在你的自定义插件的boot()方法里添加模型扩展代码:

use RainLab\Blog\Models\Post;
use RainLab\Blog\Models\Category;

public function boot()
{
    Post::extend(function($model) {
        // 建立文章到分类的一对一关联
        $model->belongsTo['category'] = [
            Category::class,
            'key' => 'category_id'
        ];
    });
}

这个关联会让OctoberCMS自动处理category_id的保存和查询逻辑,不用自己写额外的存储代码。

2. 在文章编辑后台添加分类选择字段

接下来要让编辑文章时能选择分类,通过监听后端表单扩展事件来插入字段:

use Event;
use Backend\Widgets\Form;

public function boot()
{
    // 上面的模型扩展代码...

    Event::listen('backend.form.extendFields', function(Form $widget) {
        // 只针对博客文章的编辑表单,避免影响其他页面
        if (!$widget->getController() instanceof \RainLab\Blog\Controllers\Posts || !$widget->model instanceof Post) {
            return;
        }

        // 添加分类下拉选择框到表单的次要区域(也可以用'tab'指定标签页)
        $widget->addFields([
            'category_id' => [
                'label' => '文章分类',
                'type' => 'dropdown',
                'options' => Category::lists('name', 'id'),
                'emptyOption' => '-- 选择分类 --'
            ]
        ], 'secondary');
    });
}

现在打开后台的文章编辑页面,就能看到分类选择下拉框了,用户选择分类提交后,category_id会自动存入数据库,完全不用手动处理保存逻辑。

3. 在文章详情页展示同分类相关文章

现在数据库里已经有了文章的分类ID,接下来在模型里加一个动态属性,用来获取同分类的其他文章:

Post::extend(function($model) {
    // 之前的belongsTo关联...

    $model->addDynamicMethod('getRelatedPostsAttribute', function() use ($model) {
        // 如果文章没有分类,返回空集合
        if (!$model->category_id) {
            return collect();
        }

        // 查询同分类下的其他文章,排除当前文章,取最新5篇
        return Post::where('category_id', $model->category_id)
            ->where('id', '!=', $model->id)
            ->orderBy('published_at', 'desc')
            ->take(5)
            ->get();
    });
});

然后在博客文章的详情模板(比如plugins/rainlab/blog/posts/post.htm)里,找到页面底部的位置,添加相关文章的渲染代码:

{% if post.related_posts is not empty %}
    <div class="related-posts mt-4">
        <h3 class="mb-3">相关文章</h3>
        <ul class="list-unstyled">
            {% for related in post.related_posts %}
                <li class="mb-2">
                    <a href="{{ related.url }}" class="text-primary">{{ related.title }}</a>
                    <p class="text-muted small mt-1">{{ related.summary|raw }}</p>
                </li>
            {% endfor %}
        </ul>
    </div>
{% endif %}

一些额外的小提示

  • 如果分类数量很多,可以把下拉框改成ajaxdropdown类型,配置search属性让用户可以搜索分类,提升体验。
  • 迁移时建议给外键加上onDelete('set null'),这样删除分类时文章的category_id会设为null,避免数据库报错。
  • 做完修改后记得执行php artisan october:cache:clear清空缓存,确保模型和表单配置生效。

内容的提问来源于stack exchange,提问作者wafutech

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:48:21