我有客户允许在发货后 30 天付款。 出于物流目的,我添加了一个新状态“付款前发货”。我必须手动放置它们。
所以我尝试制作一个 prestashop 模块,在其中将客户 ID 添加到白名单中,当客户下订单时,如果他在白名单中并且付款方式是电汇付款,那么我们将状态更改为“付款前发货”
我是一名Python开发人员,我不熟悉PHP,所以我尝试了不同的东西,我认为我的状态很好,但我的状态更改正确,但顺序不正确。 他首先更改为“付款前发货”,更改后,他切换为“等待电汇”。
这是我的钩子:
public function install()
{
Configuration::updateValue('ORDER_STATUS_LIVE_MODE', false);
return parent::install() &&
$this->registerHook('header') &&
$this->registerHook('displayBackOfficeHeader') &&
// $this->registerHook('actionOrderStatusUpdate');
// $this->registerHook('actionValidateOrder');
$this->registerHook('actionOrderStatusPostUpdate');
}
我的实际功能:
public function hookActionOrderStatusPostUpdate($params)
{
static $alreadyRun = false;
if ($alreadyRun) {
return;
}
$this->logToFile("Début hookActionValidateOrder");
$orderId = $params['id_order'];
$order = new Order($orderId);
$customer = new Customer($order->id_customer);
$this->logToFile("Commande ID: {$order->id}, Client ID: {$customer->id}, Module de paiement: {$order->module}");
$customStatusId = 20; // Ici l'ID de mon statut
$whitelist = explode(',', Configuration::get('ORDER_STATUS_WHITELIST'));
// Vérifiez si le client est dans la whitelist et que le statut actuel est "En Attente de Virement Bancaire"
if (in_array($customer->id, $whitelist) && $order->current_state == Configuration::get('PS_OS_BANKWIRE')) {
if ($order->module == 'ps_wirepayment') {
$this->logToFile("Commande {$orderId} de client whitelisté, mise à jour du statut à {$customStatusId}");
$order->setCurrentState($customStatusId);
$order->save();
$alreadyRun = true;
}
}
}
private function logToFile($message)
{
$logPath = $this->local_path . 'log/order_status_debug_6.log';
$date = new DateTime();
$timestamp = $date->format('Y-m-d H:i:s');
$logEntry = "[$timestamp] $message\n";
if (!is_dir(dirname($logPath))) {
mkdir(dirname($logPath), 0755, true);
}
file_put_contents($logPath, $logEntry, FILE_APPEND);
}
如果任何 PrestaShop 专家可以提供帮助:D
谢谢!摩根
您不能在您的情况下使用此挂钩,因为在更改订单状态时会调用
hookActionOrderStatusPostUpdate
。
因此,您所做的就是在之前的更改最终确定之前更改状态。
您应该使用
hookActionOrderHistoryAddAfter
(在保存新订单状态后调用)并调整您的代码,如下所示:
public function hookActionOrderHistoryAddAfter($params){
static $alreadyRun = false;
if ($alreadyRun) {
return;
}
$this->logToFile("Début hookActionValidateOrder");
$orderHistory = $params['order_history'];
$orderId = $orderHistory->id_order;
$order = new Order($orderId);
$customer = new Customer($order->id_customer);
$this->logToFile("Commande ID: {$order->id}, Client ID: {$customer->id}, Module de paiement: {$order->module}");
$customStatusId = 20; // Ici l'ID de mon statut
$whitelist = explode(',', Configuration::get('ORDER_STATUS_WHITELIST'));
// Vérifiez si le client est dans la whitelist et que le statut actuel est "En Attente de Virement Bancaire"
if (in_array($customer->id, $whitelist) && $orderHistory->id_order_state == Configuration::get('PS_OS_BANKWIRE')) {
if ($order->module == 'ps_wirepayment') {
$this->logToFile("Commande {$orderId} de client whitelisté, mise à jour du statut à {$customStatusId}");
$order->setCurrentState($customStatusId);
// $order->save();
$alreadyRun = true;
}
}
}
我在最后评论了
$order->save()
,因为这里没有必要。