特定会員価格表示プラグインで未ログイン時に商品詳細ページに特定会員価格一覧を表示させる方法

特定会員価格表示プラグインで未ログイン時に商品詳細ページに特定会員価格一覧を表示させる方法です。

管理画面で商品詳細ページのテンプレートに以下のタグを追加してください。

※販売価格の直下に追加することをおすすめします。

{{ include('@CustomerClassPrice4/Product/detail.twig', {'Product': Product}, ignore_missing=true) }}

以上で完成です。

特定会員価格一覧は特定会員価格を一度も登録していない商品は表示されません。また、特定会員価格を空白で登録した場合は通常の販売価格が表示されます。

特定会員価格の設定を空白にした場合、特定会員価格を非表示する方法

上記タグは商品に特定会員価格を設定してその後特定会員価格を空白で登録した場合、フロント画面では各特定会員価格に通常の販売価格が表示されますが、特定会員価格を非表示にするにはカスタマイズする必要があります。

独自のTwig関数を用意

商品に特定会員価格が設定されているか判定するTwig関数を用意します。

app/Customize/Twig/CustomerClassPriceExtension.phpを用意して以下のコードを追加してください。

<?php

namespace Customize\Twig;

use Doctrine\Common\Collections\ArrayCollection;
use Plugin\CustomerClassPrice4\Entity\CustomerClass;
use Plugin\CustomerClassPrice4\Entity\CustomerClassPrice;
use Plugin\CustomerClassPrice4\Repository\CustomerClassPriceRepository;
use Twig\Extension\AbstractExtension;
use Twig\TwigFunction;

class CustomerClassPriceExtension extends AbstractExtension
{
    /**
     * @var CustomerClassPriceRepository
     */
    private $customerClassPriceRepository;

    public function __construct(CustomerClassPriceRepository $customerClassPriceRepository)
    {
        $this->customerClassPriceRepository = $customerClassPriceRepository;
    }

    public function getFunctions()
    {
        return [
            new TwigFunction('has_customer_class_prices', [$this, 'hasCustomerClassPrices'])
        ];
    }

    public function hasCustomerClassPrices(CustomerClass $customerClass, array $productClasses): ArrayCollection
    {
        $customerClassPrices = $this->customerClassPriceRepository->findBy([
            'customerClass' => $customerClass,
            'productClass' => $productClasses
        ]);

        $customerClassPrices = array_filter($customerClassPrices, function (CustomerClassPrice $customerClassPrice) {
            return $customerClassPrice->getPrice() > 0;
        });

        return new ArrayCollection($customerClassPrices);
    }
}

商品詳細ページテンプレートを編集

上記で設定したテンプレートタグを以下のコードに差し替えてください。

{% if not is_granted('ROLE_USER') %}
    {% set CustomerClasses = repository('Plugin\\CustomerClassPrice4\\Entity\\CustomerClass').findAll() %}
    <div class="ec-productRole__customerClassPrice">
        {% for CustomerClass in CustomerClasses %}
            {% if has_customer_class_prices(CustomerClass, Product.getProductClasses.toArray).count > 0 %}
                {% set CustomerClassPricesIncTax = get_customer_class_prices_inc_tax(CustomerClass, Product.getProductClasses.toArray) %}
                {% if CustomerClassPricesIncTax %}
                    {% if Product.hasProductClass -%}
                        {% if min(CustomerClassPricesIncTax) == max(CustomerClassPricesIncTax) %}
                            <div class="ec-price">
                                {{ CustomerClass.name }}価格:
                                <span
                                    class="ec-price__price ec-customerClassPrice"
                                    data-id="{{ CustomerClass.id }}"
                                >{{ max(CustomerClassPricesIncTax)|price }}</span>
                                <span class="ec-price__tax">{{ 'common.tax_include'|trans }}</span>
                            </div>
                        {% else %}
                            <div class="ec-price">
                                {{ CustomerClass.name }}価格:
                                <span
                                    class="ec-price__price ec-customerClassPrice"
                                    data-id="{{ CustomerClass.id }}"
                                >{{ min(CustomerClassPricesIncTax)|price }} ~ {{ max(CustomerClassPricesIncTax)|price }}</span>
                                <span class="ec-price__tax">{{ 'common.tax_include'|trans }}</span>
                            </div>
                        {% endif %}
                    {% else %}
                        <div class="ec-price">
                            {{ CustomerClass.name }}価格:
                            <span
                                class="ec-price__price ec-customerClassPrice">{{ min(CustomerClassPricesIncTax)|price }}</span>
                            <span class="ec-price__tax">{{ 'common.tax_include'|trans }}</span>
                        </div>
                    {% endif %}
                {% endif %}
            {% endif %}
        {% endfor %}
    </div>
{% endif %}

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