Magento系统日志错误,我无法摆脱

时间:2012-09-20 16:33:32

标签: php magento

我的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);
}

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

3 个答案:

答案 0 :(得分:2)

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

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

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

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

要添加到第267行以上的某处,但如果没有看到代码,很难确定。

答案 1 :(得分:2)

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

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

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

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

在第二个文件中:

更新检查您是指$order还是$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),

...我对所有这些round并不满意,但它们可能就在那里,以便打印帐户“检查”到最后一个小数,并避免出现奇怪的结果,例如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在其他地方打印的内容“不匹配”。

如果你在一个循环中使用$order(意味着无论项目是什么,你都有相同的值),你最好在循环之前计算VAT,然后在里面使用它。

答案 2 :(得分:1)

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

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

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