TransmitMail 2 で入力内容を MySQL に保存する

[TransmitMail 2](https://github.com/dounokouno/TransmitMail) で入力内容を MySQL に保存するカスタマイズ例をご紹介します。

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

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

- TransmitMail: 2.0.0
- PHP: 5.6.10
- MySQL: 5.5.42

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

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

```html:input.html
<table>
    <tr>
        <th>お名前</th>
        <td><input type="text" name="お名前" value="{$お名前}"></td>
    </tr>
    <tr>
        <th>年齢</th>
        <td><input type="text" name="年齢" value="{$年齢}"></td>
    </tr>
    <tr>
        <th>メールアドレス</th>
        <td><input type="text" name="メールアドレス" value="{$メールアドレス}"></td>
    </tr>
</table>
```

# DB を用意する

DB は MySQL で、入力フィールドにあわせて下記のようなテーブル `contacts` を用意します。

| Field       | Type         | Null | Key | Default | Extra          |
|-------------|--------------|------|-----|---------|----------------|
| id          | int(11)      | NO   | PRI | NULL    | auto_increment |
| name        | varchar(255) | YES  |     | NULL    |                |
| age         | int(11)      | YES  |     | NULL    |                |
| email       | varchar(255) | YES  |     | NULL    |                |
| created_at  | datetime     | NO   |     | NULL    |                |

# DB 情報を `config.yml` に追加する

DB 情報を `config/config.yml` に追加します。

```yams:config/config.yml
config:
    db_name: transmitmail
    db_user: username
    db_password: password
    db_host: localhost
    db_table: contacts
```

# `exTransmitMail.php` を作成する

次に `TransmiMail` クラスを継承した `exTransmiMail` クラスを `lib/exTransmitMail.php` に作成します。

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

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

メール送信のあとの処理となる `afterSetTemplateAndSendMail ` メソッドを追加し、そこに処理を書いていきます。（ `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 afterSetTemplateAndSendMail()
{
    if ($this->page_name === 'finish') {
        try {
            $dns = 'mysql:host=' . $this->config['db_host'] . ';dbname=' . $this->config['db_name'] . ';charset=utf8';
            $pdo = new PDO($dns, $this->config['db_user'], $this->config['db_password']);
            $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

            $sql = 'insert into ' . $this->config['db_table'] . ' (name, age, email, created_at) values (:name, :age, :email, :created_at)';

            $stmt = $pdo->prepare($sql);
            $stmt->execute([
                ':name' => $this->post['お名前'],
                ':age' => $this->post['年齢'],
                ':email' => $this->post['メールアドレス'],
                ':created_at' => date('Y-m-d H:i:s')
            ]);

        } catch(PDOException $e) {
            echo $e->getMessage();
        }
    }
}
```

# `index.php` を修正する

`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();
```

# 動作確認

DB に `お名前`　、 `年齢` 、 `メールアドレス` 、 `登録日` が挿入されていることが確認できました。

![](https://qiita-image-store.s3.amazonaws.com/0/43927/33f8f931-7e80-2c4c-a641-69aa861a30ac.png)

# まとめ

以上、 TransmitMail 2 で入力内容を MySQL に保存するカスタマイズ例をご紹介でした。 TransmitMail 2 は DB 連携も実装しやすくなりました。

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

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

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

[入力内容を MySQL に保存するカスタマイズ例 · dounokouno/TransmitMail@6a69cb7](https://github.com/dounokouno/TransmitMail/commit/6a69cb7057ecdcde07e77414f82b47a671d22499)