🧊
【EC-CUBE4.1.2】メールテンプレートの追加とテンプレート選択の追加
会社で使用する「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テンプレートを追加
- 既存のメールテンプレートは「src/Eccube/Resource/template/default/Mail」の中に保存されているので、流用するなり新規で作成するなりする。
- 作業時はコピーして新たなテンプレートで作成。ECCUBEではhtmlとテキストでテンプレートが別々に保存されるようになっていたため、メール編集ではそれぞれ連動しない点に注意。
逆に言えばその時点でテンプレート内に2つ別々の内容を保存できる。(だったら簡単に追加できた方が楽なのだが・・・)
2 作成したテンプレートを選択できるようにする
1 テンプレートid定義用のファイルを追加
- /app/config/eccube/packages/customize.yamlというファイルを作成し設置。
customize.yaml
parameters:
eccube_order_accept_mail_template_id: 11
※上記は追加したテンプレートidを追加
2 カスタマイズ用のExtensionを追加
- /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 受注管理画面からテンプレートメールを選択できるように
- 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