商品別支払い方法設定プラグインでAmazon Payを支払い方法に設定していない商品がカートに入っている場合、Amazon Payボタンを非表示にする方法

商品別支払い方法設定プラグインでAmazon Payを支払い方法に設定していない商品がカートに入っている場合、Amazon Payボタンを非表示にする方法です。

Customizeディレクトリにservices.yamlを作成

services.yamlをCustomizeディレクトリに作成してください。

app/Customize/Resource/config/services.yaml

twig:
    paths:
        '%kernel.project_dir%/app/Customize/Resource/template': Customize

テンプレートを作成

app/Customize/Resource/template/default/Cart/index.twig

<script>
    $(function () {
        $('.AmazonPayButton').hide();
    })
</script>

カートページ用のイベントを作成

app/Customize/CartEvent.php

<?php

namespace Customize;

use Eccube\Entity\Cart;
use Eccube\Event\TemplateEvent;
use Plugin\ProductPayment42\Entity\ProductPayment;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class CartEvent implements EventSubscriberInterface
{

    public static function getSubscribedEvents()
    {
        return [
            'Cart/index.twig' => 'onCartTemplate'
        ];
    }

    public function onCartTemplate(TemplateEvent $event)
    {
        $carts = $event->getParameter('Carts');

        /** @var Cart $cart */
        foreach ($carts as $cart) {
            foreach ($cart->getItems() as $item) {
                if ($item->isProduct()) {
                    $product = $item->getProductClass()->getProduct();

                    if ($product->getProductPayments()->isEmpty()) {
                        continue;
                    }

                    $payments = $product->getProductPayments()->filter(function (ProductPayment $row) {
                        return 'Amazon Pay' === $row->getPayment()->getMethod();
                    });

                    /**
                     * Amazon Payが利用できない商品が見つかったらAmazon Payボタンを非表示にする
                     */
                    if ($payments->count() < 1) {
                        $event->addSnippet('@Customize/default/Cart/index.twig');
                        break 2;
                    }
                }
            }
        }
    }
}

上記コードはEC-CUBE4.2に対応したものです。

EC-CUBE4.0〜4.1で利用したい場合は7行目を以下のように修正してください。

use Plugin\ProductPayment42\Entity\ProductPayment;

以上です。

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