0

system.log に 2 つの問題があり、解決できない問題があります。サイトは正常に動作しているようですが、これらの進行中のエラーをログから削除したいと考えています。


注意: 未定義の変数: order in /var/www/... 17 行目

// 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);
}

申し訳ありませんが、間違ったコードを投稿しました。アイテムと注文の両方の部分に同じ (デバイダー) エラーが表示されたため、エラーログを調べたときに混乱しました。

4

3 に答える 3

2

最初のケースでは、その行を次のように変更してみてください

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

2番目のケースでは、が 0"vat"の場合にどの値に移動する必要があるか正確にわかりません。次のようなことをする必要があると思います$order->getBaseShippingAmount()

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

267 行目のどこかに追加されますが、コードを見ないと確実に判断するのは困難です。

于 2012-09-20T16:48:05.077 に答える
2

残念ながら、Magento コードは、通知と見なされる論理エラーに対する PHP の許容度に依存しているようです。

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

が設定されていない場合$orderは、注文の店舗 ID の代わりに NULL を使用します。

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

2 番目のファイル:

$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が、印刷されたアカウントが最後の小数点まで「チェック」し、29.99 ではなく 10.33 + 10.33 + 9.33 = 30.00 などの奇妙な結果を避けるために、おそらくそこにあるのでしょう。

私は書くだろう

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

しかし、たとえ数学的にはより健全であっても、結果が Magento が他の場所で出力するものと「一致」しない可能性があるのではないかと心配しています。

ループで使用$orderしている場合 (アイテムが何であれ同じ値を取得していることを意味します)、ループの前に VAT を計算してからループ内で使用することをお勧めします。

于 2012-09-20T17:01:17.543 に答える
1

通知はエラーではありません。無視することを選択するか、次orderを使用して変数が存在するかどうかを確認できissetます。

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

通常、答えは定義されていないため (少なくとも数学的には定義されていません) 、ゼロによる除算は常に避ける必要があります。除算を行う前に、分母がゼロでないことを確認してください。

于 2012-09-20T16:38:01.727 に答える