質問 > フロント機能 > 注文者が届け先に含まれていない場合に代引を決済方法から除外する |
フロント機能
フラット表示 | 前のトピック | 次のトピック |
投稿者 | スレッド |
---|---|
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; } |
フラット表示 | 前のトピック | 次のトピック |
題名 | 投稿者 | 日時 |
---|---|---|
注文者が届け先に含まれていない場合に代引を決済方法から除外する | Rights | 2021/1/6 11:18 |
Re: 注文者が届け先に含まれていない場合に代引を決済方法から除外する | 468 | 2021/1/7 1:13 |
» Re: 注文者が届け先に含まれていない場合に代引を決済方法から除外する | Rights | 2021/1/19 18:10 |
Re: 注文者が届け先に含まれていない場合に代引を決済方法から除外する | umebius | 2021/1/20 22:41 |
Re: 注文者が届け先に含まれていない場合に代引を決済方法から除外する | Rights | 2021/1/21 18:25 |