めも帖

「めも帖」代わりにダラダラと書いていったり、めもしたりしているだけです。

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