バージョン選択

フォーラム

メニュー

オンライン状況

27 人のユーザが現在オンラインです。 (15 人のユーザが フォーラム を参照しています。)
登録ユーザ: 0
ゲスト: 27
もっと...

サイト内検索

質問 > フロント機能 > Shippingデータが取れない??

フロント機能

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
mackarel
投稿日時: 2021/7/20 15:08
対応状況: −−−
半人前
登録日: 2018/11/2
居住地:
投稿: 22
Shippingデータが取れない??
▼テンプレート
[EC-CUBE] 3系最新
[レンタルサーバ] さくら
[PHP] 7.4

構築済みのEC-CUBEを別サーバに移管したのですが、
ShoppingController.phpでフォームを作成している箇所、
getShippingFormBuilder→ShoppingService::getShippingFormBuilder内の1071行目辺り、
$Order->setPayment($payments[0]);


Undefined offset: 0
のエラーが発生しております。
調べると、
ShoppingService::getFormPayments内の998行目で取得しているshippingsにデータが入っていないようで、それに起因して支払い方法($payments)が取得できていないようです。
(nullではなく、shippings内のcollectionの配列データがない状態)

ここは必ずデータが入っているものと思うのですが、そうじゃないケースってあるのでしょうか・・・??また、解決方法知っている方いらっしゃいましたらお助けいただければ幸いです!!

補足:
ソースやDBはまるごとコピーしたので差はないです。

エラーが発生しているのは↓このあたりです。
// 配送業者の支払方法を取得
        $payments = $this->getFormPayments($deliveries, $Order);

        //配送方法の選択によっては支払い方法がないものが選択されている状態になるため、その場合支払い方法の1つ目を設定するように。
        $isFound = false;
        foreach ($payments as $payment) {
            if ($payment->getId() == $Order->getPayment()->getId()) {
                $isFound = true;
            }
        }
        if ($isFound == false) {
            $Order->setPayment($payments[0]);
            $Order->setPaymentMethod($payments[0]->getMethod());
            $Order->setCharge($payments[0]->getCharge());
            $Order = $this->getAmount($Order);
        }

【追記】
↑↑カスタマイズしてない箇所かと思いきやカスタマイズしてる箇所でした。
行数等デフォから異なっております。

原因らしきところは↓このあたりになります。(こちらは非カスタマイズ)
public function getFormPayments($deliveries, Order $Order)
    {
        $productTypes = $this->orderService->getProductTypes($Order);

        if ($this->BaseInfo->getOptionMultipleShipping() == Constant::ENABLED && count($productTypes) > 1) {
            // 複数配送時の支払方法
            $payments = $this->app['eccube.repository.payment']->findAllowedPayments($deliveries);
        } else {
            // 配送業者をセット
            $shippings = $Order->getShippings();
            $payments = array();
            foreach ($shippings as $Shipping) {
                $paymentsShip = $this->app['eccube.repository.payment']->findPayments($Shipping->getDelivery(), true);
                if (!$payments) {
                    $payments = $paymentsShip;
                } else {
                    $payments = array_intersect($payments, $paymentsShip);
                }
            }
        }
        $payments = $this->getPayments($payments, $Order->getSubTotal());

        return $payments;
    }

468
投稿日時: 2021/7/21 12:34
対応状況: −−−
登録日: 2008/10/26
居住地:
投稿: 3034
Re: Shippingデータが取れない??
$paymentsが空の配列になる可能性はあると思います。
支払方法には金額による有効/無効の判定もあり条件に一致しない場合は空の配列が返ってくるようになっているかと思います。
function getFormPaymentsの最後にある
$payments = $this->getPayments($payments, $Order->getSubTotal());
で呼び出しているfunction getPayments()は以下の内容ですが
ループ中のifで1度も真にならなかった場合、
$pays = array();
が返ってきます。

public function getPayments($payments, $subTotal)
{
    $pays = array();
    foreach ($payments as $payment) {
        // 支払方法の制限値内であれば表示
        if (!is_null($payment)) {
            $pay = $this->app['eccube.repository.payment']->find($payment['id']);
            if (intval($pay->getRuleMin()) <= $subTotal) {
                if (is_null($pay->getRuleMax()) || $pay->getRuleMax() >= $subTotal) {
                    $pays[] = $pay;
                }
            }
        }
    }
    return $pays;
}


デフォルトでは支払方法が空の配列の場合も想定して処理が実装されているかと思います。


----------------
株式会社シロハチ
■ECCUBE2系、3系構築カスタマイズご相談ください。
EC-CUBE3マニュアル
blog

スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


EC-CUBEペイメント

公式ストアEC-CUBE4系デザインテンプレート続々リリース中

統計情報

総メンバー数は72,226名です
総投稿数は101,643件です

投稿数ランキング

1
seasoft
7333
2
468
3034
3
AMUAMU
2712
4
nanasess
2156
5
umebius
2011
6
yuh
1612
7
red
1452
8
h_tanaka
1086
9
tsuji
936
10
fukap
907
11
shutta
835
12
tao_s
793
13 ramrun 789
14 karin 689
15 sumida 641
16
homan
633
17 DELIGHT 572
18
patapata
502
19
flealog
485
20 tonton 437


ネットショップの壺

EC-CUBEインテグレートパートナー

Copyright© EC-CUBE CO.,LTD. All Rights Reserved.