汎用メールフォーム TransmitMail で、サイトやフォームのタイトル等の固定テキストを、フォームのテンプレートとかメールのタイトルや本文など、随所に使用することがあります。

実際にとあるフォームを元にして似たようなタイトルの新たなフォームを作成した際、あちらこちらに修正漏れがありました。(歳かな?)

そこで、ChatGPT に相談しながら設定ファイルに独自変数を追加してテンプレート内で使えるようにしてみました。

私は YAML 形式の設定ファイルを使用していますので、config/config.yml の先頭に独自変数を追記します。config.yml に設定する既存の値も独自変数から取得するようにします。

config:
  # 独自設定
  site_name: ○○研修
  site_email: admin@example.jp

  email: %site_email%
  from_email: %site_email%
  replyto: true
  subject: 「%site_name%」お申し込み
  auto_reply: true
  auto_reply_email_input_name: mail_email
  auto_reply_subject: 「%site_name%」お申し込みありがとうございます
  auto_reply_name: 「%site_name%」事務局
  auto_reply_from_email: %site_email%

続いて、index.php で config.yml 内の %xxx% を独自変数に置換すると共に、独自変数をテンプレートで利用できるようにします。

なお、私の場合、ヘッダーとフッターを別ファイルにしていますので、$tm->run(); の前後で header.php と footer.php をインクルードしています。

require_once 'lib/TransmitMail.php';
$tm = new TransmitMail();
$tm->init('config/config.yml');

// config.yml 内の %xxx% を 置換
$replace_config_values = function ($value, $config) use (&$replace_config_values) {
  if (is_array($value)) {
    foreach ($value as $key => $item) {
      $value[$key] = $replace_config_values($item, $config);
    }
    return $value;
  }
  if (!is_string($value)) {
    return $value;
  }
  return preg_replace_callback(
    '/%([a-zA-Z0-9_]+)%/',
    function ($matches) use ($config) {
      $key = $matches[1];
      return isset($config[$key]) ? $config[$key] : $matches[0];
    },
    $value
  );
};
$tm->config = $replace_config_values($tm->config, $tm->config);

// config.yml の独自設定をテンプレートで利用可能にする
$custom_config = array(
  'site_name',
  'site_email',
);
foreach ($custom_config as $key) {
  if (isset($tm->config[$key])) {
    $tm->tpl->set($key, $tm->config[$key]);
  }
}

include 'header.php';

$tm->run();

include 'footer.php';

これで準備完了です。

input.html や finish.html などのフォームテンプレート、config/mail_body.txt などのメールテンプレート内で {$site_name} などと記載しておけば、独自変数として設定した値に変換されます。

finish.html

<p>「{$site_name}」にお申し込みいただきありがとうございます。<br>
  ご不明な点がございましたら、以下までお問合せください。</p>
<p>「{$site_name}」事務局<br />
  mail: <a href="mailto:{$site_email}">{$site_email}</a></p>

config/mail_body.txt

「{$site_name}」申込みフォームより送信されました。

また、index.php などのphpファイルでは、<?php echo $tm->config['site_name']; ?> として挿入することができます。

<h1>「<?php echo $tm->config['site_name']; ?>」<span>お申し込み</span></h1>

これで設定ファイルを編集するだけで、すべて該当箇所が書き換えられます。あまりニーズはないかもしれませんが、同じパターンのフォームを使い回す場合は便利かと。