LoginSignup
6
6

More than 5 years have passed since last update.

[EC-CUBE4] 特定条件時に商品をカートへ入れさせないようにする方法

Last updated at Posted at 2019-02-04

概要

今回は特定条件の場合に商品をカートへ入れさせないようにする方法を紹介いたします。

PurchaseFlow内のItemValidatorでカートイン処理前の妥当性検証

EC-CUBE4の機能を拡張したいときはapp/Customize/内に実装を書いていきます。

今回はカートイン処理前の妥当性検証をしたいので、app/Customize/Service/PurchaseFlow/Processor/内に*Validator.phpというクラスを作ります。(今回はテストなのでTestValidator.phpとしておきます。)

app/Customize/Service/PurchaseFlow/Processor/TestValidator.php
namespace Customize\Service\PurchaseFlow\Processor;

use Eccube\Annotation\CartFlow;
use Eccube\Entity\ItemInterface;
use Eccube\Service\PurchaseFlow\ItemValidator;
use Eccube\Service\PurchaseFlow\PurchaseContext;

/**
 * @CartFlow
 */
class TestValidator extends ItemValidator
{

    /**
     * 妥当性検証を行う.
     *
     * @param ItemInterface $item
     * @param PurchaseContext $context
     * @throws \Eccube\Service\PurchaseFlow\InvalidItemException
     */
    protected function validate(ItemInterface $item, PurchaseContext $context)
    {
        if (!$item->isProduct()) {
            return;
        }

        $Product = $item->getProductClass()->getProduct();
        if($Product->getId() === 1){
            $this->throwInvalidItemException("商品をカートに入れることができませんでした");
        }
    }

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

validate関数内で妥当性を検証した結果、ダメだった場合にInvalidItemExceptionを発生させるようにするとhandle関数内の内容を実行してくれます。

この場合だと、
商品IDが1の商品をカートインしようとしたらInvalidItemExceptionが発生し、この商品を0個セットします。つまり、商品IDが1の商品をカートに入れさせないようにするという実装です。(商品ID1が可哀想…。)

このようになる

これからの拡張するには

$Product = $item->getProductClass()->getProduct();
のように$itemからはProductClassを取得できます。そして、ProductClassからはProductもとれますので、カートに入れようとした商品の情報は取得できます。

今回は商品IDが1の場合はという残念な特定条件のサンプルでしたが…この実装をアレンジして以下のような実装が作れると思います。

  • 商品に追加した項目がどういう状態だったらカートに入れさせない
  • 会員がこんな状態だったらカートに入れさせない
  • etc

それでは。

6
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6