Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 由于选择,状态更改为重复_Php_Prestashop 1.6 - Fatal编程技术网

Php 由于选择,状态更改为重复

Php 由于选择,状态更改为重复,php,prestashop-1.6,Php,Prestashop 1.6,我正在执行一个名为hookActionProductCancel的默认挂钩。钩子可以很好地执行我的代码,但是有一部分基于已发送的退款/退货复选框执行了不止一次 例如: 如果我有4个要选择的复选框,并且我选择了3个,那么我的订单在订单详细信息历史记录中将有3个退款状态。也可以在订单页面中看到 public function hookActionProductCancel($params) { $query = new DbQuery(); $query->select('i

我正在执行一个名为hookActionProductCancel的默认挂钩。钩子可以很好地执行我的代码,但是有一部分基于已发送的退款/退货复选框执行了不止一次

例如:

如果我有4个要选择的复选框,并且我选择了3个,那么我的订单在订单详细信息历史记录中将有3个退款状态。也可以在订单页面中看到

public function hookActionProductCancel($params) 
{
    $query = new DbQuery();
    $query->select('id_order_state')
    ->from('order_state_lang')
    ->where('name = ' . "'Refund'");
    $refund_status = Db::getInstance()->getValue($query);

    $objOrder = new Order($id_order);
    $history = new OrderHistory();
    $history->id_order = (int)$objOrder->id;
    $history->id_employee = $cookie->id_employee;
    $history->changeIdOrderState($refund_status, (int)($objOrder->id));
    $history->add(true);
    $history->save();
}

我们衷心感谢您的指导。谢谢。

从订单中取消产品时,控制器会循环检查每个选定的产品并执行actionProductCancel挂钩

Tools::getValue'id\u order\u detail'将是每个将被取消的订单详细id的数组

知道您可以组合使用钩子、数组中订单细节ID的计数和模块中的计数器

您的主模块类可以包含如下代码:

public static $cancelledProductCount = 0;

public function hookActionProductCancel($params) 
{
    self::$cancelledProductCount++;

    if (self::$cancelledProductCount == count(Tools::getValue('id_order_detail'))) {
        $query = new DbQuery();
        $query->select('id_order_state')
              ->from('order_state_lang')
              ->where('name = ' . "'Refund'");
        $refund_status = Db::getInstance()->getValue($query);

        $objOrder = new Order($id_order);
        $history = new OrderHistory();
        $history->id_order = (int)$objOrder->id;
        $history->id_employee = $cookie->id_employee;
        $history->changeIdOrderState($refund_status, (int)($objOrder->id));
        $history->add(true);
        $history->save();
    }
}

所以,每次执行取消产品挂钩时,您都会将计数器增加1,并与取消项目的计数进行比较。如果它们是相同的,您知道这是最后一次执行挂钩,所以请更改订单状态。

因为hookActionProductCancel对订单中的每个取消的产品都执行。啊,我明白了,这正是我面临此错误的原因。是否有一个变通方法或任何其他可用的挂钩,我可以使用,将返回我作为1?我的其余代码运行正常,但这现在引起了一个小问题。@那么,默认情况下,这是在循环中运行的吗?对于hookActionProductCancelYes,每个取消的产品都会执行一个循环,并执行一个钩子。Tools::getValue'id\u order\u detail'是一个已取消产品的数组,因此您可以在模块中创建一个计数器,当计数器与已取消产品的数量相同时,更改您的订单状态。是的,我正在对代码的其他部分使用Tools::getValue'id\u order\u detail',并使用foreach循环访问这些值。我可以在上面发布的代码中问一下,根据选中复选框的数量,它是如何运行的吗?代码的哪一部分触发了它切换状态的次数?我在这方面迷路了。谢谢。谢谢,我很快就会试一试的!非常感谢!您好@drot,非常感谢您的建议,它工作得非常好。if语句中缺少一个,但是你太棒了!解决方案是完美的。谢谢你。@Entu很高兴它起作用了。你是对的,它不见了。