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

OJS 3.5插件开发:如何检查登录用户是否拥有自定义Premium角色

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 08:59:29