LoginSignup
1

More than 5 years have passed since last update.

posted at

TransmitMail 2 に「存在する日付の判別」機能を追加する

TransmitMail 2 に「存在する日付の判別」機能を追加するカスタマイズ例をご紹介します。

開発および動作確認環境

開発および動作確認環境は下記の通りです。

  • TransmitMail: 2.0.0
  • PHP: 5.6.10

input.html に入力フィールドを追加する

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 に作成します。

lib/exTransmitMail.php
<?php
class exTransmitMail extends TransmitMail
{
}

exTransmitMail クラスに機能を実装する

除外項目の設定

このままだとループ出力時に date が表示されてしまうので、 date を除外する設定を lib/exTransmitMail.php に追加します。 lib/TransmitMail.php$exclusion_item をコピーしてきて、末尾に date を追加します。

lib/exTransmitMail.php
<?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 形式の入力を受け付けることにします。)

lib/exTransmitMail.php
/**
 * 存在する日付の判別
 *
 * @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.php554 行目メールアドレスチェック 辺りを参考に。)( afterXXX メソッドについては Wiki をご参照ください。)

lib/exTransmitMail.php
/**
 * 入力内容をチェックのあとの処理
 */
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_dateconfig/config.yml に追加します。

config/config.yml
config:
    error_date: は存在する日付で入力してください。

index.php を修正する

index.phplib/exTransmitMail.php の読み込みと TransmitMail クラスではなく exTransmitMail クラスを利用するように修正します。

index.php
<?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

修正ファイルは下記のコミットをご参照ください。

「存在する日付の判別」機能を追加したカスタマイズ例 · dounokouno/TransmitMail@a9d8935

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
1