質問 > フロント機能 > 注文者が届け先に含まれていない場合に代引を決済方法から除外する |
フロント機能
スレッド表示 | 古いものから | 前のトピック | 次のトピック | 下へ |
投稿者 | スレッド |
---|---|
Rights |
投稿日時: 2021/1/21 18:25
対応状況: 解決済
|
一人前 登録日: 2019/3/12 居住地: 投稿: 99 |
Re: 注文者が届け先に含まれていない場合に代引を決済方法から除外する デバッグモードを解除して、再度同じ状況を再現してログを確認した所、
[ログ抜粋] [2021-01-21 17:16:48] front.INFO [8f606601] [d21093a] [1] [Eccube\Log\Logger:log:66] - [注文処理] フォームエラーのため, 購入エラー画面へ遷移します. [9] [POST, /shopping/checkout, ShoppingController の checkout で引っ掛かっていたようです。 OrderType の buildForm の冒頭で、 // ShoppingController::checkoutから呼ばれる場合は, フォーム項目の定義をスキップする. if ($options['skip_add_form']) { return; } の処理が入っていますが、拡張側にはこの処理を入れていませんでした。 この処理を加える事で、注文完了まで進める事ができました。 ありがとうございました。 |
umebius |
投稿日時: 2021/1/20 22:41
対応状況: −−−
|
神 登録日: 2016/7/22 居住地: 投稿: 2085 |
Re: 注文者が届け先に含まれていない場合に代引を決済方法から除外する エラーメッセージなどは表示されないとのことですが、購入エラーはシステムエラーにならないためデバッグモードでも止まらず、ログを見ないと確認が難しいです。
「購入エラー」と言う文言が含まれるログはでてないですか? あるいは「予期しないエラー」の可能性もあります。
|
Rights |
投稿日時: 2021/1/19 18:10
対応状況: −−−
|
一人前 登録日: 2019/3/12 居住地: 投稿: 99 |
Re: 注文者が届け先に含まれていない場合に代引を決済方法から除外する OrderTypeを拡張して、注文者が届け先に含まれていない場合、決済方法の配列から代引きを除外するようにし、想定する挙動にする事ができましたが、注文完了画面で「購入エラー」となります。
デバッグモードで動かしていますが、エラーメッセージなどは表示されません。 以下、ソースです。(/app/Customize/Form/Extension/OrderTypeExtension.php) namespace Customize\Form\Extension; use Doctrine\ORM\EntityManager; use Doctrine\Common\Collections\ArrayCollection; use Eccube\Form\Type\Shopping\OrderType; use Eccube\Entity\Delivery; use Eccube\Entity\Order; use Eccube\Entity\Payment; use Eccube\Repository\DeliveryRepository; use Eccube\Repository\OrderRepository; use Eccube\Repository\PaymentRepository; use Symfony\Bridge\Doctrine\Form\Type\EntityType; use Symfony\Component\Form\FormEvent; use Symfony\Component\Form\FormEvents; use Symfony\Component\Form\FormInterface; use Symfony\Component\Form\AbstractTypeExtension; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Validator\Constraints\NotBlank; class OrderTypeExtension extends AbstractTypeExtension { private $entityManager; public function __construct( EntityManager $entityManager ) { $this->entityManager = $entityManager; } /** * {@inheritdoc} */ public function buildForm(FormBuilderInterface $builder, array $options) { // 支払い方法のプルダウンを生成 $builder->addEventListener(FormEvents::POST_SET_DATA, function (FormEvent $event) { /* 注文者情報の取得 */ $Order = $event->getData(); if (null === $Order || !$Order->getId()) { return; } /* 配送方法の取得 */ $Deliveries = $this->getDeliveries($Order); /* 決済方法の取得 */ $Payments = $this->getPayments($Deliveries); /* 利用可能な決済方法の取得 */ $Payments = $this->filterPayments($Payments, $Order->getPaymentTotal()); /* 注文者が届け先に含まれない場合、代金引換の除外 */ $orderName = $Order->getName01() .$Order->getName02(); $orderAddr = $Order->getAddr01() .$Order->getAddr02(); /* 届け先情報の取得 */ $payFlag = false; foreach ($Order->getShippings() as $Shipping) { $shippingName = $Shipping->getName01() .$Shipping->getName02(); $shippingAddr = $Shipping->getAddr01() .$Shipping->getAddr02(); /* 注文者=届け先の場合、代引可フラグを有効 */ if(($orderName == $shippingName) && ($orderAddr == $shippingAddr)) { $payFlag = true; } } foreach($Payments as $key => $val) { switch($val) { case '代引': case '代金引換': case '代金引換え': case '代金引き換え': if(!$payFlag) { unset($Payments[$key]); } default: } } $form = $event->getForm(); $this->addPaymentForm($form, $Payments, $Order->getPayment()); }); } /* ▼ /src/Eccube/Form/Type/Shopping/OrderType.php から転用 ▼ */ private function addPaymentForm(FormInterface $form, array $choices, Payment $data = null) { $message = trans('front.shopping.payment_method_unselected'); if (empty($choices)) { $message = trans('front.shopping.payment_method_not_fount'); } $form->add('Payment', EntityType::class, [ 'class' => Payment::class, 'choice_label' => 'method', 'expanded' => true, 'multiple' => false, 'placeholder' => false, 'constraints' => [ new NotBlank(['message' => $message]), ], 'choices' => $choices, 'data' => $data, 'invalid_message' => $message, ]); } /** * 出荷に紐づく配送方法を取得する. * * @param Order $Order * * @return Delivery[] */ private function getDeliveries(Order $Order) { $Deliveries = []; foreach ($Order->getShippings() as $Shipping) { $Delivery = $Shipping->getDelivery(); if ($Delivery->isVisible()) { $Deliveries[] = $Shipping->getDelivery(); } } return array_unique($Deliveries); } /** * 配送方法に紐づく支払い方法を取得する * 各配送方法に共通する支払い方法のみ返す. * * @param Delivery[] $Deliveries * * @return ArrayCollection */ private function getPayments($Deliveries) { $PaymentsByDeliveries = []; foreach ($Deliveries as $Delivery) { $PaymentOptions = $Delivery->getPaymentOptions(); foreach ($PaymentOptions as $PaymentOption) { /** @var Payment $Payment */ $Payment = $PaymentOption->getPayment(); if ($Payment->isVisible()) { $PaymentsByDeliveries[$Delivery->getId()][] = $Payment; } } } if (empty($PaymentsByDeliveries)) { return new ArrayCollection(); } $i = 0; $PaymentsIntersected = []; foreach ($PaymentsByDeliveries as $Payments) { if ($i === 0) { $PaymentsIntersected = $Payments; } else { $PaymentsIntersected = array_intersect($PaymentsIntersected, $Payments); } $i++; } return new ArrayCollection($PaymentsIntersected); } /** * 支払い方法の利用条件でフィルタをかける. * * @param ArrayCollection $Payments * @param $total * * @return Payment[] */ private function filterPayments(ArrayCollection $Payments, $total) { $PaymentArrays = $Payments->filter(function (Payment $Payment) use ($total) { $min = $Payment->getRuleMin(); $max = $Payment->getRuleMax(); if (null !== $min && $total < $min) { return false; } if (null !== $max && $total > $max) { return false; } return true; })->toArray(); usort($PaymentArrays, function (Payment $a, Payment $b) { return $a->getSortNo() < $b->getSortNo() ? 1 : -1; }); return $PaymentArrays; } /* ▲ /src/Eccube/Form/Type/Shopping/OrderType.php から転用 ▲ */ /** * {@inheritdoc} */ public function getExtendedType() { return OrderType::class; } |
468 |
投稿日時: 2021/1/7 1:13
対応状況: −−−
|
神 登録日: 2008/10/26 居住地: 投稿: 3217 |
Re: 注文者が届け先に含まれていない場合に代引を決済方法から除外する デフォルトでは届け先を判断して支払方法を変更する機能はありません。
その為、ご要望の内容はカスタマイズが必要かと思います。
|
Rights |
投稿日時: 2021/1/6 11:18
対応状況: −−−
|
一人前 登録日: 2019/3/12 居住地: 投稿: 99 |
注文者が届け先に含まれていない場合に代引を決済方法から除外する 以前にも旧バージョンなどで既に出ている内容かもしれませんが、
注文者が届け先に含まれない場合、決済方法から代引を除外するようにしたいのですが、これは都度カスタマイズが必要な仕様になりますでしょうか? 1.注文者情報を取得 2.配送先情報とマッチング(会員・非会員のどちらにも対応するため、氏名・住所で比較) 3.注文者情報≠配送先情報の場合は、選択できる決済方法から代引を除外(デフォルトで決済方法に「代引」があるため、決め打ちで外す) |
スレッド表示 | 古いものから | 前のトピック | 次のトピック | トップ |