hampom TODAY

「TODAY」ってタイトルが付くブログが作りたいな、と思った10分後に作ったブログ。

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(); ?>

このビューによって、何も記入せずに「登録」ボタンをクリックすると以下の通り、エラーが表示されます。

投稿者: hampom

2012年 1月 5日 at 4:22 PM

カテゴリー: 未分類

コメントする

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

%s に接続中

フォロー

Get every new post delivered to your Inbox.

現在332人フォロワーがいます。