OpenPNE3.4 → 3.6 でメールテンプレ追加まわりの挙動が変化しました。
今までは、
管理画面から書き換えたメールテンプレをDBから取得
↓ なかったら
OpenPNEの ./template/* からテンプレート取得
とやっていましたが、メールテンプレートのデフォルト値を
設定している mail_template.yml から引っ張ってくるだけで
いいのでは?ってことを考えていました。
(実際にMLでも井上さんが提言してました。)
特にメールテンプレートのデフォルト値と ./template/* の
テンプレートに差異が生まれてしまうとかなり厄介です。
というわけで、以下の処理に変更
管理画面から書き換えたメールテンプレをDBから取得
↓ なかったら
mail_template.yml のデフォルト値を取得
↓ なかったら
OpenPNEの ./template/* からテンプレート取得
という処理になりました。
今回はそんな変更もあったので、プラグイン開発者向けな話しをしてみます。
以下は
- ディレクトリは、 OpenPNE のディレクトリをカレントディレクトリと想定して書いています。
- SNSは http://sns.example.com/ に設置しているものとします。
プラグインでのメールテンプレの追加
さて、プラグインで(管理者が文面を変更可能な)メールのテンプレートを追加するときはどうすれば良いか。
今回の変更の成果もあり、かんたんです。
プラグインのディレクトリのconfig/ 以下に mail_template.yml
を作成して以下のようなファイルを作成します。
pc: #pc用のメール文面であることを示す。携帯用であればmobile
hello_mail: #メールテンプレートの名称。別のメールテンプレートと同じではいけない(pc・mobileは別として扱える)
caption: "ハローメール" #管理画面で出すテンプレート名称
configurable: true # true にすると管理画面で送信するか否かを選択可能になる
title_configurable: true # trueでSubject変更可能に
sample: # テンプレート文面サンプル
ja_JP: # 言語指定 存在しない言語のテンプレートを取得しようとした場合、上にある言語が優先される
- " {{ op.config.sns_name }} からのあいさつ" # Subjectテンプレ
- | # 本文テンプレ
こんにちはこんにちは!! {{ member.name }} さんこんにちは!
variables: # パラメタの説明(管理画面で利用)
"op_config.sns_name": "SNS 名"
"member.name": "受信者のニックネーム"
Twig形式で作成することは今までこどおり。
Twig形式に関する情報は http://sns.example.com/pc_backend/help_template_format
で見ることができます。
もしくは http://www.twig-project.org/documentation で。
キャッシュをクリアすると
http://sns.example.com/pc_backend.php/mail/edit
に、今回追加したメールテンプレートが編集できるようになってます。
そして送信
さて、テンプレ追加したところで送信のロジックを書いていないので書きましょう。
メールを送りたいしかるべきポイントがきたら以下を呼び出します。
opMailSend::sendTemplateMail(テンプレ名, 相手のアドレス, 送信アドレス, パラメータ);
もっと具体的に行きます。メンバーID=1に対して 管理者アドレス(管理画面から設定)で
今回作成した hello_mail テンプレを利用して送ります。
$member = Doctrine::getTable('Member')->find(1); //メンバーID=1のMemberオブジェクト取得 $params = array('member' => $member); //メールテンプレ用パラメータ opMailSend::sendTemplateMail('hello_mail', $member->getEmailAddress(), opConfig::get('admin_mail_address'), $params); //送信
これだけです。
ちなみに、Member::getEmailAddress() は 引数なしだと実行アプリケーションに依存してメールドレスを取得します。
(PC版であればPCアドレスを優先して、モバイルであればモバイルアドレスを優先します。)
Member::getEmailAddress(true) とするとモバイルのアドレスがある場合そちらを取得します。
なお、 sendTemplateMail() は モバイルのメールアドレスを 送信先に指定すると
モバイルのテンプレートを呼び出すことになります。
今回のようなモバイルのアドレスを指定する可能性がありそうな場合は、モバイルのテンプレートもしっかりと作成しましょう。