【EC-CUBE4】商品を一個しか購入できないプラグインを作る方法

EC-CUBE4で商品を一個しか購入できないプラグインを作る方法です。

EC-CUBE4にバンドルされている「PurchaseFlowにProcessorを追加するサンプル」をベースに開発してみます。

まず最初にコマンドでプラグインの雛形を生成します。

bin/console eccube:plugin:generate

上記コマンドを実行するとプラグインジェネレータのウィザードが開始されますので任意のテキストを入力してください。

今回は以下のように入力しました。

EC-CUBE Plugin Generator Interactive Wizard
===========================================

 name [EC-CUBE Sample Plugin]:
 > 商品を一個しか購入できないプラグイン

 code [Sample]:
 > SaleLimitOne

 ver [1.0.0]:
 > 1.0.0

入力が完了したらPluginディレクトリ内にSaleLimitOneディレクトリが自動で生成されます。

商品規格テーブルに商品を一個しか購入できないフラグを追加

商品規格テーブル(dtb_product_class)に商品を一個しか購入できないフラグフィールドを追加するため、ProductClass Entityをtraitと@EntityExtension アノテーションを使って拡張します。

ProductClassTraitを作成してEntityディレクトリに配置してください。

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

<?php

namespace Plugin\SaleLimitOne\Entity;

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

/**
 * @Eccube\EntityExtension("Eccube\Entity\ProductClass")
 */
trait ProductClassTrait {

    /**
     * @ORM\Column(name="sale_limit_one", type="boolean", options={"default":false})
     */
    private $sale_limit_one;

    public function isSaleLimitOne()
    {
        return $this->sale_limit_one;
    }
    
    public function setSaleLimitOne($sale_limit_one)
    {
        $this->sale_limit_one = $sale_limit_one;
        
        return $this;
    }
}

EC-CUBE4のドキュメントにもEntityの拡張方法が掲載されています。

今回はフラグフィールドなのでtypeにbooleanを指定しています。

フォームに商品を一個しか購入できないフラグ項目を追加

一個しか購入できないフラグフィールドを追加したので、次はフォームに一個しか購入できないフラグ項目を追加します。

先程作成したProductClassTraitのsale_limit_oneフィールドに@FormAppend アノテーションを追加します。

@FormAppend アノテーションを追加することでニックネーム項目が自動で生成されます。

<?php

namespace Plugin\SaleLimitOne\Entity;

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

/**
 * @Eccube\EntityExtension("Eccube\Entity\ProductClass")
 */
trait ProductClassTrait {

    /**
     * @ORM\Column(name="sale_limit_one", type="boolean", options={"default":false})
     * @Eccube\FormAppend(
     *  auto_render=true,
     *  type="\Eccube\Form\Type\ToggleSwitchType",
     *  options={
     *    "label": "商品を一個しか購入できないフラグ"
     *  }
     * )
     */
    private $sale_limit_one;

    public function isSaleLimitOne()
    {
        return $this->sale_limit_one;
    }
    
    public function setSaleLimitOne($sale_limit_one)
    {
        $this->sale_limit_one = $sale_limit_one;
        
        return $this;
    }
}

@FormAppend アノテーションのtypeでToggleSwitchTypeを指定すると有効・無効の切り替えボタンが生成されます。

@FormAppend アノテーションのoptionsはlabelなどのオプションが指定できます。

詳しくはEC-CUBE4ドキュメントの「Entity からフォームを自動生成する」をご確認ください。

これで管理画面の商品登録ページに商品を一個しか購入できないフラグ項目が追加され、フラグがデータベースに登録できるようになりました。

PurchaseFlowを使ってカートに入れたときの商品数量チェック

PurchaseFlowを使うと簡単にカートに入れたときの商品数量をチェックできます。

EC-CUBE4にバンドルされている「PurchaseFlowにProcessorを追加するサンプル」をベースにして、商品を一個しか購入できないフラグが有効化された商品の場合、商品数量チェックするようにします。

以下のサンプルコードを「Service/PurchaseFlow/Processor」ディレクトリ内に配置して下さい。ファイル名は「SaleLimitOneValidator.php」として下さい。

<?php
namespace Plugin\SaleLimitOne\Service\PurchaseFlow\Processor;

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

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

    /**
     * @param ItemInterface $item
     * @param PurchaseContext $context
     *
     * @throws InvalidItemException
     */
    protected function validate(ItemInterface $item, PurchaseContext $context)
    {
        if (!$item->isProduct()) {
            return;
        }

        if ($item->getProductClass()->isSaleLimitOne()) {
            $quantity = $item->getQuantity();
            if (1 < $quantity) {
                $this->throwInvalidItemException('商品は1個しか購入できません。');
            }
        }
    }

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

}

@CartFlow アノテーションを追加すると、カートのPurchaseFlowにProcessorを追加されカートに商品を入れたときのチェックが行えるようになります。

以上でプラグインは完成です。

動作確認のためコマンドでプラグインをインストールして有効化します。

プラグインのインストールと有効化

プラグインはコマンドでインストールと有効化が出来ます。

プラグインのインストール方法は以下のとおりです。

bin/console eccube:plugin:install --code SaleLimitOne

プラグインの有効化の方法は以下のとおりです。

bin/console eccube:plugin:enable --code SaleLimitOne

プラグインを有効化すると、管理画面の「商品登録ページ」に商品を一個しか購入できないフラグ項目が追加されます。

商品を一個しか購入できないフラグを有効にして保存すると、フラグを有効化した商品は数量2個以上でカートに入れるとエラメッセージが表示され、カートには商品が1個しか追加されなくなります。

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

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