この関数は、単一の割引コードを使用してグローバルなパーセンテージを正常に計算しますが、コードがグローバルではなく特定の範囲のアイテムを割引するのに問題があります。バスケットセッションは、ID、名前、説明、価格、数量などを保持しています...しかし、これまでに試したことはすべて失敗しました.foreachループに実装する必要があることに気付きました(すべてのアイテムを一方向で壊したり更新したりします)または別のもの)または完全に別の方法を使用しますが、どのように進めるかは本当にわかりません。
私は経験豊富な PHP 開発者ではありません。基本的なマークアップの学習と操作を楽しんでいるだけです。誰かが提供できる有用な指針は非常に高く評価されます。ありがとう!
$code = $this->request['code'];
$discount_status = 'NONE'; // no discount available / applied
if ( !empty($this->config['DISCOUNT_CODE']) && !empty($this->config['DISCOUNT_PERCENT']) && !empty($code) ) {
if ( $code == $this->config['DISCOUNT_CODE'] ) {
$discount_status = 'OK';
}
else {
$discount_status = 'ERROR';
}
}
// calculate basket total
$basket_value = 0;
$discount_factor = 1;
if ( $discount_status == 'OK' ) {
// apply discount
$discount_factor = ( 100 - $this->config['DISCOUNT_PERCENT'] ) / 100;
}
if ( !empty($_SESSION['basket']) && is_array($_SESSION['basket']) ) {
foreach( $_SESSION['basket'] as $basketItem ) {
// Apply discount to each item separately
$basket_value += sprintf("%.02f", $basketItem['detail_price'] * $discount_factor) * $basketItem['qty'];
}
}
// check delivery cost
$delivery_area = $this->DeliveryAreaManager->getRecord($this->request['da']);
if ( !empty($delivery_area['cost']) && ( $delivery_area['free_from'] <= 0 || $basket_value < $delivery_area['free_from'] ) ) {
$basket_value += $delivery_area['cost'];
}
// return JSON response
$data = JSONUtils::encode(
array(
'discount_status' => $discount_status,
'basket_value' => sprintf("%.02f", $basket_value),
)
);
return $data;