0

我的 system.log 中有两个问题,我正在解决一些问题。该站点似乎运行良好,但我非常想从日志中删除这些持续错误。


注意:未定义的变量:在第 17 行的 /var/www/... 中排序

// line 17
$merchantnumber = $standard->getConfigData('merchantnumber', $order ? $order->getStoreId() : null);

警告:在第 267 行的 /var/www/... 中除以零

// line 267
"vat" => (float)round((string)((round($order->getBaseShippingInclTax(),2)-round($order->getBaseShippingAmount(),2))/round((string)$order->getBaseShippingAmount(),2))*100, 2)

更新

// line 258-281 
                $items = $order->getAllItems();
    foreach ($items as $itemId => $item)
    {
        $invoice["lines"][] = array
        (
            "id" => $item->getSku(),
            "description" => $item->getName(),
            "quantity" => round($item->getQtyOrdered(), 0),
            "price" => $item->getBasePrice()*100,
            "vat" => (float)round((string)((round($item->getBasePriceInclTax(),2)-round($item->getBasePrice(),2))/round((string)$item->getBasePrice(),2))*100, 2)
        );
    }

    $invoice["lines"][] = array
    (
        "id" => $order->getShippingMethod(),
        "description" => $order->getShippingDescription(),
        "quantity" => 1,
        "price" => $order->getBaseShippingAmount()*100,
        "vat" => (float)round((string)((round($order->getBaseShippingInclTax(),2)-round($order->getBaseShippingAmount(),2))/round((string)$order->getBaseShippingAmount(),2))*100, 2)
    );

    return json_encode($invoice);
}

抱歉,我之前发布了错误的代码,在查看错误日志时我很困惑,因为在 Item 和 Order 部分都出现了相同的(Devider)错误。

4

3 回答 3

2

在第一种情况下,您可以尝试将该行更改为

$merchantnumber = $standard->getConfigData('merchantnumber', (isset($order) && $order) ? $order->getStoreId() : null);

在第二种情况下,我无法确切知道如果什么"vat"时候$order->getBaseShippingAmount()是 0 应该去什么值。我怀疑你需要做类似的事情

if (!$order->getBaseShippingAmount()) {
   return;
}

要添加到第 267 行上方的某个位置,但是如果没有看到代码就很难确定。

于 2012-09-20T16:48:05.077 回答
2

不幸的是,Magento 代码似乎经常依赖 PHP 对被认为是通知的逻辑错误的容忍度。

 $merchantnumber = $standard->getConfigData('merchantnumber', $order ?
   $order->getStoreId() : null);

如果$order未设置,我们希望使用 NULL 而不是订单的商店 ID:

 $merchantnumber = $standard->getConfigData('merchantnumber',
   isset($order) ? $order->getStoreId() : null);

在第二个文件中:

更新检查您是否指的是$orderor $item。如果它在一个循环中,它可能是后者。

"vat" => (float)round((string)((round($item->getBaseShippingInclTax(),2)-round($item->getBaseShippingAmount(),2))/round((string)$item->getBaseShippingAmount(),2))*100, 2)

VAT% 是从 ShippingInclTax(即 ShippingAmount + VAT)中反向计算的。只有当 getBaseShippingAmount() 为零时,计算才会崩溃。

为了解决这个问题,我们应该有:

 'vat' => (0 == round($item->getBaseShippingAmount(),2)) ? 0 :
          (float)round((string)(
 (round($item->getBaseShippingInclTax(),2)
 -round($item->getBaseShippingAmount (),2)
 )/round((string)$item->getBaseShippingAmount(),2)
 )*100,2),

...我对所有这些rounds 并不满意,但它们可能在那里,以便打印帐户“检查”到最后一位小数,并避免奇怪的结果,例如 10.33 + 10.33 + 9.33 = 30.00 而不是 29.99。

我会写

 'vat' => (0 == $item->getBaseShippingAmount()) ? 0
        : round(
             100.0*(
               $item->getBaseShippingInclTax()/$item->getBaseShippingAmount()
               -1.0
             )
          ,2),

但即使它在数学上更合理,我担心结果可能与 Magento 在其他地方打印的结果不“匹配”。

If you're using $order in a loop (meaning you've got the same value whatever the item), you'd be better advised in calculating VAT before the loop and then use it inside.

于 2012-09-20T17:01:17.543 回答
1

通知不是错误。您可以选择忽略它,也可以order使用以下命令检查变量是否存在isset

 ...er', isset($order) ? $...

应始终避免除以零,因为答案通常是未定义的(至少在数学上是未定义的)。在尝试进行除法之前,请检查分母是否不为零。

于 2012-09-20T16:38:01.727 回答