如何在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
相关产品推荐
相关产品推荐

