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

PrestaShop 8.1.1:限制销售代表仅查看自身创建的订单

PrestaShop 8.1.1 实现销售代表仅查看自身创建订单的方案

针对你提到的权限组ID为5的「销售代表」角色,以下是无需修改核心文件、基于自定义模块的实现方案,适配PrestaShop 8的Symfony架构:

核心思路

利用PrestaShop的事件钩子机制,在订单列表查询和订单详情加载时添加权限过滤:

  1. 订单列表页:通过钩子修改查询构建器,仅返回当前员工创建的订单
  2. 订单详情/编辑页:验证当前订单的创建者是否为登录员工,否则拦截访问

步骤1:创建自定义模块

新建模块(示例名称:RestrictSalesRepOrders),模块结构如下:

modules/
└── restrictsalesreporders/
    └── restrictsalesreporders.php

模块核心代码

<?php
if (!defined('_PS_VERSION_')) {
    exit;
}

class RestrictSalesRepOrders extends Module
{
    public function __construct()
    {
        $this->name = 'restrictsalesreporders';
        $this->tab = 'administration';
        $this->version = '1.0.0';
        $this->author = 'Your Name';
        $this->need_instance = 0;
        $this->bootstrap = true;

        parent::__construct();

        $this->displayName = $this->l('Restrict Sales Rep to Own Orders');
        $this->description = $this->l('Limits sales representatives (group ID 5) to only view/edit orders they created.');
        $this->ps_versions_compliancy = [
            'min' => '8.0',
            'max' => _PS_VERSION_
        ];
    }

    public function install()
    {
        return parent::install() && 
               $this->registerHook('actionListQueryBuilderModifier') &&
               $this->registerHook('actionGetOrder');
    }

    // 过滤订单列表查询
    public function hookActionListQueryBuilderModifier($params)
    {
        // 仅处理订单列表的查询
        if ($params['className'] !== 'Order') {
            return;
        }

        $employee = Context::getContext()->employee;
        if (!$employee) return;

        // 检查当前员工是否属于销售代表组(ID=5)
        $isSalesRep = false;
        foreach ($employee->getGroups() as $group) {
            if ($group['id_group'] == 5) {
                $isSalesRep = true;
                break;
            }
        }

        if (!$isSalesRep) return;

        // 修改查询,仅保留当前员工创建的订单
        $qb = $params['query_builder'];
        $qb->andWhere('o.id_employee = :employee_id')
           ->setParameter('employee_id', $employee->id);
    }

    // 拦截非自身创建的订单访问
    public function hookActionGetOrder($params)
    {
        $employee = Context::getContext()->employee;
        if (!$employee) return;

        // 检查当前员工是否属于销售代表组(ID=5)
        $isSalesRep = false;
        foreach ($employee->getGroups() as $group) {
            if ($group['id_group'] == 5) {
                $isSalesRep = true;
                break;
            }
        }

        if (!$isSalesRep) return;

        $order = $params['order'];
        // 若订单创建者不是当前员工,跳转到无权限页面
        if ($order->id_employee != $employee->id) {
            Tools::redirectAdmin(Context::getContext()->link->getAdminLink('AdminForbidden'));
        }
    }
}

步骤2:安装并测试模块

  1. 将模块文件夹上传到PrestaShop的modules目录
  2. 后台登录,进入「模块管理器」搜索并安装该模块
  3. 使用销售代表账号登录后台:
    • 订单列表仅显示该员工创建的订单
    • 尝试访问其他员工创建的订单,会被跳转到无权限页面

关键说明

  • 权限组ID验证:确保代码中id_group == 5与你实际创建的销售代表组ID一致(可通过后台权限组编辑链接的id_group参数确认)
  • 兼容性:该方案基于PrestaShop官方钩子,不修改核心文件,支持8.x版本升级
  • 扩展:若需要支持更多权限组,可将id_group == 5改为数组判断(如in_array($group['id_group'], [5,6]))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 16:12:50