CakePHP 1.2のサンプルで確認画面ありのフォーム
CakePHPを使ってみて思ったのが、「確認画面ありのフォームは、手軽には作れないか」ということがありました。入力内容の確認画面というのは、日本独自の文化、という話を聞きます。CakePHPも日本製ではないので、scaffoldでは確認画面ありのフォームは用意されません。
そこで、とりあえずWebサイトでありがちそうな確認画面ありの入力フォームを作ってみました
DB(SQL)
- MySQL 5
- 名前、企業名、郵便番号、電話番号、FAX、e-mail、お問い合わせ内容というあたりを定義してみました
- 電話番号などをintにするかどうかは、悩みますね
- 姓名でわけて入力するフォームというのは、多いのでわけて定義してみました
CREATE TABLE claimants ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, name_sei VARCHAR(50), name_mei VARCHAR(50), name VARCHAR(100), corporate VARCHAR(100), post VARCHAR(10), tel VARCHAR(15), fax VARCHAR(15), email VARCHAR(100), memo TEXT, created DATETIME DEFAULT NULL, modified DATETIME DEFAULT NULL );
Controller
- indexで入力して、confirmで確認、complateで完了という画面遷移をたどります
- とりあえずは、一方通行にしてみました
- 本当は、入力フォームに戻るのが多いですよね
- FormHiddenというヘルパーは自作のヘルパーです
<?php class ClaimantsController extends AppController { var $name = 'Claimants'; var $helpers = array('Html', 'Form', 'FormHidden'); function index() { } function confirm() { if($this->data) { $this->Claimant->set($this->data); if($this->Claimant->validates()) { $this->Session->write('token', String::uuid()); $this->set('data', $this->data); }else{ $this->render('index'); } }else{ $this->redirect('/claimants/'); } } function complate() { if($this->data){ $this->Claimant->set($this->data); if($this->Claimant->validates()) { $this->set('data', $this->data); if($this->Session->read('token')) { $this->Claimant->save(); $this->Session->destroy('token'); }else{ $this->redirect('/claimants/'); } }else { $this->render('confirem'); } }else{ $this->redirect('/claimants/'); } } } ?>
Helper
- FormHiddenヘルパーは、自作のヘルパーです
- input要素のhiddenで$this->dataの値をinput要素に変換して埋め込みます
- 一応、三段階ぐらいまで(日付とかもこれぐらいなので、いいんじゃないかなあ、と)
<?php class FormHiddenHelper extends AppHelper { function set() { $html = NULL; if(!empty($this->data)) { foreach($this->data as $model_name => $items) { foreach($items as $item_key => $item) { if(!is_array($item)) { $html .= '<input type="hidden" name="data[' . $model_name . '][' . $item_key . ']" value="' . h($item) . '" />' . " "; }else{ foreach($item as $item_array_key => $item_array) { $html .= '<input type="hidden" name="data[' . $model_name . '][' . $item_key . '][' . $item_array_key . ']" value="' . h($item_array) . '" />'; } } } } } return $html; } } ?>
View(index)
<h1>申し込み</h1> <?php print $form->create('Claimant', array('action'=>'confirm')); ?> <?php print $formHidden->set(); ?> <table> <tr> <td> 名前 </td> <td> <?php print $form->error('name_sei', '名前(姓)を入力してください'); print $form->text('name_sei'); ?> <?php print $form->error('name_mei', '名前(名)を入力してください'); print $form->text('name_mei'); ?> </td> </tr> <tr> <td> 会社名 </td> <td> <?php print $form->error('corporate', '会社名を入力してください'); print $form->text('corporate'); ?> </td> </tr> <tr> <td> 郵便番号 </td> <td> <?php print $form->error('zip', '入力してください'); print $form->text('zip'); ?> </td> </tr> <tr> <td> 電話番号 </td> <td> <?php print $form->error('tel', '入力してください'); print $form->text('tel'); ?> </td> </tr> <tr> <td> FAX番号 </td> <td> <?php print $form->error('fax', 'FAX番号を入力してください'); print $form->text('fax'); ?> </td> </tr> <tr> <td> E-mail </td> <td> <?php print $form->error('email', 'E-mailを入力してください'); print $form->text('email'); ?> </td> </tr> <tr> <td> お問い合わせ内容 </td> <td> <?php print $form->error('memo', 'お問い合わせ内容を入力してください'); print $form->textarea('memo'); ?> </td> </tr> </table> <?php print $form->submit('確認する'); ?> <?php print $form->end(); ?>
view(confirm)
- 自作のformhiddenヘルパーで入力された値をhiddenで埋め込みます
- $form->value()メソッドで入力された値を書き出します
- $formヘルパーにvalueメソッドの記述はないんですが、AppHelperに実装されています
<h1>確認</h1> <?php print $form->create('Claimant', array('action'=>'complate')); ?> <?php print $formHidden->set(); ?> <table> <tr> <td> 名前 </td> <td> <?php print h($form->value('name_sei')); ?> <?php print h($html->value('name_mei')); ?> </td> </tr> <tr> <td> 会社名 </td> <td> <?php print h($form->value('corporate')); ?> </td> </tr> <tr> <td> 郵便番号 </td> <td> <?php print h($form->value('zip')); ?> </td> </tr> <tr> <td> 電話番号 </td> <td> <?php print h($form->value('tel')); ?> </td> </tr> <tr> <td> FAX番号 </td> <td> <?php print h($form->value('fax')); ?> </td> </tr> <tr> <td> E-mail </td> <td> <?php print h($form->value('email')); ?> </td> </tr> <tr> <td> お問い合わせ内容 </td> <td> <?php print h($form->value('memo')); ?> </td> </tr> </table> <?php print $form->submit('問い合わせする'); ?> <?php print $form->end(); ?>