バージョン選択

フォーラム

メニュー

オンライン状況

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

サイト内検索

質問 > フロント機能 > 購入時の年齢チェック

フロント機能

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
Rights
投稿日時: 2024/7/5 15:35
対応状況: −−−
一人前
登録日: 2019/3/12
居住地:
投稿: 114
購入時の年齢チェック
[EC-CUBE]4.2.3

・商品情報に20歳未満購入禁止の項目(チェックボックス)を追加
・会員・非会員とも生年月日を必須
・注文画面に遷移する際、生年月日と注文商品のチェック有無で、20歳未満の注文者の場合はメッセージを表示して購入不可

この処理を行う場合、PurchaseFlowのカスタマイズになるかと思いますが、PurchaseContextからは、会員の情報しか取得できません。
非会員の場合の情報を取得するには、どのようにすればよいでしょうか?

PurchaseContextで、受注情報を取得するようにしてそこから注文者の情報を取得する方が良いでしょうか?
h_tanaka
投稿日時: 2024/7/5 15:41
対応状況: −−−
登録日: 2016/7/22
居住地: 愛媛県
投稿: 1796
Re: 購入時の年齢チェック
ItemHolderInterface から受注情報は取得できるかと思います。


----------------
EC-CUBE 《プラチナ》ランクパートナー
トエビス株式会社 田中 宏典
EC-CUBEの機能やデザインのカスタマイズ承ります。

Rights
投稿日時: 2024/7/6 14:17
対応状況: −−−
一人前
登録日: 2019/3/12
居住地:
投稿: 114
Re: 購入時の年齢チェック

すみません。説明が不足していました。
会員の場合は、PurchaseContext の $User->getBirth()で生年月日が取得できますが、非会員の場合の生年月日(必須に変更)を取得するにはどうしたらよいかとのご相談でした。
[カスタマイズ]
/app/Customize/Controller/NonMemberShoppingController.php
function customer
$Order
(省略)
->setBirth($birthDateTime);追加
(省略)
$this->session->set(OrderHelper::SESSION_NON_MEMBER, [
(省略)
'birth' => $data['customer_birth'],追加
]);

/Customize/Service/PurchaseFlow/PurchaseContext.php
namespace Customize\Service\PurchaseFlow;
use Eccube\Entity\Customer;
use Eccube\Entity\Order;
use Eccube\Entity\ItemHolderInterface;
use Eccube\Service\PurchaseFlow\PurchaseContext as BasePurchaseContext;
/**
* PurchaseFlowの実行中コンテキスト.
*/
class PurchaseContext extends BasePurchaseContext
{
private $order;
public function __construct(ItemHolderInterface $originHolder = null, ?Customer $user = null, ?Order $order = null)
{
parent::__construct($originHolder, $user);
$this->order = $order;
}
/**
* 注文情報を取得.
*
* @return Order
*/
public function getOrder(): ?Order
{
return $this->order;
}
}
/Customize/Service/PurchaseFlow/Processor/AgeLimitValidator.php

namespace Customize\Service\PurchaseFlow\Processor;
use Eccube\Annotation\ShoppingFlow;
use Eccube\Entity\Customer;
use Eccube\Entity\Order;
use Eccube\Entity\ItemInterface;
use Eccube\Service\PurchaseFlow\ItemValidator;
use Customize\Service\PurchaseFlow\PurchaseContext;
/**
* 商品毎に年齢制限チェック
* @author
* @ShoppingFlow
*/
class AgeLimitValidator extends ItemValidator
{
/**
* @inheritDoc
*/
protected function validate(ItemInterface $item, \Eccube\Service\PurchaseFlow\PurchaseContext $context)
{
if(!$item->isProduct()) {
return;
}
log_info('注文者の年齢チェック開始');
//if ($context instanceof PurchaseContext) {
log_info('注文者の情報取得');
$Order = $context->getOrder();
$age = null;
if ($Order && $Order->getBirth()) {
// 年齢を計算
$age = floor(((new \DateTime())->format("Ymd") - $Order->getBirth()->format("Ymd")) / 10000);
}
log_info('注文者の年齢は、' .$age .'歳です。');
//}
$User = $context->getUser();
if($User instanceof Customer) {
// 誕生日が登録されている場合
if($User->getBirth()) {
// 年齢を計算
$age = floor(((new \DateTime())->format("Ymd") - $User->getBirth()->format("Ymd")) / 10000);
log_info('注文者の年齢は、' .$age .'歳です。');
$ageLimit = $item->getProductClass()->getProduct()->getAgeLimit();
log_info('年齢制限フラグは、' .$ageLimit .'です。');
// 年齢制限の値と年齢を比較
if($ageLimit == 1 && $age <= 20) {
log_info("20歳未満は購入できない商品が含まれています。");
$this->throwInvalidItemException("20歳未満は購入できない商品が含まれています。", $item->getProductClass());
}
}
}
log_info('注文者の年齢チェック終了');
}
protected function handle(ItemInterface $item, \Eccube\Service\PurchaseFlow\PurchaseContext $context)
{
$item->setQuantity(0);
}
}
services.yaml
Customize\Service\PurchaseFlow\PurchaseContext:
autowire: true
autoconfigure: true
public: true
arguments:
$originHolder: '@?Eccube\Entity\ItemHolderInterface'
$user: '@?Eccube\Entity\Customer'
$order: '@?Eccube\Entity\Order'
Customize\Service\PurchaseFlow\Processor\AgeLimitValidator:
autowire: true
autoconfigure: true
public: true
Eccube\Service\PurchaseFlow\Processor\AgeLimitValidator:
class: Customize\Service\PurchaseFlow\Processor\AgeLimitValidator

AgeLimitValidatorで、getOrder()でエラーになりますが、参照先を本体に指定しているためだとわかりますが、Customize側にすると namespaceでエラーになります。
現状は動作確認のため、生年月日の取得ができているか確認のコードになっていますが、何か指摘などありますでしょうか?
イベントリスナーを使った方法も考えてみましたが、今回の処理に該当する ShoppingControllerのindexにはフックポイントの記述がないようです。これはカスタマイズで追加が必要でしょうか?(function index のあたりだと思うのですが)

※投稿の際、アクセスにブロックがかかってしばらく投稿できなくなります。なにか条件がありますか?
Rights
投稿日時: 2024/7/8 12:53
対応状況: −−−
一人前
登録日: 2019/3/12
居住地:
投稿: 114
Re: 購入時の年齢チェック
追記です。
その後、会員・非会員も含め$Customerオブジェクトで生年月日が取得できないかという事で、

OrderHelperをカスタマイズして、getNonMemberで、$Customerオブジェクトに、setBirthを追加
→ 非会員情報で入力した生年月日の取得をログ出力で確認しましたが、

/app/Customize/Service/PurchaseFlow/Processor/ にvalidateの処理を追加した際、

protected function validate(ItemInterface $item, PurchaseContext $context)
{

$User = $context->getUser();
log_info('ユーザー情報', ['User' => $User]);
// 非会員の場合は、$Userに、nullが返ってきます。

}



tattsu
投稿日時: 2024/7/9 13:48
対応状況: −−−
仙人
登録日: 2023/12/23
居住地:
投稿: 343
Re: 購入時の年齢チェック
getNonMemberでセットできているなら
$Order->getBirthで取得できるはずですので、

取得できないということであれば、そもそもgetNonMember内でセットできていないと思われます。

今の情報からですと非会員用のセッションにbirthが保存されているか不明なのでその辺りデバッグしてみれば良いかと思います。


----------------
-------------------

EC-CUBEカスタマイズ・バージョンアップ・不具合修正(状況調査は無料)
ゴールドパートナー。

Rights
投稿日時: 2024/7/9 20:03
対応状況: 解決済
一人前
登録日: 2019/3/12
居住地:
投稿: 114
Re: 購入時の年齢チェック
$context->getUser();で取得できなかった場合に、OrderHelper::SESSION_NON_MEMBER から取得する事で解決しました。

ありがとうございました。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


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

統計情報

総メンバー数は94,726名です
総投稿数は111,341件です

投稿数ランキング

1
seasoft
7369
2
468
3217
3
AMUAMU
2712
4
nanasess
2324
5
umebius
2085
6
yuh
1881
7
h_tanaka
1796
8
red
1574
9
mcontact
1507
10
tsuji
958
11
fukap
907
12
shutta
835
13
tao_s
804
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.