概要
今回は特定条件の場合に商品をカートへ入れさせないようにする方法を紹介いたします。
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
それでは。