PHP8 対応漏れ?「受注管理>受注登録」画面でシステムエラー
error.log [/manager/order/edit.php] Fatal error(E_ERROR): Uncaught TypeError: Unsupported operand types: float + string in data/class/pages/admin/order/LC_Page_Admin_Order_Edit.php:707
既存の受注情報を編集で、商品の単価を数字以外(例えば あ )を入力し、計算結果の確認ボタンを押すとシステムエラーで落ちます。(数量、税率、値引き、送料、手数料、使用ポイントも同様です。) 数字+文字ではWarninngこそ出ますが落ちません。また、PHP7.4では発生せず。
試しに、LC_Page_Admin_Order_Edit.php の lfCheckError() で
$emsg = false;
if ( isset($arrErrTemp['price']) || isset($arrErrTemp['quantity']) || isset($arrErrTemp['tax_rate']) || isset($arrErrTemp['discount']) || isset($arrErrTemp['deliv_fee']) || isset($arrErrTemp['charge']) || isset($arrErrTemp['use_point']) ) {
$emsg = true;
}
for ($i = 0; $i < $max; $i++) {
if($emsg){
$tax = 0;
$subtotal += 0;
$totaltax += 0;
$totalpoint += 0;
}
else{
// 小計の計算
$tax = SC_Helper_TaxRule_Ex::calcTax($arrValues['price'][$i], $arrValues['tax_rate'][$i], $arrValues['tax_rule'][$i]);
$subtotal += ($tax + $arrValues['price'][$i]) * $arrValues['quantity'][$i];
// 税額の計算
$totaltax += $tax * $arrValues['quantity'][$i];
// 加算ポイントの計算
$totalpoint += SC_Utils_Ex::sfPrePoint($arrValues['price'][$i], $arrValues['point_rate'][$i]) * $arrValues['quantity'][$i];
}
入力値(単価、数量、税率、値引き、送料、手数料、使用ポイント)のチェックでエラーが無い場合のみ現行の処理、 エラーがある場合は、計算に必要な数字を0として処理するよう処理として試してみましたが、
テンプレートedit.tpl:432 側で呼び出される
<!--{$price|sfCalcIncTax:$tax_rate:$tax_rule|n2s}--> 円<br />
においても、Fatal error が発生します。
error.log [/manager/order/edit.php] Fatal error(E_ERROR): Uncaught TypeError: Unsupported operand types: string * float in data/class/util\SC_Utils.php:711 となります。
例えばテンプレートの修正するのはどうでしょう https://jp-seemore.com/web/2657/
あまり私自身どの様な仕様にすべきか言う事に知見がなくご意見するのは、恐縮なのですが、確かにテンプレート側で数字だけを受け付けるように修正するのが手っ取り早そうですね。 管理者側画面ですし、JavaScript回避して数字以外を入力する事もないでしょうから。
テンプレート側でINPUTタグのTYPE属 number が何よりも一番手っ取り早いですね。 ただこれだと空白が入力出来てしまうので、その場合はFatal errorで落ちますね。
テンプレートから sfCalcIncTax 呼び出すところで条件分岐し
<!--{if !($arrErr['price'][$product_index] || $arrErr['quantity'][$product_index] || $arrErr['tax_rate'][$product_index])}-->
何かしらのエラーがある場合は sfCalcIncTax を呼ばないようにするか
そもそも JavaScriptで数字以外は入力させない&数字以外の文字を入力された場合にはそれを削除ですかね。
従来と同じ動作をするように、キャストしてしまう方法もありますが、PHP の改善を無駄にしてしまうのも気が引けて悩ましいですね…
税込単価を PHP 側で計算して、テンプレート変数に渡す方向での回避を試みてます。
$objFormParam->addParam('税込単価', 'price_inctax', '', '', [], [], false);
お試しいただけますと幸いです。 https://github.com/EC-CUBE/ec-cube2/compare/master...seasoftjapan:eccube-2_13:seasoft-829
早速修正案ご作成有難う御座います。 master...seasoftjapan:eccube-2_13:seasoft-829 試しましたとろこ、良い感じで御座います。当方で確認されておりました不具合は解消致しました。
PHP 側で計算してテンプレート変数に渡す方法での修正は、やはり気持ちいいですね。
すみません、1点気になることが。 Warningなので気にしていてはキリが無いのですが、商品追加や変更の度に以下のWarningが出ます。 function calcPriceInctax(&$objFormParam)が使われる度に出るので出来れば解消したいのですが、どうでしょうか?
[/manager/order/edit.php] Warning(E_WARNING): Only the first byte will be assigned to the string offset on [data/class/pages/admin/order/LC_Page_Admin_Order_Edit.php(1332)] from ::1
@bbkids 不具合報告ありがとうございます。
手元環境を別件使用中で検証できないのですが、キーが被ってしまったようです。
$objFormParam->addParam('税額', 'tax', '', '', [], [], false);
$objFormParam->addParam('消費税合計', 'tax');
追って修正を Push します。
早々にご確認有難う御座います。 キーを被らいよう試してみましたとろこ、問題のWarningは出なくなりました。 Pushされましたら、あらためて確認したいと思います。
修正試して見ました。 当初のシステムエラー、及びWarninngの解消確認出来ました。
他に、SC_FormParam で適切な初期値を設定していなくてコケるパターンがあるようなので、修正予定です。
【追記】 push しました。 https://github.com/seasoftjapan/eccube-2_13/tree/seasoft-829-2
明細データは SC_FormParam のインスタンスを分けた方が良い気もしますが、とりあえず現状で目先のエラーが無くなれば、別 Issue かなと考えています。