要望や症状
Aの商品を購入したお客様にはA専用の購入後メールを、Bの商品を購入したお客様にはB専用の購入後メールを送信し、商品に応じてメール内容を自動的に振り分けたいというケースがあります。
理由や原因
EC-CUBE標準仕様では、注文完了時のメールテンプレートは全商品共通となっています。商品毎にメール内容を変更するには、メールテンプレート内で商品情報を判定し、条件分岐によって内容を切り替える必要があります。
メール送信処理は src/Eccube/Service/MailService.php で行われ、メールテンプレートは src/Eccube/Resource/template/default/Mail/order.twig を使用します。テンプレート内では注文商品情報にアクセスすることが可能です。
解決策
メールテンプレート内で商品コードまたは商品名を判定し、商品毎に異なる内容を表示する方法をご説明します。
1. メールテンプレートのカスタマイズ
以下のコードを app/template/default/Mail/order.twig に配置します。
<!-- app/template/default/Mail/order.twig -->
{% extends "@default/Mail/mail_base.twig" %}
{% block main %}
<h1>ご注文ありがとうございます</h1>
{% for OrderItem in Order.OrderItems %}
{% if OrderItem.Product %}
{% if OrderItem.product_code == 'PRODUCT_A' %}
{# A商品専用のメール内容 #}
<h2>商品Aをご購入いただきありがとうございます</h2>
<p>商品A専用の特別なメッセージです。</p>
<p>商品Aに関する特別な使用方法やサポート情報をお知らせします。</p>
{% elseif OrderItem.product_code == 'PRODUCT_B' %}
{# B商品専用のメール内容 #}
<h2>商品Bをご購入いただきありがとうございます</h2>
<p>商品B専用の特別なメッセージです。</p>
<p>商品Bに関する詳細な設定方法をご案内いたします。</p>
{% else %}
{# その他の商品の場合 #}
<h2>ご購入ありがとうございます</h2>
<p>標準的なお礼メッセージです。</p>
{% endif %}
<div class="product-info">
<p>商品名: {{ OrderItem.product_name }}</p>
<p>商品コード: {{ OrderItem.product_code }}</p>
<p>数量: {{ OrderItem.quantity }}</p>
<p>価格: {{ OrderItem.price_inc_tax|price }}</p>
</div>
{% endif %}
{% endfor %}
{# 共通の注文情報 #}
<h3>ご注文内容</h3>
<p>注文番号: {{ Order.order_no }}</p>
<p>注文日時: {{ Order.order_date|date_day }}</p>
<p>合計金額: {{ Order.total|price }}</p>
{% endblock %}
2. 商品名による判定パターン
商品コードではなく商品名で判定したい場合は、以下のような記述が可能です。
{% if OrderItem.product_name matches '/特定商品A/' %}
{# 商品名に「特定商品A」が含まれる場合 #}
{% elseif OrderItem.product_name matches '/特定商品B/' %}
{# 商品名に「特定商品B」が含まれる場合 #}
{% endif %}
3. より高度なカスタマイズ(MailServiceの拡張)
商品毎に完全に異なるメールテンプレートを使用したい場合は、MailServiceを拡張する方法もあります。
// app/Customize/Service/CustomMailService.php
<?php
namespace Customize\Service;
use Eccube\Service\MailService;
use Eccube\Entity\Order;
class CustomMailService extends MailService
{
public function sendOrderMail(Order $Order)
{
$templateName = $this->getTemplateByOrder($Order);
// 商品に応じてテンプレートを選択
$message = $this->createMessage($templateName, [
'Order' => $Order,
]);
return $this->mailer->send($message);
}
private function getTemplateByOrder(Order $Order): string
{
foreach ($Order->getOrderItems() as $orderItem) {
if ($orderItem->getProduct()) {
$productCode = $orderItem->getProduct()->getCode();
if ($productCode === 'PRODUCT_A') {
return 'Mail/order_product_a.twig';
} elseif ($productCode === 'PRODUCT_B') {
return 'Mail/order_product_b.twig';
}
}
}
return 'Mail/order.twig'; // デフォルトテンプレート
}
}