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
相关产品推荐
相关产品推荐

