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個しか追加されなくなります。