EC-CUBE Lab
produced by Cajiya
EC-CUBEに関するカスタマイズ方法やトラブルへの対処方法を発信

商品詳細ページに獲得予定ポイントを表示するカスタマイズ方法

公開日: 2025年09月23日 | 更新日: 2025年11月01日
商品 表示/テンプレート調整 EC-CUBE 4系全般 サービス/コントローラ拡張

要望や症状

商品詳細ページで獲得予定ポイントを表示したいケースがあります。

理由や原因

EC-CUBE 4系の標準仕様では、商品詳細ページで獲得予定ポイントを表示する機能が実装されていません。 コントローラーからテンプレートに対してポイント計算結果が渡されていないため、テンプレートを編集するだけでは正確なポイント表示をすることができません。

ポイント機能は、実際の購入完了後にのみポイントが計算され付与される仕組みとなっており、商品詳細ページにポイント情報を表示するには、独自カスタマイズが必要です。

解決策

EC-CUBEの商品詳細ページでは、SKU(商品規格)の選択によって価格が動的に変更されるため、Ajax APIを活用したリアルタイム計算方式がオススメです。

ポイント計算API の作成

1. SKUポイント計算サービスの作成

最初に、SKUごとのポイント計算を行うサービスクラスを作成します。

<?php
// app/Customize/Service/PointCalculationService.php

namespace Customize\Service;

use Eccube\Entity\ProductClass;
use Eccube\Repository\BaseInfoRepository;
use Eccube\Repository\PointInfoRepository;

class PointCalculationService
{
    private $baseInfoRepository;
    private $pointInfoRepository;

    public function __construct(
        BaseInfoRepository $baseInfoRepository,
        PointInfoRepository $pointInfoRepository
    ) {
        $this->baseInfoRepository = $baseInfoRepository;
        $this->pointInfoRepository = $pointInfoRepository;
    }

    /**
     * 商品規格からポイントを計算
     */
    public function calculatePoint(ProductClass $productClass, int $quantity = 1): int
    {
        $baseInfo = $this->baseInfoRepository->get();
        $pointInfo = $this->pointInfoRepository->getLastInsertData();
        
        if (!$pointInfo || !$pointInfo->getPlgPointStatus()) {
            return 0;
        }

        $price = $productClass->getPrice02IncTax();
        $pointRate = $pointInfo->getPlgBasicPointRate();
        
        return floor($price * $quantity * $pointRate / 100);
    }
}

2. コントローラーの作成

次に、Ajax リクエストを受け取ってポイント計算結果を返すAPIコントローラーを作成します。

<?php
// app/Customize/Controller/Api/PointApiController.php

namespace Customize\Controller\Api;

use Eccube\Controller\AbstractController;
use Eccube\Repository\ProductClassRepository;
use Customize\Service\PointCalculationService;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;

class PointApiController extends AbstractController
{
    private $productClassRepository;
    private $pointCalculationService;

    public function __construct(
        ProductClassRepository $productClassRepository,
        PointCalculationService $pointCalculationService
    ) {
        $this->productClassRepository = $productClassRepository;
        $this->pointCalculationService = $pointCalculationService;
    }

    /**
     * @Route("/api/point/calculate", name="api_point_calculate", methods={"POST"})
     */
    public function calculate(Request $request): JsonResponse
    {
        $productClassId = $request->request->get('product_class_id');
        $quantity = (int) $request->request->get('quantity', 1);

        if (!$productClassId) {
            return new JsonResponse(['error' => 'product_class_id is required'], 400);
        }

        $productClass = $this->productClassRepository->find($productClassId);
        if (!$productClass) {
            return new JsonResponse(['error' => 'ProductClass not found'], 404);
        }

        $point = $this->pointCalculationService->calculatePoint($productClass, $quantity);

        return new JsonResponse([
            'point' => $point,
            'formatted_point' => number_format($point) . 'pt'
        ]);
    }
}

3. Twigテンプレートの更新

商品詳細ページのテンプレートにポイント表示領域とJavaScriptを追加します。

{# templates/Product/detail.twig の適切な箇所に追加 #}

{# ポイント表示エリア #}
<div class="ec-productRole__btn">
    <div id="point-display" class="ec-productRole__point" style="margin-bottom: 10px;">
        <span class="point-label">獲得予定ポイント:</span>
        <span id="point-value" class="point-value">-</span>
    </div>
    <button type="button" class="ec-blockBtn--action add-cart" data-cartid="{{ Product.id }}" form="form1" {{ csrf_token_for_anchor() }}>
        カートに入れる
    </button>
</div>

{# JavaScript #}
<script>
$(document).ready(function() {
    // 初期ポイント計算
    calculatePoint();
    
    // 規格選択時のイベント
    $('select[name="classcategory_id1"], select[name="classcategory_id2"]').on('change', function() {
        calculatePoint();
    });
    
    // 数量変更時のイベント
    $('.quantity').on('change keyup', function() {
        calculatePoint();
    });
    
    function calculatePoint() {
        var productClassId = $('input[name="product_class_id"]').val();
        var quantity = parseInt($('.quantity').val()) || 1;
        
        if (!productClassId) {
            $('#point-value').text('-');
            return;
        }
        
        $.ajax({
            url: '{{ url("api_point_calculate") }}',
            type: 'POST',
            data: {
                product_class_id: productClassId,
                quantity: quantity,
                _token: $('meta[name="eccube-csrf-token"]').attr('content')
            },
            success: function(data) {
                if (data.formatted_point) {
                    $('#point-value').text(data.formatted_point);
                } else {
                    $('#point-value').text('0pt');
                }
            },
            error: function() {
                $('#point-value').text('-');
            }
        });
    }
});
</script>

4. サービスの登録

作成したサービスをDIコンテナに登録します。

# app/config/services_customize.yaml

services:
    Customize\Service\PointCalculationService:
        arguments:
            - '@Eccube\Repository\BaseInfoRepository'
            - '@Plugin\Point\Repository\PointInfoRepository'

実装のポイント

このカスタマイズでは、商品規格の選択や数量の変更に応じてリアルタイムでポイント計算を行います。Ajax APIを使用することで、ページの再読み込みなしにスムーズなユーザー体験を提供できます。

ポイント計算は実際のプラグインの計算ロジックに合わせて調整が必要な場合があります。使用されているポイントプラグインの仕様を確認して、適切な計算式を実装してください。

免責事項

本記事に掲載しているコードや手順は、執筆時点での情報および特定の環境下での動作確認に基づいています。 EC-CUBEのバージョン、サーバー環境、導入済みプラグインとの競合などにより、予期せぬ不具合が発生する可能性があります。

本記事の内容を実行した結果、生じた損害(データの消失、サイトの停止、機会損失など)について、当サイトおよび管理者は一切の責任を負いかねます。 実装にあたっては、必ずバックアップを取得し、検証環境(テスト環境)での動作確認を行った上で、ご自身の責任において実施してください。

この記事は参考になりましたか?

著者プロフィール: 株式会社カジヤ

当社はWeb業界の専門家として、培った経験や技術、自社事業を通して得た知見を土台に、 お客様の事業の成長を後押しすることを提供価値として活動する、Web事業の成長支援会社です。 EC-CUBE公式のパートナー制度「EC-CUBE インテグレートパートナー」に登録してしており、上位11%にあたる「ゴールドランク」に認定された実績があり、新しい通販サイトの構築から、カスタマイズ、リニューアルまで幅広く対応します。

商品 の関連記事

商品 データ不整合 EC-CUBE 4系全般
EC-CUBEで取り扱い終了商品の削除ができない理由と対応方法

EC-CUBEでは、取り扱いを終了した商品を削除したい場合に、削除ができない状態になることがあります...

👍 1 / 👎 0 2025年10月12日
商品 表示/テンプレート調整 EC-CUBE 4系全般
会員のみに商品価格を表示するカスタマイズ方法

EC-CUBEで会員専用サイトや卸売りサイトを構築する際、商品価格をログイン前は非表示にし、会員ログ...

👍 0 / 👎 0 2025年10月12日
商品 検索・絞り込み強化 EC-CUBE 4系全般
管理画面の商品一覧検索で、英字大文字小文字を区別しないようにするカスタマイズ方法

EC-CUBE 4系 の管理画面において、商品一覧の検索機能で英字の大文字小文字が区別される仕様とな...

👍 0 / 👎 0 2025年10月12日
商品 EC-CUBE 4.2系 / Symfony 5.4 Twig改修
商品画像の登録枚数の上限数を変更する方法

EC-CUBE 4.2系の管理画面で商品登録を行う際、商品画像が10枚までしか登録できない制限があり...

👍 0 / 👎 0 2025年10月12日
商品 EC-CUBE 4系全般
商品登録フォームのinputをtextareaに変更するカスタマイズ方法

商品登録時の入力欄がinputタグで表示されており、より多くのテキストを入力しやすいようにtexta...

👍 0 / 👎 0 2025年10月12日

表示/テンプレート調整 の関連記事

商品 表示/テンプレート調整 EC-CUBE 4系全般
会員のみに商品価格を表示するカスタマイズ方法

EC-CUBEで会員専用サイトや卸売りサイトを構築する際、商品価格をログイン前は非表示にし、会員ログ...

👍 0 / 👎 0 2025年10月12日
受注管理(管理画面) 表示/テンプレート調整 EC-CUBE 4系全般
受注一覧ページで会員番号を表示するカスタマイズ方法

管理画面の受注一覧ページで、注文者の会員番号を表示したい場合があります。 ### 表示要件 ...

👍 0 / 👎 0 2025年10月12日
商品カテゴリ・一覧・検索 表示/テンプレート調整 EC-CUBE 4系全般
カテゴリーの一覧から、商品が紐づいていないカテゴリーのみを非表示にするカスタマイズ方法

子カテゴリー一覧を表示する際に、商品が登録されていないカテゴリーも表示されてしまう問題が発生します。...

👍 0 / 👎 0 2025年10月12日
商品カテゴリ・一覧・検索 表示/テンプレート調整 EC-CUBE 4系全般
特定カテゴリのでのみHTMLを表示するTwigのカスタマイズ方法

特定のカテゴリの商品一覧ページでのみHTMLやメッセージを表示したいが、商品一覧のTwigテンプレー...

👍 0 / 👎 0 2025年10月12日
管理画面共通 表示/テンプレート調整 EC-CUBE 4系全般
管理画面左上のEC-CUBEロゴをカスタマイズする方法

管理画面の左上に表示されているEC-CUBEのデフォルトロゴを、自社のロゴに変更したいと考えています...

👍 0 / 👎 0 2025年10月12日

EC-CUBE 4系全般 の関連記事

商品 データ不整合 EC-CUBE 4系全般
EC-CUBEで取り扱い終了商品の削除ができない理由と対応方法

EC-CUBEでは、取り扱いを終了した商品を削除したい場合に、削除ができない状態になることがあります...

👍 1 / 👎 0 2025年10月12日
インストール・セットアップ EC-CUBE 4系全般 設定変更
EC-CUBEサイトのドメイン変更時の設定変更方法

EC-CUBEで構築したサイトを新しいドメインで公開する際に、どのような設定変更が必要かわからない場...

👍 0 / 👎 0 2025年10月12日
メール通知 通知/コミュニケーション EC-CUBE 4系全般
メール件名のショップ名を英語表記に変更する方法

EC-CUBE 4系で、メール件名の先頭に自動挿入される店舗名を英語表記に変更したい場合があります。...

👍 0 / 👎 0 2025年10月12日
フロント共通 機能不動作 EC-CUBE 4系全般
CloudFrontを利用時にリンクのドメインがEC2のパブリックDNSになってしまう問題の解決方法

EC-CUBE 4.2をAWS ECS on EC2上で構築し、CloudFrontをCDNとして利...

👍 1 / 👎 0 2025年10月12日
サイト全体 500エラー EC-CUBE 4系全般
EC-CUBEでメモリ不足エラーが発生した場合の対処方法

EC-CUBEの運用中に以下のようなメモリ不足エラーが発生することがあります。 ### エラー...

👍 1 / 👎 0 2025年10月12日

サービス/コントローラ拡張 の関連記事

メール通知 通知/コミュニケーション EC-CUBE 4系全般
メール件名のショップ名を英語表記に変更する方法

EC-CUBE 4系で、メール件名の先頭に自動挿入される店舗名を英語表記に変更したい場合があります。...

👍 0 / 👎 0 2025年10月12日
マイページ全般 表示/テンプレート調整 EC-CUBE 4系全般
マイページにメール受信履歴ページをカスタマイズする方法

マイページに注文関連のメール履歴を一覧表示する専用ページを作成したいという要望があります。現在のEC...

👍 0 / 👎 0 2025年10月12日
商品 EC-CUBE 4.2系 / Symfony 5.4 サービス/コントローラ拡張
商品登録画面のフリーエリアでTwig構文を使用可能にするカスタマイズ方法

商品登録画面のフリーエリアでTwig構文を使用した画像パスを入力すると、保存時に構文がHTMLエスケ...

👍 0 / 👎 0 2025年09月24日
会員登録 セキュリティ強化 EC-CUBE 4系全般
悪意のあるボットによる大量の会員登録を制限する方法

不正なbot等によって、大量の会員登録リクエストが送信されるケースがあります。これらの不正登録では基...

👍 0 / 👎 0 2025年09月23日