OJS 3.5插件开发:如何检查登录用户是否拥有自定义Premium角色
我最近在开发一款OJS 3.5的插件,想在投稿页面添加一个功能按钮,但这个按钮只能对我们自定义的「Premium」角色用户可见。一开始卡在了怎么获取当前登录用户的角色——毕竟这个Premium不是OJS自带的默认角色(比如管理员、编辑这类),折腾了好一阵子才找到靠谱的解决办法,现在分享给你:
第一步:先获取当前用户和期刊实例
在插件里,你可以通过OJS的请求对象拿到当前登录的用户和当前操作的期刊(也就是Context),这是后续检查的基础:
$request = Application::get()->getRequest(); $user = $request->getUser(); $journal = $request->getContext(); // OJS里Context对应期刊/出版社
第二步:正确检查用户是否拥有自定义Premium角色
之前我用Application::getRoleNames()的方式不太对,因为这个方法只返回系统默认角色的翻译键,自定义角色的信息得从数据库里直接取。我们可以用RoleDAO来获取用户在当前期刊下的所有角色,然后检查是否存在name为premium的角色:
修改你插件里的checkUserPremiumStatus方法,或者直接写一个更可靠的检查逻辑:
private function checkUserPremiumStatus($journal, $user): bool { if (!$user || !$journal) { return false; } try { // 获取RoleDAO实例 $roleDao = DAORegistry::getDAO('RoleDAO'); // 获取用户在当前期刊的所有角色对象 $userRoles = $roleDao->getByUserId($user->getId(), $journal->getId()); // 遍历角色,检查是否有name为premium的自定义角色 foreach ($userRoles as $role) { if ($role->getData('name') === self::PREMIUM) { // self::PREMIUM就是你定义的'premium' return true; } } // 下面保留你原来的订阅检查逻辑(如果需要的话) if ($this->checkIndividualPremiumSubscription($journal, $user)) { return true; } // 机构订阅检查逻辑... } catch (Exception $e) { error_log('检查Premium状态出错: ' . $e->getMessage()); } return false; }
第三步:在模板渲染前判断是否显示按钮
比如在你的handleTemplateDisplay或者handleSubmissionWizardSection方法里,先调用上面的方法检查用户状态,再把这个状态传给模板:
public function handleTemplateDisplay($hookName, $args) { $templateManager = $args[0]; $request = Application::get()->getRequest(); $user = $request->getUser(); $journal = $request->getContext(); // 检查用户是否是Premium角色 $isPremium = $this->checkUserPremiumStatus($journal, $user); // 把状态传给模板,这样模板里就能用{if $isPremium}来控制按钮显示 $templateManager->assign('isPremium', $isPremium); return false; // 让后续钩子继续执行 }
然后在你注入的模板里,就可以通过条件判断来显示按钮了:
{if $isPremium} <button class="btn btn-primary" id="premium-ai-button">AI分析助手</button> {/if}
一些注意事项
- 确保你的自定义Premium角色在OJS后台已经创建,并且
name字段确实是premium(可以在数据库的roles表中确认) - 记得给用户分配这个角色后,要让用户重新登录才能生效
- 如果你的插件还涉及订阅检查,保留原来的逻辑即可,上面的角色检查是优先级最高的判断
内容来源于stack exchange
相关产品推荐
相关产品推荐

