バージョン選択

フォーラム

メニュー

オンライン状況

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

サイト内検索

質問 > フロント機能 > 注文者が届け先に含まれていない場合に代引を決済方法から除外する

フロント機能

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
Rights
投稿日時: 2021/1/6 11:18
対応状況: −−−
常連
登録日: 2019/3/12
居住地:
投稿: 59
注文者が届け先に含まれていない場合に代引を決済方法から除外する
以前にも旧バージョンなどで既に出ている内容かもしれませんが、
注文者が届け先に含まれない場合、決済方法から代引を除外するようにしたいのですが、これは都度カスタマイズが必要な仕様になりますでしょうか?

1.注文者情報を取得
2.配送先情報とマッチング(会員・非会員のどちらにも対応するため、氏名・住所で比較)
3.注文者情報≠配送先情報の場合は、選択できる決済方法から代引を除外(デフォルトで決済方法に「代引」があるため、決め打ちで外す)
468
投稿日時: 2021/1/7 1:13
対応状況: −−−
登録日: 2008/10/26
居住地:
投稿: 2812
Re: 注文者が届け先に含まれていない場合に代引を決済方法から除外する
デフォルトでは届け先を判断して支払方法を変更する機能はありません。
その為、ご要望の内容はカスタマイズが必要かと思います。


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

Rights
投稿日時: 2021/1/19 18:10
対応状況: −−−
常連
登録日: 2019/3/12
居住地:
投稿: 59
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;
}
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


EC-CUBEペイメント

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

統計情報

総メンバー数は68,624名です
総投稿数は99,575件です

投稿数ランキング

1
seasoft
7333
2
468
2812
3
AMUAMU
2712
4
nanasess
2123
5
umebius
1843
6
yuh
1612
7
red
1430
8
h_tanaka
1062
9
fukap
907
10
tsuji
864
11
shutta
835
12
tao_s
793
13 ramrun 789
14 karin 657
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.