HTMLメール テンプレート内でPHPの変数を使うには?

HTMLメール テンプレート内でPHPの変数を使うには?

皆さんこんにちは。

HTMLメール内で直接PHPのコードを書いても、処理が実行されない・・・
といったことはありませんか?

条件によって切り替わるパーツが多いと、それだけ複雑な変数や式を入れなければならず、どうすればいいか頭を悩ませてしまいます。

今回は、独自のテンプレートを作成して、変数を展開する方法について、簡単に説明しますね。

ヒアドキュメントで実装する時間が無かったので・・・

当初は、ヒアドキュメントを使って作ろうと思っていたのですが、、

  • ヒアドキュメント内では$_SESSIONが使えず、変数を入れなおさないといけない
  • ヒアドキュメントだと条件分岐が面倒で時間がかかる。。。 

ということで、結局ヒアドキュメントを使わずに実装することにしました。 

※ どなたかヒアドキュメントで実装する良い方法があればご教授頂きたいです。

ob_start でバッファを有効にしてコールバック置換する

ob_start() は出力内容をバッファに保存する関数ですが、コールバックとして渡すことも可能です。

例えば、以下のように、バッファを有効にしてHello!と出力すると、callback()の引数には、Hello!が渡されます。

コールバック関数が実行され、Hello! World!と出力される仕組みです。

ob_start() のコールバックについて何となく分かったところで、実装に入っていきましょう。

テンプレート内で変数を展開する

まず最初に、HTMLメールのテンプレート部分を別のファイルに保存し、変数として出力したい部分に独自のタグを作ります。

今回は、<% %> とします。このタグの間に変数名を入れます。

以下がその内容です。

<%name%><%device_name%>
というタグを作りました。

次に、コントローラー側で、<% %>で囲われている文字列を置換していきます。

preg_replace_callback()関数を使用し、
正規表現にマッチした結果を引数に取り、そのマッチ結果の変数を返しています。

バファリングを有効にしてコールバックさせれば、HTMLテンプレート自体を引数に取り、<% %>で囲われている文字列は全て置換されます。

これでテンプレート内で変数が使えるようになりました。

最後に

いかがでしたでしょうか?

既存のテンプレートエンジンフレームワークを入れるまでもない小規模なテンプレートでしたら、
こちらの方法でも十分活用できるかと思います。

今、変数だけでなく、if文やforeach文などを挿入できるか試行錯誤してますので、機会がありましたらまたお伝えしていきたいです。

(if文は入れ子になったとたん置換が難しい・・・)

今回はここまでです。

それでは、最近急に気温が下がったので体に気をつけてくださいね。


Previous: YubinBangoで郵便番号から住所を補完する Next: p5.jsでお絵かきしよう。

© 2017 ALL CONNECT Inc. All Rights Reserved.