• Ubuntuに関連したハード、ソフトの備忘録サイトです

「CodeIgniter徹底入門」の2.x系への対応(1)ー変更の基本


「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'];

こうした変更を施すことで、簡易ショッピングサイトは動作してくれています。コンタクト・システム、掲示板システムも同じように動いています。細かなチェックをして、問題があれば追記します。次は、メールの送信の仕方について述べてみます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA