要望や症状
マイページに注文関連のメール履歴を一覧表示する専用ページを作成したいという要望があります。現在のEC-CUBEでは、ご注文履歴の詳細ページ内でメール履歴を確認することはできますが、利便性に課題があります。そのため、マイページの下階層に独立した「メール受信履歴一覧ページ」を追加する必要があります。
表示対象となるメール
- 注文受付メール
- 出荷メール
- 受注管理から送信したメール
表示順序について
メール送信日時を基準としたソート順で表示することを想定しています。
理由や原因
EC-CUBE標準機能では、メール履歴は注文履歴詳細ページ内でのみ表示される仕様となっています。独立したメール履歴ページは標準では存在しないため、マイページに新しいページを追加するカスタマイズが必要になります。
メール保存の制限について
EC-CUBE標準では注文受付メールと受注管理から送信したメールのみがデータベースに保存されます。お問い合わせメールなど他のメール送信分は保存されないため、それらを履歴に含める場合は別途保存処理の実装が必要になります。
解決策
実装手順について
以下の手順でマイページにメール受信履歴ページを追加できます。
1. コントローラーの作成
マイページ用のコントローラーを作成します。
// app/Customize/Controller/Mypage/MailHistoryController.php
<?php
namespace Customize\Controller\Mypage;
use Eccube\Controller\AbstractController;
use Eccube\Entity\Customer;
use Eccube\Entity\MailHistory;
use Eccube\Repository\MailHistoryRepository;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
class MailHistoryController extends AbstractController
{
private $mailHistoryRepository;
private $tokenStorage;
public function __construct(
MailHistoryRepository $mailHistoryRepository,
TokenStorageInterface $tokenStorage
) {
$this->mailHistoryRepository = $mailHistoryRepository;
$this->tokenStorage = $tokenStorage;
}
/**
* @Route("/mypage/mail_history", name="mypage_mail_history")
* @Template("Mypage/mail_history.twig")
*/
public function index(Request $request)
{
$Customer = $this->getUser();
if (!$Customer instanceof Customer) {
throw $this->createAccessDeniedException();
}
// 顧客の注文に関連するメール履歴を取得
$qb = $this->mailHistoryRepository->createQueryBuilder('mh')
->innerJoin('mh.Order', 'o')
->where('o.Customer = :customer')
->setParameter('customer', $Customer)
->orderBy('mh.send_date', 'DESC');
$mailHistories = $qb->getQuery()->getResult();
return [
'mailHistories' => $mailHistories,
];
}
}
2. テンプレートの作成
メール履歴表示用のテンプレートを作成します。
{# app/template/default/Mypage/mail_history.twig #}
{% extends 'Mypage/index.twig' %}
{% set mypageno = 'mail_history' %}
{% block title %}メール受信履歴{% endblock %}
{% block main %}
<div class="ec-layoutRole__main">
<div class="ec-mypageRole">
<div class="ec-pageHeader">
<h1>メール受信履歴</h1>
</div>
{% if mailHistories|length > 0 %}
<div class="ec-orderRole__detail">
{% for mailHistory in mailHistories %}
<div class="ec-orderDelivery">
<div class="ec-orderDelivery__title">
<h2>{{ mailHistory.subject }}</h2>
<p class="ec-color-grey">送信日時:{{ mailHistory.send_date|date('Y/m/d H:i') }}</p>
<p class="ec-color-grey">注文番号:{{ mailHistory.Order.order_no }}</p>
</div>
<div class="ec-orderDelivery__detail">
<div class="ec-orderDelivery__mail">
<pre>{{ mailHistory.body }}</pre>
</div>
</div>
</div>
{% endfor %}
</div>
{% else %}
<div class="ec-role">
<div class="ec-off1Grid">
<div class="ec-off1Grid__cell">
<div class="ec-alert-warning">
<div class="ec-alert-warning__icon"><img src="{{ asset('assets/icon/exclamation-white.svg') }}" alt=""></div>
<div class="ec-alert-warning__text">メール履歴がありません。</div>
</div>
</div>
</div>
</div>
{% endif %}
</div>
</div>
{% endblock %}
3. マイページナビゲーションの更新
マイページのナビゲーションにメール履歴へのリンクを追加します。
{# app/template/default/Mypage/navi.twig #}
<!-- 既存のナビゲーション項目の後に追加 -->
<li class="ec-navlistRole__item"><a href="{{ url('mypage_mail_history') }}">メール受信履歴</a></li>
4. ルーティングの確認
Customizeディレクトリのコントローラーが自動で読み込まれることを確認します。EC-CUBE 4.1では通常自動で認識されます。
注意事項について
本カスタマイズは注文関連のメール(注文受付メール、出荷メール等)のみが対象となります。お問い合わせメールの履歴を含める場合は、メール送信時の保存処理を別途実装する必要があります。また、データベースの直接変更を伴う場合は事前にバックアップを取得することをお勧めします。
バージョンによる違いについて
EC-CUBE 4.2系以降ではSymfony 5.4以上が使用されるため、Annotationの代わりにAttributesを使用することが推奨されます。