バージョン選択

フォーラム

メニュー

オンライン状況

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

サイト内検索

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

フロント機能

新規スレッドを追加する

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

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


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

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;
}
umebius
投稿日時: 2021/1/20 22:41
対応状況: −−−
登録日: 2016/7/22
居住地:
投稿: 2085
Re: 注文者が届け先に含まれていない場合に代引を決済方法から除外する
エラーメッセージなどは表示されないとのことですが、購入エラーはシステムエラーにならないためデバッグモードでも止まらず、ログを見ないと確認が難しいです。

「購入エラー」と言う文言が含まれるログはでてないですか?
あるいは「予期しないエラー」の可能性もあります。


----------------
EC-CUBEカスタマイズ・高速化・脆弱性対策・SEO ご相談ください。

2系・3系から4系へのバージョンアップ実績豊富

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;
}

の処理が入っていますが、拡張側にはこの処理を入れていませんでした。
この処理を加える事で、注文完了まで進める事ができました。

ありがとうございました。


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


 



ログイン


EC-CUBE公式 Amazon Payプラグイン

統計情報

総メンバー数は88,711名です
総投稿数は109,948件です

投稿数ランキング

1
seasoft
7367
2
468
3217
3
AMUAMU
2712
4
nanasess
2313
5
umebius
2085
6
yuh
1819
7
h_tanaka
1638
8
red
1570
9
mcontact
1285
10
tsuji
958
11
fukap
907
12
shutta
835
13
tao_s
799
14 ramrun 789
15 karin 689
16 sumida 641
17
homan
633
18 DELIGHT 572
19
patapata
502
20
flealog
485


ネットショップの壺

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

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