最近はCakePHPを書いていましたが、丁度良い案件があったため気になっていたCodeigniterを試してみました。
基本的にはCakePHPやよくある感じのMVCでした。
http://oreno.host/Controller名/Function名/パラメータ/
みたいにURL構成も同様。
試しに簡単なControllerとして
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Blog extends CI_Controller {
public function index() {
$data['message'] = 'こんにちは、世界!';
$this->load->view('blog/index', $data);
}
}
みたいなかたちで値を渡してviewを表示。
$this->load->view() で複数のviewも呼び出せるらしい。
ヘッダー、フッターとかに使えるのかな。
↑Controller用にviewを用意
<HTML>
<BODY>
<?php echo $message ?>
</BODY>
</HTML>
これで「こんにちは、世界!」と表示されました。
続いてDBも使用して登録・編集フォームを作成してみます。
DB接続のためにdatabase.phpに設定を記載します。
今回はこれのために適当にDB作成してblogテーブルを作成しました。
テーブルのデータを扱うためにモデルクラスを作成します。
<?php
class Blog_model extends CI_Model {
function __construct() {
parent::__construct();
}
function get_data() {
$query = $this->db->get('blog');
return $query->result();
}
function get_data_by_id($id) {
$query = $this->db->get_where('blog', array('id' => $id));
return $query->result();
}
function add($post) {
$data['title'] = $post['title'];
$data['content'] = $post['content'];
$this->db->insert('blog', $data);
}
function edit($post) {
$data['title'] = $post['title'];
$data['content'] = $post['content'];
$this->db->where('id', $post['id']);
$this->db->update('blog', $data);
}
}
用意した機能は全データ取得、id指定データ取得、データ登録、データ編集の4つです。
FW側で用意されている機能を使用すればSQLを書く必要なしです。
これをControllerで↓のように使用しました。
class Blog extends CI_Controller {
/**
* 一覧表示を行う。
*/
public function index() {
$this->load->model('blog_model', '', TRUE); // blogモデルを呼び出し
$data['list'] = $this->blog_model->get_data();// blogモデルの機能呼び出し
$this->load->view('blog/index', $data);
}
/**
* 入力フォーム表示を行う。
*/
public function input($id) {
$this->load->model('blog_model', '', TRUE); // blogモデルを呼び出し
$data['data'] = $this->blog_model->get_data_by_id($id);// blogモデルの機能呼び出し
if (isset($data[0])) {
$this->load->view('blog/input2', $data); // 編集
} else {
$this->load->view('blog/input1', $data); // 新規
}
}
/**
* 登録処理を行う。
*/
public function add() {
if ($this->_input_check() == false) {
$this->load->view('blog/input1');
return;
}
$this->load->model('blog_model', '', TRUE); // blogモデルを呼び出し
$this->blog_model->add($this->input->post());// postされた値を配列として全て渡す
$this->load->view('blog/add');
}
/**
* 編集処理を行う。
*/
public function edit($id='') {
if ($this->_input_check() == false) {
$this->load->view('blog/input1');
return;
}
$this->load->model('blog_model', '', TRUE); // blogモデルを呼び出し
$this->blog_model->edit($this->input->post());// postされた値を配列として全て渡す
$this->load->view('blog/edit');
}
/**
* 入力チェックを行う。(全項目set_valueする)
*/
private function _input_check() {
$this->load->library('form_validation');
$this->form_validation->set_rules('title', 'タイトル', 'trim|required');// 入力必須
$this->form_validation->set_rules('content', '内容', 'trim|required');// 入力必須
return $this->form_validation->run();
}
まずはblogモデルを呼び出します。
これで後は定義しておいた機能が呼び出せます。
続いて登録・編集のために入力チェックを追加しました。
validation用にlibraryとしてform_validationが用意されているので、これを使用しました。
独自のvalidationも追加できるようです。
viewの方では、このvalidationのエラーメッセージを表示できます。
下記のようにform_error()を使用します。
また、set_rules()を使用するとviewでset_value()が使用でき便利です。
値を引き継ぐことができます。が、set_rules()しないと引き継げないので自分で拡張する必要がありそうでした。
またDBから取得した値はset_valueでは使用できないため、別のviewで表示しました。
この辺りの解決方法はあるのでしょうが、調べが足りませんでした。
input1.html
<HTML>
<BODY>
<form action="/blog/add/" method="post">
■タイトル<br>
<?php echo form_input(array('name'=>'title','value'=>set_value('title'), 'size'=>50));?><?php echo form_error('title'); ?><br>
<br>
■内容<br>
<?php echo form_textarea(array('name'=>'content','value'=>set_value('content'), 'cols'=>80, 'rows'=>10));?><?php echo form_error('content'); ?><br>
<br />
<input type="submit"><br />
<?php echo form_hidden('id', set_value('id'));?>
</form>
</BODY>
</HTML>
input2.html
<HTML>
<BODY>
<form action="/blog/add/" method="post">
<?php $data = $data[0];?>
■タイトル<br>
<?php echo form_input(array('name'=>'title','value'=>$data->title, 'size'=>50));?><?php echo form_error('title'); ?><br>
<br>
■内容<br>
<?php echo form_textarea(array('name'=>'content','value'=>$data->content, 'cols'=>80, 'rows'=>10));?><?php echo form_error('content'); ?><br>
<br />
<input type="submit"><br />
<?php echo form_hidden('id', $data->id);?>
</form>
</BODY>
</HTML>
ただ単純にページを作成するだけ、CakePHPなどでは重いー、といった方には良いかも知れませんね。