🧊

【EC-CUBE4.1.2】メールテンプレートの追加とテンプレート選択の追加

2023/09/14に公開

会社で使用する「ECCUBE」でプラグインを購入せずにメールテンプレートを追加したかったので、備忘録かねて記載

更新

新規作成 2023.09.14

前提条件

EC-CUBE 4.1.2
サーバー AWS
OS Linux
DB MySQL8.0.21
PHP 7.4.30

1 メールテンプレートの追加

1 DBにテンプレートの追加

1.PHPMyAdminにログインし、dtb_mail_templateテーブルに新規レコード追加
2.PHPMyAdminの上部メニュー「挿入」を押して項目を追加するか、他のテンプレートをコピーする。

key value
creater_id NULLにチェック
name ご注文承諾メール
file_name Mail/order-accept.twig
mail_subject ご注文確定のお知らせ
create_date
upadate_date
discriminator_type mailtemplate

2 Twigテンプレートを追加

  1. 既存のメールテンプレートは「src/Eccube/Resource/template/default/Mail」の中に保存されているので、流用するなり新規で作成するなりする。
  2. 作業時はコピーして新たなテンプレートで作成。ECCUBEではhtmlとテキストでテンプレートが別々に保存されるようになっていたため、メール編集ではそれぞれ連動しない点に注意。
    逆に言えばその時点でテンプレート内に2つ別々の内容を保存できる。(だったら簡単に追加できた方が楽なのだが・・・)

2 作成したテンプレートを選択できるようにする

1 テンプレートid定義用のファイルを追加

  1. /app/config/eccube/packages/customize.yamlというファイルを作成し設置。
customize.yaml
parameters:
    eccube_order_accept_mail_template_id: 11

※上記は追加したテンプレートidを追加

2 カスタマイズ用のExtensionを追加

  1. /app/Customize/Form/Extension/OrderMailTypeExtension.phpというファイルを作成し設置
    以下の内容コードを記述
OrderMailTypeExtension.php
<?php

/*
 * This file is part of EC-CUBE
 *
 * Copyright(c) EC-CUBE CO.,LTD. All Rights Reserved.
 *
 * http://www.ec-cube.co.jp/
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Customize\Form\Extension;

use Doctrine\ORM\EntityRepository;
use Eccube\Common\EccubeConfig;
use Eccube\Form\Type\Admin\OrderMailType;
use Eccube\Form\Type\Master\MailTemplateType;
use Eccube\Form\Validator\TwigLint;
use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Validator\Constraints as Assert;

class OrderMailTypeExtension extends AbstractTypeExtension
{
    /**
     * @var EccubeConfig
     */
    protected $eccubeConfig;

    /**
     * MailType constructor.
     *
     * @param EccubeConfig $eccubeConfig
     */
    public function __construct(
        EccubeConfig $eccubeConfig
    ) {
        $this->eccubeConfig = $eccubeConfig;
    }

    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $templateIds = [
            $this->eccubeConfig['eccube_order_mail_template_id'],
            $this->eccubeConfig['eccube_order_accept_mail_template_id']
        ];

        $builder
            ->add('template', MailTemplateType::class, [
                'required' => false,
                'mapped' => false,
                'query_builder' => function (EntityRepository $er) use ($templateIds) {
                    return $er->createQueryBuilder('mt')
                        ->andWhere('mt.id IN (:id)')
                        ->setParameter(':id', $templateIds, \Doctrine\DBAL\Connection::PARAM_INT_ARRAY)
                        ->orderBy('mt.id', 'ASC');
                },
            ])
        ;
    }

    /**
     * {@inheritdoc}
     */
    public static function getExtendedTypes(): iterable
    {
        return [EntryType::class];
    }

}

EC-CUBE4.1からSymfony4.4が採用された関係で、FormExtensionの仕様が変わったらしく、以下のように記述

OrderMailTypeExtension.php
public static function getExtendedTypes(): iterable
    {
        return [EntryType::class];

3 受注管理画面からテンプレートメールを選択できるように

  1. src/Eccube/Form/Type/Adminの下にある「OrderMailType.php」を開き、55〜56行目をコメントアウト
OrderMailType.php
->add('template', MailTemplateType::class, [
    'required' => false,
    'mapped' => false,
    'query_builder' => function (EntityRepository $er) {
        return $er->createQueryBuilder('mt')
            // ->andWhere('mt.id = :id')
            // ->setParameter('id', $this->eccubeConfig['eccube_order_mail_template_id'])
            ->orderBy('mt.id', 'ASC');
    },
])

※受注管理のメール送信から送信する内容は一部DBから引っ張ってこれないため、選択できるテンプレートを限定するかコード追加でエラー回避させるかしなければならない。そのあたり今後勉強

Discussion