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

[TransmitMail 2](https://github.com/dounokouno/TransmitMail) に「存在する日付の判別」機能を追加するカスタマイズ例をご紹介します。

# 開発および動作確認環境

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

- TransmitMail: 2.0.0
- PHP: 5.6.10

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

`input.html` に下記のような入力フィールドを追加します。

```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:lib/exTransmitMail.php
<?php
class exTransmitMail extends TransmitMail
{
}
```

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

## 除外項目の設定

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

```php: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` 形式の入力を受け付けることにします。）

```php: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.php` の [554 行目](https://github.com/dounokouno/TransmitMail/blob/example_add_input_option_date/lib/TransmitMail.php#L554) の `メールアドレスチェック` 辺りを参考に。）（ `afterXXX` メソッドについては [Wiki](https://github.com/dounokouno/TransmitMail/wiki/TransmitMail-%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%AE%E5%90%84%E5%87%A6%E7%90%86%E3%81%AE%E5%AE%9F%E8%A1%8C%E9%A0%86%E7%95%AA%EF%BC%88v2%EF%BC%89) をご参照ください。）

```php: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_date` を `config/config.yml` に追加します。

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

# `index.php` を修正する</h2>

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

```php: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` はエラーになることが確認できました。

![](https://qiita-image-store.s3.amazonaws.com/0/43927/d01d9c6b-fd2a-8131-9a2e-857ded88ae4f.png)

# まとめ

以上、TransmitMail 2 に「存在する日付の判別」機能を追加するカスタマイズ例をご紹介でした。入力オプションの追加は少々実装が難しいですが、カスタマイズの参考になれば幸いです。

今回のカスタマイズのコードは下記ブランチで公開をしています。

[dounokouno/TransmitMail at example_add_input_option_date](https://github.com/dounokouno/TransmitMail/tree/example_add_input_option_date)

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

[「存在する日付の判別」機能を追加したカスタマイズ例 · dounokouno/TransmitMail@a9d8935](https://github.com/dounokouno/TransmitMail/commit/a9d8935f3f03506c89ed0a5bceaff4594f124e39)