TransmitMail 2 に「存在する日付の判別」機能を追加するカスタマイズ例をご紹介します。
開発および動作確認環境
開発および動作確認環境は下記の通りです。
- TransmitMail: 2.0.0
- PHP: 5.6.10
input.html
に入力フィールドを追加する
input.html
に下記のような入力フィールドを追加します。
<table>
<tr>
<th>日付</th>
<td>
<input type="date" name="日付" value="{$日付}">
<input type="hidden" name="date[]" value="日付">
{if:$date.日付}
<div class="error">{$date.日付}</div>
{/if:$date.日付}
</td>
</tr>
</table>
exTransmitMail.php
を作成する
次に TransmiMail
クラスを継承した exTransmiMail
クラスを lib/exTransmitMail.php
に作成します。
<?php
class exTransmitMail extends TransmitMail
{
}
exTransmitMail
クラスに機能を実装する
除外項目の設定
このままだとループ出力時に date
が表示されてしまうので、 date
を除外する設定を lib/exTransmitMail.php
に追加します。 lib/TransmitMail.php
の $exclusion_item
をコピーしてきて、末尾に date
を追加します。
<?php
class exTransmitMail extends TransmitMail
{
public $exclusion_item = '[
"x",
"y",
"page",
"required",
"hankaku",
"hankaku_eisu",
"hankaku_eiji",
"num",
"num_hyphen",
"hiragana",
"zenkaku_katakana",
"zenkaku",
"zenkaku_all",
"email",
"match",
"len",
"url",
"num_range",
"file",
"file_remove",
"file_required",
"date"
]';
}
存在する日付の判別処理を追加する
次に存在する日付の判別処理を追加します。
まずは、存在する日付をチェックする isDate
メソッドを作ります。(ここでは YYYY-MM-DD
形式の入力を受け付けることにします。)
/**
* 存在する日付の判別
*
* @param string $string
* @return boolean
*/
public function isDate($string)
{
$array = explode('-', $string);
$year = isset($array[0]) ? $array[0] : null;
$month = isset($array[1]) ? $array[1] : null;
$day = isset($array[2]) ? $array[2] : null;
return checkdate($month, $day, $year);
}
入力内容のチェックのあとの処理となる afterCheckInput
メソッドを追加し、そこに処理を書いていきます。( lib/TransmitMail.php
の 554 行目 の メールアドレスチェック
辺りを参考に。)( afterXXX
メソッドについては Wiki をご参照ください。)
/**
* 入力内容をチェックのあとの処理
*/
public function afterCheckInput()
{
// 日付チェック
if (isset($this->post['date'])) {
foreach ($this->post['date'] as $value) {
$this->tpl->set("date.$value", false);
if (!empty($this->post[$value])) {
if (!$this->isDate($this->post[$value])) {
$this->tpl->set("date.$value", $this->h($value . $this->config['error_date']));
$this->global_errors[] = $this->h($value . $this->config['error_date']);
}
}
}
}
}
エラーメッセージの設定を追加する
エラーメッセージ error_date
を config/config.yml
に追加します。
config:
error_date: は存在する日付で入力してください。
index.php
を修正する
index.php
に lib/exTransmitMail.php
の読み込みと TransmitMail
クラスではなく exTransmitMail
クラスを利用するように修正します。
<?php
require_once 'lib/TransmitMail.php';
require_once 'lib/exTransmitMail.php';
$tm = new exTransmitMail('config/config.yml');
$tm->run();
動作確認
日付
フィールドに 2015-02-28
と入力した場合はエラーにならず、 2015-02-29
はエラーになることが確認できました。
まとめ
以上、TransmitMail 2 に「存在する日付の判別」機能を追加するカスタマイズ例をご紹介でした。入力オプションの追加は少々実装が難しいですが、カスタマイズの参考になれば幸いです。
今回のカスタマイズのコードは下記ブランチで公開をしています。
dounokouno/TransmitMail at example_add_input_option_date
修正ファイルは下記のコミットをご参照ください。