CakePHP1.3.6:データを追加する。
前回のプログラムに、データの追加機能を追加する。初期画面は以下。
画面左下に、「登録」のリンクを張って、そこをクリックすると、以下の画面に遷移する。
また、いくつかのフィールドにバリデーション(Not empty)を実装して、エラーの場合、以下のように表示し、エラーがない場合にはデータを登録して、初期画面に遷移する。
コントローラーの作成
/add/controllersのcustomers_controller.phpにaddメソッド(アクション)を追加する。
addアクションには、
- 入力初期画面(入力を促す画面)の表示
- 入力後の登録処理
の2つのパターンで遷移してくるので、入力値の有無によって以下のように実装する。
<?php class CustomersController extends AppController{ public $name = 'Customers'; public $layout = 'myznala'; /** * * 初期画面(一覧表示) */ function index(){ $this->set('title_for_layout', "顧客の一覧"); $req=null; if(!empty($this->data)){ require_once '../vendors/MyConverter.class.php'; $req = MyConverter::getRequestParams($this->data["Customer"]); $result = $this->Customer->find('all', array('conditions' => array('Customer.name like ?' => array("%{$req["name"]}%")))); }else{ $result = $this->Customer->find('all'); } $this->set('result',$result); } /** * * データの追加 */ function add(){ $this->set('title_for_layout', "顧客の登録"); if(!empty($this->data)){ $this->Customer->save($this->data); if($this->Customer->validates()){ $this->redirect('.'); } } } } ?>
ビューの作成
index.ctp
初期の一覧画面は以下のように実装する。
名前で絞り込みをします。 <?php echo $form->create(null,array('type'=>'post','action'=>'.')); echo $form->text('Customer.name', array('size' => 10)); echo $form->end('送信'); ?> <table> <tr> <th>ID</th> <th>名前</th> <th>郵便番号</th> <th>住所</th> <th>電話</th> <th>携帯</th> <th>メール</th> <th>更新日</th> </tr> <?php foreach ($result as $arr){ echo '<tr>'; echo "<td>{$arr['Customer']['id']}</td>"; echo "<td>{$arr['Customer']['name']}</td>"; echo "<td>{$arr['Customer']['zip']}</td>"; echo "<td>{$arr['Customer']['address']}</td>"; echo "<td>{$arr['Customer']['tel']}</td>"; echo "<td>{$arr['Customer']['mobile']}</td>"; echo "<td>{$arr['Customer']['mail']}</td>"; echo "<td>{$arr['Customer']['timestamp']}</td>"; echo '</tr>'; } ?> </table> <a href="add">登録</a>
add.ctp
データ登録用の画面は以下。入力フィールドの後ろに、エラー出力を付加する。ちょっとごちゃごちゃしているのが気に入らないなぁ。
<?php echo $form->create(null,array('type'=>'post','action'=>'add')); ?> <table> <?php echo "<tr><th>名前</th>"; echo "<td>{$form->text('Customer.name',array('size'=>'20'))}{$form->error('Customer.name')} </td>"; echo "</tr>"; echo "<tr><th>郵便番号</th>"; echo "<td>{$form->text('Customer.zip',array('size'=>'10'))}{$form->error('Customer.zip')}</td>"; echo "</tr>"; echo "<tr><th>住所</th>"; echo "<td>{$form->text('Customer.address',array('size'=>'20'))}{$form->error('Customer.address')}</td>"; echo "</tr>"; echo "<tr><th>電話</th>"; echo "<td>{$form->text('Customer.tel',array('size'=>'15'))}{$form->error('Customer.tel')}</td>"; echo "</tr>"; echo "<tr><th>携帯</th>"; echo "<td>{$form->text('Customer.mobile',array('size'=>'15'))}</td>"; echo "</tr>"; echo "<tr><th>メール</th>"; echo "<td>{$form->text('Customer.mail',array('size'=>'40'))}{$form->error('Customer.mail')}</td>"; echo "</tr>"; echo "<tr><th>メモ</th>"; echo "<td>{$form->textarea('Customer.memo')}</td>"; echo "</tr>"; echo $form->end('送信'); ?> </table> <a href=".">リストに戻る</a>
モデルの作成
/app/modelsのcustomer.phpは以下。
<?php class Customer extends AppModel { public $name = 'Customer'; public $validate = array( 'name'=>array( 'rule' => 'notEmpty', 'message' =>'入力してください'), 'zip'=>array( 'rule' => 'notEmpty', 'message' =>'入力してください'), 'address'=>array( 'rule' => 'notEmpty', 'message' =>'入力してください'), 'tel'=>array( 'rule' => 'notEmpty', 'message' =>'入力してください'), 'zip'=>array( 'rule' => 'notEmpty', 'message' =>'入力してください'), 'mail'=>array( 'rule' => 'notEmpty', 'message' =>'入力してください') ); } ?>
この例では、mobile(携帯の入力フィールド)にnotEmptyを設定していない。これに対して、テーブルはnot nullを設定してある。
携帯の入力フィールドに何も入力しなくても、例外が発生することなくデータが登録される。(最初の画像の3行目) 注意が必要。