如何在Strapi后台图书关联下拉中仅显示已发布作者?
解决Strapi关联下拉仅显示已发布作者的问题
要实现Book内容类型关联作者时,下拉仅展示已发布状态的作者,有几种实用方案,按需选择:
方法一:全局过滤作者查询(简单直接)
如果所有查询作者的场景都只需要已发布记录,可以修改Author的API服务:
- 打开项目里的
src/api/author/services/author.js(没有就新建) - 重写
find方法,强制添加已发布状态过滤:
module.exports = ({ strapi }) => { const originalFind = strapi.service('api::author.author').find; return { async find(params) { // 给查询参数加上已发布状态过滤 params.filters = { ...params.filters, status: 'published' }; return originalFind(params); } }; };
- 重启Strapi服务,之后所有查询作者的接口(包括Book的关联下拉)都会只返回已发布的作者。
注意:这个方法会全局生效,要是你需要在其他场景查询草稿作者,就别用这个。
方法二:仅针对Book的关联下拉过滤(精准控制)
如果只想在Book的关联下拉里过滤已发布作者,不影响其他查询场景,可以扩展Admin插件实现:
- 新建或修改
src/admin/app.js(没有就创建) - 添加以下代码,拦截Book关联作者的查询请求:
import React from 'react'; import { prefixPluginTranslations } from '@strapi/helper-plugin'; import pluginId from './pluginId'; export default { register(app) { app.registerPlugin({ id: pluginId, initializer: () => { // 修改Content Manager中Book编辑页的关联查询逻辑 app.getPlugin('content-manager').modifyComponent('collectionType.editView', ({ component }) => { return ({ ...props }) => { if (props.collectionType === 'api::book.book') { // 替换原有的关联查询方法,添加过滤条件 const originalFetch = props.fetchRelatedCollection; props.fetchRelatedCollection = async (args) => { if (args.relation === 'author') { args.filters = { ...args.filters, status: 'published' }; } return originalFetch(args); }; } return React.createElement(component, props); }; }); }, isReady: true, name: 'Custom Book Author Filter', }); }, bootstrap(app) {}, registerTrads({ locales }) { return locales.map((locale) => { return { data: prefixPluginTranslations(require(`./translations/${locale}.json`), pluginId), locale, }; }); }, };
- 重启Strapi服务,进入Book的编辑页面,关联作者的下拉就只会显示已发布的记录了。
方法三:保存时验证(补充防护)
如果担心下拉过滤失效,还可以在Book的生命周期钩子中添加验证,确保只能选择已发布作者:
- 打开
src/api/book/content-types/book/lifecycles.js(没有就新建) - 添加创建和更新时的验证逻辑:
module.exports = { async beforeCreate(event) { const { data } = event.params; if (data.author) { // 查询选中作者的状态 const author = await strapi.db.query('api::author.author').findOne({ where: { id: data.author }, select: ['status'] }); if (author.status !== 'published') { throw new Error('只能选择已发布的作者'); } } }, async beforeUpdate(event) { const { data } = event.params; if (data.author) { const author = await strapi.db.query('api::author.author').findOne({ where: { id: data.author }, select: ['status'] }); if (author.status !== 'published') { throw new Error('只能选择已发布的作者'); } } } };
这个方法会在保存Book时校验作者状态,就算下拉里出现草稿作者,也无法完成保存。
内容的提问来源于stack exchange,提问作者Yash Chhajer
相关产品推荐
相关产品推荐

