質問 > フロント機能 > 購入時の年齢チェック |
フロント機能
フラット表示 | 前のトピック | 次のトピック |
投稿者 | スレッド |
---|---|
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/5 15:35 |
Re: 購入時の年齢チェック | h_tanaka | 2024/7/5 15:41 |
» Re: 購入時の年齢チェック | Rights | 2024/7/6 14:17 |
Re: 購入時の年齢チェック | Rights | 2024/7/8 12:53 |
Re: 購入時の年齢チェック | tattsu | 2024/7/9 13:48 |
Re: 購入時の年齢チェック | Rights | 2024/7/9 20:03 |