「CodeIgniter徹底入門」(翔泳社刊)は非常に優れた解説書だと思いますが、如何せんCodeIgniter1.6対応と古いです。ということで、取り敢えず1.73でも動作することを確認し、2.xへ対応させながら、CodeIgniterとPHPのフレームワークについて学んでおります。しばらく、2.x系への移行について述べていこうと思います。
CodeIgniter2.x系では、親クラスの継承の際にCIがつくようになっています。つまり、「Shop extends Controller」が、「Shop extends CI_Controller」。また、初期化メソッドで、「parent::Controller」が「parent::__construct()」に変わっています。これらは、Modelクラスでも同じです。それは周知のことですが、悩ましいのはプラグインがなくなったことと、ヘルパーのValidationクラスがライブラリーに移行し、仕様が変わったことだと思います。また、「入門」にある拡張ライブラリーの在り処が変更されています。
という訳で、例題の中でも一番面白い「簡易ショッピングサイト」を2.0系に対応させることから初めて見ます。Validationクラスはクラス名が変更されれ、ルールの書き方やデータの受け取り方が変更されています。このコードは例題の至るところにありますので、注意が必要です。
load->helper('validation')はload->library('form_validation')に変更されています。 ルールの書き方は基本的に、 $this->form_validation->set_rules('変数のフォーム上の英語の名前(field)','変数の日本語名(label)', 'ルール(rule)'); を必要なだけ書く。 検証された変数の受け取りは、set_valueとなっています。正式には $this->form_validation->set_value('変数の英語名'); だと思いますが。
この辺りは、マニュアルサイトの次の箇所に基本が書かれています。
http://codeigniter.jp/user_guide_ja/libraries/form_validation.html
ということで、Controllerのshop.phpを例に取ってみますと、function _set_validation()は次のように変更する必要があるようです。
// バリデーションの設定 function _set_form_validation() { $this->load->library('form_validation'); $this->form_validation->set_error_delimiters('
'); //$fields['name'] = '名前'; //$fields['zip'] = '郵便番号'; //$fields['addr'] = '住所'; //$fields['tel'] = '電話番号'; //$fields['email'] = 'メールアドレス'; //$this->form_validation->set_fields($fields); //$rules['name'] = 'trim|required|max_length[64]'; //$rules['zip'] = 'trim|valid_emailmax_lenght[8]'; //$rules['addr'] = 'trim|required|max_length[128]'; //$rules['tel'] = 'trim|required|max_length[20]'; //$rules['email'] = 'trim|required|valid_email|max_lenght[64]'; $this->form_validation->set_rules('name', '名前', 'trim|required|max_length[64]'); $this->form_validation->set_rules('zip', '郵便番号', 'trim|required|max_lenght[8]'); $this->form_validation->set_rules('addr', '住所', 'trim|required|max_length[128]'); $this->form_validation->set_rules('tel', '電話番号', 'trim|required|max_length[20]'); $this->form_validation->set_rules('email', 'メールアドレス','trim|required|valid_email|max_lenght[64]'); }
これに対応して、ユーザー情報の入力・確認画面はつぎのようになりました。
<div class="shop_title">注文内容の確認</div> <div class="outer_frame"> <table> <tbody> <tr><th>お名前</th> <td> <?=form_prep($this->form_validation->set_value('name'));?> </td> </tr> <tr><th>郵便番号</th> <td> <?=form_prep($this->form_validation->set_value('zip'));?> </td> </tr> <tr><th>住所</th> <td> <?=form_prep($this->form_validation->set_value('addr'));?> </td> </tr> <tr><th>電話番号</th> <td> <?=form_prep($this->form_validation->set_value('tel'));?> </td> </tr> <tr><th>メールアドレス</th> <td> <?=form_prep($this->form_validation->set_value('email'));?> </td> </tr> </tbody> </table> </div> <div align="center"> <table width="95%" border="0" cellspacing="0"> <tbody> <tr> <th bgcolor="#E8DF8E" class="line_2"> </th> <th bgcolor="#E8DF8E" class="line_1">商品名</th> <th bgcolor="#E8DF8E" class="line_1">数量</th> <th bgcolor="#E8DF8E" class="line_1">単価</th> <th bgcolor="#E8DF8E" class="line_1">金額</th> <th bgcolor="#E8DF8E" class="line_1"> </th> </tr> <?php foreach($cart as $line => $item): ?> <tr> <td width="30" align="center" bgcolor="#E1E1E1" class="line_2"><?=$line?></td> <td bgcolor="#FFFFFF" class="line_1"><?=$item['name']?></td> <td align="center" bgcolor="#FFFFCC" class="line_1"><?=$item['qty']?></td> <td align="right" bgcolor="#FFFFFF" class="line_1"><?=number_format($item['price'])?>円</td> <td align="right" bgcolor="#FFFFFF" class="line_1"><?=number_format($item['amount'])?>円</td> <td align="right" bgcolor="#FFFFFF" class="line_1"> </td> </tr> <?php endforeach; ?> <tr> <td class="line_2"></td> <td align="center" bgcolor="#333333" class="line_2"> <?=form_open('shop/customer_info');?> <input type="submit" value="お客様情報の入力へ戻る" /> <?=form_close();?> </td> <td></td> <td align="center" bgcolor="#FFCC00" class="line_2">合計</td> <td align="right" bgcolor="#FFFFFF" class="line_2"><?=number_format($total);?>円</td> <td align="center" bgcolor="#333333" class="line_2"> <?=form_open('shop/order');?> <!-- CSRF対策のワンタイムチケットです。 --> <?=form_hidden('ticket', $this->ticket);?> <input type="submit" value="注文を確定する" /> <?=form_close();?> </td> </tr> </tbody> </table> </div> <br />
Validationを通過した後、変数を受け取るためのfunction confirm()は次のようです。
// 注文内容確認 function confirm() { $this->_set_form_validation(); if ($this->form_validation->run() == TRUE) { # 検証をパスした入力データは、モデルを使って保存します。 //$data['name'] = $this->form_validation->name; //$data['zip'] = $this->form_validation->zip; //$data['addr'] = $this->form_validation->addr; //$data['tel'] = $this->form_validation->tel; //$data['email'] = $this->form_validation->email; $data['name'] = $this->form_validation->set_value('name'); $data['zip'] = $this->form_validation->set_value('zip'); $data['addr'] = $this->form_validation->set_value('addr'); $data['tel'] = $this->form_validation->set_value('tel'); $data['email'] = $this->form_validation->set_value('email'); $this->Shop_model->set_customer_info($data); $cart = $this->Shop_model->get_cart(); $data['total'] = $cart['total']; $data['cart'] = $cart['items'];
こうした変更を施すことで、簡易ショッピングサイトは動作してくれています。コンタクト・システム、掲示板システムも同じように動いています。細かなチェックをして、問題があれば追記します。次は、メールの送信の仕方について述べてみます。