Kohana データベースへの登録とページネーション 〜 登録 〜
先日のセットアップから引き続き。
今度は、データベースにデータを登録し、ページネーションで表示してみました。
まずは、データベースを新規に作成しテーブルを作ります。
CREATE TABLE `addresses` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`firstname` varchar(10) NOT NULL DEFAULT '',
`lastname` varchar(20) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
addresses …。 という名前ですが、とりあえず名前だけ。
次に、 application/bootstrap.php を編集し、 ORM および database のモジュールを使えるように、コメントアウトされている各行を外します。
/**
* Enable modules. Modules are referenced by a relative or absolute path.
*/
Kohana::modules(array(
// 'auth' => MODPATH.'auth', // Basic authentication
// 'cache' => MODPATH.'cache', // Caching with multiple backends
// 'codebench' => MODPATH.'codebench', // Benchmarking tool
'database' => MODPATH.'database', // Database access
// 'image' => MODPATH.'image', // Image manipulation
'orm' => MODPATH.'orm', // Object Relationship Mapping
// 'unittest' => MODPATH.'unittest', // Unit testing
// 'userguide' => MODPATH.'userguide', // User guide and API documentation
));
最後に application/config/ 配下に database.php ファイルを作成し以下のような記述を追加します。
<?php
return array(
'default' => array(
'type' => 'mysql',
'connection' => array(
'hostname' => 'localhost',
'username' => 'データベースユーザー名',
'password' => 'データベースパスワード',
'persistent' => false,
'database' => 'データベース名'
),
'table_prefix' => '',
'charset' => 'utf8',
'profiling' => true
)
);
準備完了。
モデルを作る
addresses のモデルを作ります。 application/classes/model の配下に address.php ファイルを作ります。テーブル名は複数形ですが、モデル名は単数形となります。
<?php defined('SYSPATH') or die('No direct access allowed.');
class Model_Address extends ORM
{
public function rules()
{
return array(
'firstname' => array(
array('not_empty'),
),
'lastname' => array(
array('not_empty'),
),
);
}
}
class 名は、 Model_ から始まります。 ひとつだけ function がありますが、 バリデーションルールです。
この例では、 firstname および lastname に対して not_empty ルールを設定しています。これにより、空での登録はできなくなります。
後ほど設定するエラー表示の指定により、このままでも英語によるエラーが表示されますが、ついでに解りやすく日本語にしておきましょう。
メッセージは application/messages 配下に設置します。 models ディレクトリを作成し、 作成したディレクトリ内に address.php ファイルを以下の通り作ります。
<?php
return array(
'firstname' => array(
'not_empty' => '必ず入力してください',
),
'lastname' => array(
'not_empty' => '必ず入力してください',
),
);
これで、バリデーションによって表示されるエラーメッセージを変更することができます。
コントローラーを作る
Kohana PHP では、セットアップ直後 welcome.php が default コントローラーとして / にアクセスされた際に表示されるよう設定されています。
まずはこの設定を変更します。
application/bootstrap.php を開き、 Route::set() を変更します。
/**
* Set the routes. Each route must have a minimum of a name, a URI and a set of
* defaults for the URI.
*/
Route::set('default', '(<controller>(/<action>(/<id>)))')
->defaults(array(
'controller' => 'top',
'action' => 'index',
));
controller に指定した top.php(Controller_Top) の action に指定した index(action_index()) がデフォルトと変更できました。
ではファイルを作ります。
<?php defined('SYSPATH') or die('No direct script access.');
class Controller_Top extends Controller {
public function action_index()
{
$view = View::factory('address/create')
->bind('errors', $errors);
if ($_POST) {
$address = ORM::factory('address')->values($_POST);
try {
$address->save();
} catch(ORM_Validation_Exception $e) {
$errors = $e->errors('models');
}
}
$this->response->body($view);
}
}
7行目で、表示するビューを指定しています。 address/create と指定することで application/views/address/create.php を指定することになります。 8行には bind() が記載されています。 bind() は、ビューに対し値を渡してあげるメソッドですが、参照渡しによって行われます。
10行目からは、フォームから投稿された場合の処理になります。 address モデルに対し送信されたデータをセットし、保存を試みます。
バリデーションによりエラーとなった場合は、 $errors にエラー内容が代入されます。
ビューを作る
<?php echo Form::open('/'); ?>
<div>
<?php
echo Form::label('firstname', '姓');
echo Form::input('firstname');
echo Arr::get($errors, 'firstname');
?>
</div>
<div>
<?php
echo Form::label('lastname', '名');
echo Form::input('lastname');
echo Arr::get($errors, 'lastname');
?>
</div>
<?php echo Form::submit('submit', '登録'); ?>
<?php echo Form::close(); ?>
このビューによって、何も記入せずに「登録」ボタンをクリックすると以下の通り、エラーが表示されます。
