クライアントの釣り船の予約サイトで、これからはユーザ登録時に生年月日と性別も登録していただいて、乗船記録の記入を楽にしたいという要望がありました。
サイトはWordpressとMTS Simple Bookingビジネス版という予約システムのプラグインを使っているので、そこはカスタマイズ可能なはず。
早速プラグイン配布元の、ドキュメントを読みにいったら、ありました。
ちょうどサンプルも生年月日と性別。いやいや、これはまるまるコピーで行けるんじゃない?
サンプルソースも、登録会員サイトに行けばダウンロードできると書いてあるし。
ラッキー!これはあっさり、1時間の仕事かな?
って思ってたら甘かった。
サンプルソースがない。サイト中探してもない。ダウンロードできるって書いてあるから、堂々と「ソースどこにも見当たりませんよー、アップしてくださいよー」ってメールを書こうかな?と思いましたが、これまで2回ぐらいメールでお世話になってるし、そもそもこの機能に対して申し訳ないぐらい安いプラグインなので、あまり大きな顔もできないし。ドキュメントを読み読み、作っていくことにしました。
編集するファイルは一つだけ:
mts-simple-booking/lib/MtssbUserFormTemp.php
これをドキュメントに従っていじっていきます。
変更する部分は大きく3つ。設定の追加と、登録フォーム、そして入力確認画面です。
それでは先ず設定部分から。
設定の追加
■カスタム項目設定
12行目あたり customItems関数に、genderとbirthdayを追加します。ただし、後で説明しますが、予約フォームの生年月日と連携できるようにするために、生年月日は年・月・日の配列にします。
public function customItems() { return array('gender' => 'true', 'birthday' => array('year' => 'true', 'month' => 'true', 'day' => 'true')); }
■カスタムデータ項目設定
19行目あたり clearCustom関数に上と同様の配列を追記します。おそらくデータの初期化をやってるんでしょうか?
public function clearCustom() { return array('gender' => "", 'birthday' => array('year' => "", 'month' => "", 'day' => "")); }
■カスタムデータの入力処理
26行目あたり inputCustom関数で、$_POSTで送られてきたデータを内部キーと紐づけます。
public function inputCustom() { return array('gender' => esc_attr($_POST['user']['gender']), 'birthday' => array( 'year' => esc_attr($_POST['user']['birthday']['year']), 'month' => esc_attr($_POST['user']['birthday']['month']), 'day' => esc_attr($_POST['user']['birthday']['day']) ) ); }
■カスタムデータのエラー処理
31行目あたり checkCustom関数でエラーチェックを行います。
入力チェックだけしてますが、本来なら桁数チェックなどもやったほうがいいですね。ここに渡されるデータにはすでにstripslashes()はされてるそうです。
public function checkCustom($custom) { foreach ($custom as $key => $val) { if ($key == 'birthday') { foreach ($val as $k => $v) { if ($v == '') { $error['birthday']['day'] = '必須入力項目です'; break; } } } else { if ($val == '') { $error[$key] = '必須入力項目です'; } } } return $error; }
登録フォーム
38行目あたりから始まるinputForm関数の頭に以下のコードを挿入します。
これはmts-simple-booking/lib/MtssbFormCommon.phpですでに定義されてる年、月、日のプルダウン生成用の関数を利用しています。
引数は、id、class名、name、デフォルト値の順です。selectyear()だけはそのあとに年の最小・最大を指定します。最大・最小を逆にすると、年が降順に生成されます。
$birthSelect = $this->selectYear('birth-year', 'mts-select', 'user[birthday][year]', $oUser->custom->birthday->year, 2005, 1940) . "年"; $birthSelect .= $this->selectMonth('birth-month', 'mts-select', 'user[birthday][month]', $oUser->custom->birthday->month) . "月"; $birthSelect .= $this->selectDay('birth-day', 'mts-select', 'user[birthday][day]', $oUser->custom->birthday->day) . "日";
同じinputForm関数の生年月日と性別を表示させたい部分に以下のソースを入れます。自分はフリガナの後に入れることにしました。
性別のラジオボタンで使われているsetChecked()も先ほどのMtssbFormCommon.phpで定義されています。引数はvalueで指定される値と、選択されているかどうかを判断するために比較する値(デフォルト値やフォームから送られてきた値)の二つです。
<tr class="user-column birthday"> <th><label for="birth-year">生年月日 (<span class="required">*</span>)</label></th> <td> {$birthSelect} {$err->custom->birthday->day} </td> </tr> <tr class="user-column gender"> <th><label>性別 (<span class="required">*</span>)</label></th> <td> <label><input type="radio" name="user[gender]" value="male" {$this->setChecked('male', $oUser->custom->gender)}> 男</label> <label><input type="radio" name="user[gender]" value="female" {$this->setChecked('female', $oUser->custom->gender)}> 女</label> <input type="radio" name="user[gender]" value="" style="display: none;"> {$err->custom->gender} </td> </tr>
入力確認
161行目あたりにあるconfirmationForm関数に生年月日と性別の表示部分を追加しますが、まず、性別はmaleとfemaleという値で入ってくるので、それを日本語に直します。
最初から、男性・女性という値を使ってもいいんですが、予約フォームの性別の値がそうなってるためあとで連携するのが楽になります。
public function confirmationForm($oUser, $ctrl)
{
のすぐ下に、
$gender = ($oUser->custom->gender == 'male') ? '男' : '女';
そして、以下のソースを表示させたいところに入れます。
<tr class="user-column birthday"> <th>生年月日</th> <td> {$oUser->custom->birthday->year}年{$oUser->custom->birthday->month}月{$oUser->custom->birthday->day}日 <input type="hidden" name="user[birthday][year]" value="{$oUser->custom->birthday->year}"> <input type="hidden" name="user[birthday][month]" value="{$oUser->custom->birthday->month}"> <input type="hidden" name="user[birthday][day]" value="{$oUser->custom->birthday->day}"> </td> </tr> <tr class="user-column gender"> <th>性別</th> <td>{$gender} <input type="hidden" name="user[gender]" value="{$oUser->custom->gender}"> </td> </tr>
これでユーザ登録時に生年月日と性別を登録できるようになります。
ただ、今のままでは予約フォームの生年月日と性別にデフォルト値として反映されません。
それには、ほかのPHPファイルも編集する必要があります。その編集方法は次回説明しようと思います。