2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

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

2
1
0

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
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?