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