質問 > フロント機能 > 購入時の年齢チェック |
フロント機能
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | 下へ |
投稿者 | スレッド |
---|---|
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 から受注情報は取得できるかと思います。
|
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が保存されているか不明なのでその辺りデバッグしてみれば良いかと思います。
|
Rights |
投稿日時: 2024/7/9 20:03
対応状況: 解決済
|
一人前 登録日: 2019/3/12 居住地: 投稿: 114 |
Re: 購入時の年齢チェック $context->getUser();で取得できなかった場合に、OrderHelper::SESSION_NON_MEMBER から取得する事で解決しました。
ありがとうございました。 |
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | トップ |