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

PrestaShop后台订单页按钮绑定函数页面加载即触发问题求助

问题原因

你在构造按钮的href参数时直接调用了addOrderTracking()方法,PHP作为服务端脚本,会在订单详情页渲染阶段直接执行该方法完成数据库写入,href属性最终拿到的只是方法返回的布尔值,不会触发点击后执行的逻辑。

修复方案

步骤1:调整按钮构造逻辑,不直接调用写入方法

将按钮的跳转地址改为你模块的专属处理接口地址,携带必要的订单参数和校验Token,修改hookActionGetAdminOrderButtons代码如下:

public function hookActionGetAdminOrderButtons(array $params)
{
    // 其他原有代码.....

    /** @var \PrestaShopBundle\Controller\Admin\Sell\Order\ActionsBarButtonsCollection $bar */
    $bar = $params['actions_bar_buttons_collection'];
    
    // 生成后台处理接口的合法链接,携带参数+Token校验
    $targetUrl = $this->context->link->getAdminLink('AdminModules', false) . '&configure=' . $this->name . '&action=add_order_tracking&id_order=' . (int)$id_order . '&token=' . Tools::getAdminTokenLite('AdminModules');

    $bar->add(
        new \PrestaShopBundle\Controller\Admin\Sell\Order\ActionsBarButton(
            'btn-secondary', 
            ['href' => $targetUrl], 
            'Create Tracking Number'
        )
    );
}

步骤2:新增点击触发的处理逻辑

在你的模块主文件里新增逻辑,检测到对应请求、校验Token合法后再执行数据库写入,写入完成后跳转回原订单详情页:

public function getContent()
{
    // 检测到对应操作请求
    if (Tools::getValue('action') === 'add_order_tracking' && Tools::getValue('id_order')) {
        // Token校验,防止CSRF攻击
        if (!Tools::isSubmit('token') || Tools::getValue('token') != Tools::getAdminTokenLite('AdminModules')) {
            die('非法请求');
        }
        
        $id_order = (int)Tools::getValue('id_order');
        // 这里根据id_order从数据库查询你需要的其他用户、物流信息,不要从前端传,防止数据篡改
        $order = new Order($id_order);
        $id_client = (int)$order->id_customer;
        $customer = new Customer($id_client);
        $client_name = $customer->firstname . ' ' . $customer->lastname;
        $client_phone = $customer->phone ?: $customer->phone_mobile;
        $address = new Address($order->id_address_delivery);
        $client_address = $address->address1 . ' ' . $address->postcode . ' ' . $address->city;
        $client_email = $customer->email;
        $id_carrier = (int)$order->id_carrier;
        
        // 执行写入操作
        $this->addOrderTracking($id_order, $id_client, $client_name, $client_phone, $client_address, $client_email, $id_carrier);
        
        // 写入完成跳转回原订单详情页
        Tools::redirectAdmin($this->context->link->getAdminLink('AdminOrders', true, [], ['vieworder' => 1, 'id_order' => $id_order]));
    }
}

步骤3:优化写入方法的安全问题

你当前的SQL写法存在SQL注入风险,建议改用PrestaShop内置的参数绑定逻辑:

private function addOrderTracking($id_order, $id_client, $client_name, $client_phone, $client_address, $client_email, $id_carrier): bool
{
    return Db::getInstance()->insert('eprim_tracking', [
        'id_order' => (int)$id_order,
        'id_client' => (int)$id_client,
        'client_name' => pSQL($client_name),
        'client_phone' => pSQL($client_phone),
        'client_address' => pSQL($client_address),
        'client_email' => pSQL($client_email),
        'id_carrier' => (int)$id_carrier,
    ]);
}

不需要保留原来的executeQueries方法,直接调用Db类的insert方法即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 12:15:01