search
LoginSignup
0

More than 1 year has passed since last update.

posted at

updated at

EC-CUBE4.0.5 受注登録のメールテンプレートを追加・選択するカスタマイズ

受注管理 > 受注登録 > メールを作成で選択できるメールテンプレートを追加するカスタマイズと、
テンプレートを全て表示していると選択した時にエラーになるテンプレートがあるため、
一部テンプレートのみ選べるように修正したのでメモ書き。

追記:カスタマイズ側での実装方法に修正。4.0.5で動作確認・リリース済み

1.DBにテンプレートを追加する

dtb_mail_templateにテンプレート情報を追加する
必要な項目のみ記載。

項目 内容
name   テンプレート名    
file_name   参照するtwigファイル
mail_subject   メールの件名 
discriminator_type mailtemplate

設定例
image.png

2.Twigファイルをアップロード

先にかいたtwigファイルを
app/template/default/Mail/以下に作成する。

(例1)新たにメールテンプレートを追加する時。

app/template/default/Mail/****.twig

のように配置する。内容は
src/Eccube/Resource/template/default/Mail/
ディレクトリ内の各ファイルを参照すると作りやすい。

(例2)既存の注文受付を編集する場合

src/Eccube/Resource/template/default/Mail/contact_mail.twig
をコピーし、
app/template/default/Mail/contact_mail.twigのように配置する。

3.任意のテンプレートだけ選べるようにする。

3-1定数定義用ファイル追加

template_file_nameというメールテンプレートを追加できるようにしたい場合、
app/config/eccube/packages/customize.yamlのような定数定義用のファイル([^1])を追加し、

[^1]: 名前は任意、アップデート時に破棄される可能性有。[ECCUBE4] 本体カスタマイズ時の設定ファイル

1でDBに追加したメールテンプレートを以下のように定数定義する。

app/config/eccube/packages/customize.yaml

    eccube_template_file_name_mail_template_id: 9

3-2 カスタマイズ用Extensionを追加して調整。

元ファイルであるsrc/Eccube/Form/Type/Admin/OrderMailType.phpをコピーして
app/Customize/Form/Extension/以下にOrderMailTypeExtension.phpを追加する。

もともと選択できる注文受付メールに加えて、他にも追加できるように、
$templateIdsを定義し、先ほどの定数値を入れ、使えるようにした。

src/Eccube/Form/Type/Admin/OrderMailType.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)
    {
        // NOTE:表示させたいテンプレートのID郡を定義。
        $templateIds = [
            $this->eccubeConfig['eccube_order_mail_template_id'],
            $this->eccubeConfig['eccube_template_file_name_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 function getExtendedType()
    {
        return OrderMailType::class;
    }

}
  • 最初、適当に$templateIdsを使おうとしていたらエラーになったので、
    よくよくみたら無名関数だったのでuse ($templateIds)を追記した。

  • クエリビルダ部分について

use Doctrine\ORM\EntityRepositoryを追記して、
addWhereidINすることを指定し、
実際のパラメーターをsetParameterで指定している。
この時第3引数の\Doctrine\DBAL\Connection::PARAM_INT_ARRAYは必須。
参考 【DBAL queryBuilder】コピペで使えるカモ?チートシート IN句

return $er->createQueryBuilder('mt')
          ->andWhere('mt.id IN (:id)')
          ->setParameter(':id', $templateIds, \Doctrine\DBAL\Connection::PARAM_INT_ARRAY 

(追記)formTypeのカスタマイズについて

  • 各所をカスタマイズ側に修正する。

    • namespace Customize\Form\Extension;
    • class OrderMailTypeExtension extends AbstractTypeExtension
  • 修正元のformtypeをuseして、getExtendedType()関数を実装

    app/Customize/Form/Extension/OrderMailTypeExtension.php
     use Eccube\Form\Type\Admin\OrderMailType;
    
    // 中略
    /**
     * {@inheritdoc}
     */
    public function getExtendedType()
    {
        return OrderMailType::class;
    }
    
    • Doctrineが使えるように以下を追記する。
    use Doctrine\ORM\EntityRepository;
    

ここまで設定すれば追加したメールテンプレートをセレクトボックスから使用できます。

参考

受注完了メールの種類について
[EC-CUBE4.0.3]メールテンプレートを追加する方法
【DBAL queryBuilder】コピペで使えるカモ?チートシート

EC-CUBE 4.0に触れてみて
[ECCUBE4] 本体カスタマイズ時の設定ファイル


Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
0