如果客户在白名单中,Prestashop 自动更改状态

问题描述 投票:0回答:1

我有客户允许在发货后 30 天付款。 出于物流目的,我添加了一个新状态“付款前发货”。我必须手动放置它们。

所以我尝试制作一个 prestashop 模块,在其中将客户 ID 添加到白名单中,当客户下订单时,如果他在白名单中并且付款方式是电汇付款,那么我们将状态更改为“付款前发货”

我是一名Python开发人员,我不熟悉PHP,所以我尝试了不同的东西,我认为我的状态很好,但我的状态更改正确,但顺序不正确。 他首先更改为“付款前发货”,更改后,他切换为“等待电汇”。

<- Here is what it's looking on status changes ->

这是我的钩子:

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

谢谢!摩根

php prestashop
1个回答
0
投票

您不能在您的情况下使用此挂钩,因为在更改订单状态时会调用

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()
,因为这里没有必要。

© www.soinside.com 2019 - 2024. All rights reserved.