【EC-CUBE4】商品ごとに購入年齢制限を設定する方法

EC-CUBE4で商品ごとに購入年齢制限を設定する方法です。

dtb_productテーブルに年齢制限カラムを追加

dtb_productテーブルに年齢制限カラムを追加します。

サンプルコードは以下のとおりです。

<?php

namespace Customize\Entity;

use Doctrine\ORM\Mapping as ORM;
use Eccube\Annotation\EntityExtension;

/**
 * dtb_productテーブルに年齢制限カラムを追加
 *
 * @EntityExtension("Eccube\Entity\Product")
 */
trait ProductTrait
{
    /**
     * @ORM\Column(type="integer", nullable=true)
     */
    private $age_limit;

    public function getAgeLimit(): ?int
    {
        return $this->age_limit;
    }

    public function setAgeLimit(?int $age_limit): self
    {
        $this->age_limit = $age_limit;

        return $this;
    }
}

 

商品登録フォームに年齢制限項目を追加

商品登録フォームに年齢制限項目を追加します。

<?php

namespace Customize\Form\Extension;

use Eccube\Form\Type\Admin\ProductType;
use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\Form\Extension\Core\Type\NumberType;
use Symfony\Component\Form\FormBuilderInterface;

/**
 * 商品登録フォームに年齢制限を追加
 *
 * Class ProductTypeExtension
 * @package Customize\Form\Extension
 */
class ProductTypeExtension extends AbstractTypeExtension
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('age_limit', NumberType::class, [
                'label' => '年齢制限',
                'required' => false,
                'eccube_form_options' => [
                    'auto_render' => true
                ]
            ])
        ;
    }

    /**
     * {@inheritdoc}
     */
    public function getExtendedType()
    {
        return ProductType::class;
    }
}

 

購入手続きで年齢チェックするバリデーションを追加

PurchaseFlowを利用して購入手続きで年齢チェックをするバリデーションを追加します。

<?php


namespace Customize\Service\PurchaceFlow\Validator;


use Eccube\Annotation\ShoppingFlow;
use Eccube\Entity\Customer;
use Eccube\Entity\ItemInterface;
use Eccube\Service\PurchaseFlow\ItemValidator;
use Eccube\Service\PurchaseFlow\PurchaseContext;

/**
 * 商品毎に年齢制限チェック
 *
 * @ShoppingFlow()
 *
 * Class AgeLimitValidator
 * @package Customize\Service\PurchaceFlow\Validator
 */
class AgeLimitValidator extends ItemValidator
{
    /**
     * @inheritDoc
     */
    protected function validate(ItemInterface $item, PurchaseContext $context)
    {
        if(!$item->isProduct()) {
            return;
        }

        $User = $context->getUser();

        if($User instanceof Customer) {
            // 誕生日が登録されている場合
            if($User->getBirth()) {
                // 年齢を計算
                $age = floor(((new \DateTime())->format("Ymd") - $User->getBirth()->format("Ymd")) / 10000);

                $ageLimit = $item->getProductClass()->getProduct()->getAgeLimit();

                // 年齢制限の値と年齢を比較
                if($ageLimit >= $age) {
                    $this->throwInvalidItemException("「%product%」は{$ageLimit}歳以上じゃないと購入できません。", $item->getProductClass());
                }
            }
        }
    }

    protected function handle(ItemInterface $item, PurchaseContext $context)
    {
        $item->setQuantity(0);
    }
}

 

以上で完成です。

 

商品に制限年齢を登録していて顧客が誕生日を登録している場合、以下のように表示されます。

お気軽にコメントをどうぞ

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください