
下記フォームに必要事項を入力後、確認ボタンを押してください。
前回はSQLiteデータベースを仕様したMVCパターンの実装を書かせて頂きましたが、今回はフォームからそのデータベースの操作を行うリクエストオブジェクトを使ったフォームの開発を進めていきます。ViewクラスはViewクラスは前回から引き続きそのまま使用して進めていきます。
C:\data\Hello\script>hello_create.pl controller request exists "C:\data\Hello\lib\Hello\Controller" exists "C:\data\Hello\t" exists "C:\data\Hello\lib\Hello\Controller\request.pm" created "C:\data\Hello\lib\Hello\Controller\request.pm.new" exists "C:\data\Hello\t\controller_request.t"コントローラクラスが作成されたらフォームアクションとフォームからのポストデータを返すレスポンスアクションを作成します。今回、HTMLフォームから入力された名前/住所/メール/ドキュメントをresponse.ttで受け取り表示します。フォームアクションは空のアクションメソッドを使用します。ここではポストデータを取得するリクエストオブジェクトクラスのbody_params(body_parameters)メソッドを使用して受け取ったデータを表示しています。
sub form :Local { }
sub response :Local {
my ( $self, $c ) = @_;
#body_paramsメソッド[$c->request][$c->req]でサーバに送信する
$c->stash->{nam1} = $c->request->body_params->{'nam1'};
$c->stash->{add1} = $c->request->body_params->{'add1'};
$c->stash->{mail1} = $c->request->body_params->{'mail1'};
$c->stash->{document} = $c->request->body_params->{'document'};
}
次にテンプレートファイルを作成します。入力フォームページとリクエスト情報を表示するレスポンスページを作成します。
[form.tt] <!DOCTYPE html> <html> <head> <link rel="stylesheet" href="stylesheet.css" > <meta charset="UTF-8"> <title>ポストデータ</title> </head> <body> <h1>リクエストオブジェクトテスト</h1> <p> <form method="post" action="/request/response"> <ul><li>名 前: <input type="text" name="nam1" size="20" maxlength="255"/></li> <br> <li>住 所: <input type="text" name="add1" size="20" maxlength="255"/></li> <br> <li>E-Mail: <input type="text" name="mail1" size="20" maxlength="255"/></li> <br> <li>お問い合わせ内容:<br><input type="text" name="document" size="80" maxlength="255"/></li></ul> <input type="submit" value="送信"/> </form> </p> </body> </html>
<!DOCTYPE html> <html> <head> <link rel="stylesheet" href="stylesheet.css" > <meta charset="UTF-8"> <title>リクエスト情報表示</title> </head> <body> <h1>リクエストオブジェクトテスト</h1> <p> Hello!! [% nam1 | html %]さん<br> <ul><li>Name:[% nam1 | html %]</li> <li>Address:[% add1 | html %]</li> <li>E-mail:[% mail1 | html %]</li> <li>Document:[% document | html %]</li></ul> </p> </body> </html>最後に開発サーバーを立ち上げ、localhost:3000/request/formのアドレスを入力して表示内容を確認します。フォーム入力画面からデータを入力してレスポンスページでポストデータが表示されれば成功です。これが簡単なCatalyst リクエストオブジェクトの実装です。 (2) リクエストメソッドの種類 リクエストオブジェクトには次の種類があります。簡単にご紹介します。
[サンプルデータベースSQL]
--
-- Create a very simple database to hold book and author information
--
PRAGMA foreign_keys = ON;
CREATE TABLE book (
id INTEGER PRIMARY KEY,
title TEXT ,
review TEXT ,
rating INTEGER,
price INTEGER,
published BLOB
);
-- 'book_author' is a many-to-many join table between books & authors
CREATE TABLE book_author (
book_id INTEGER REFERENCES book(id) ON DELETE CASCADE ON UPDATE CASCADE,
author_id INTEGER REFERENCES author(id) ON DELETE CASCADE ON UPDATE CASCADE,
PRIMARY KEY (book_id, author_id)
);
CREATE TABLE author (
id INTEGER PRIMARY KEY,
first_name TEXT,
last_name TEXT
);
---
--- Load some sample data
---
INSERT INTO book VALUES (1, 'CCSP SNRS Exam Certification Guide','Very Good',5,5000,'2010-10-1');
INSERT INTO book VALUES (2, 'TCP/IP Illustrated, Volume 1','Very Good', 5,1200,'2009-10-1');
INSERT INTO book VALUES (3, 'Internetworking with TCP/IP Vol.1','Good', 4,2200,'2008-5-5');
INSERT INTO book VALUES (4, 'Perl Cookbook','Good', 5,800,'2014-2-5');
INSERT INTO book VALUES (5, 'Designing with Web Standards','Very Good',5,3200,'2011-6-7');
INSERT INTO author VALUES (1, 'Greg', 'Bastien');
INSERT INTO author VALUES (2, 'Sara', 'Nasseh');
INSERT INTO author VALUES (3, 'Christian', 'Degu');
INSERT INTO author VALUES (4, 'Richard', 'Stevens');
INSERT INTO author VALUES (5, 'Douglas', 'Comer');
INSERT INTO author VALUES (6, 'Tom', 'Christiansen');
INSERT INTO author VALUES (7, 'Nathan', 'Torkington');
INSERT INTO author VALUES (8, 'Jeffrey', 'Zeldman');
INSERT INTO book_author VALUES (1, 1);
INSERT INTO book_author VALUES (1, 2);
INSERT INTO book_author VALUES (1, 3);
INSERT INTO book_author VALUES (2, 4);
INSERT INTO book_author VALUES (3, 5);
INSERT INTO book_author VALUES (4, 6);
INSERT INTO book_author VALUES (4, 7);
INSERT INTO book_author VALUES (5, 8);
ではコントローラクラスモジュールの作成をします。コントローラモジュール[request.pm]に次のプログラムを追加してください。
このプログラムは前述同様にentry_formは空で作成し、[update_or_create_form]サブルーチンでレコードを登録又はデータが存在している場合には更新しています。
データを登録または更新する場合は[update_or_new]メソッドを使用します。また文字化け対応としてリクエストデータの[message]はデコードして表示しています。
[request.pm]
sub entry_form:Local { }
sub update_or_create_form :Local {
my ( $self, $c ) = @_;
#レコードの有無チェック、存在する場合は更新
my $book = $c->model('BookDB::Book')->update_or_new({
id=>$c->request->body_params->{'id'},
title=>$c->request->body_params->{'title'},
review=>$c->request->body_params->{'review'},
rating=>$c->request->body_params->{'rating'},
price=>$c->request->body_params->{'price'},
published =>$c->request->body_params->{'published'}
});
#レコードがすでに存在していた場合はエラーメッセージを表示
if($book->in_storage) {
#body_paramsメソッド[$c->request][$c->req]でサーバに送信する
$c->stash->{message} =decode('sjis','データを更新しました。');
$c->stash->{id} = $c->request->body_params->{'id'};
$c->stash->{title} = $c->request->body_params->{'title'};
$c->stash->{review} = $c->request->body_params->{'review'};
$c->stash->{rating} = $c->request->body_params->{'rating'};
$c->stash->{price} = $c->request->body_params->{'price'};
$c->stash->{published} = $c->request->body_params->{'published'};
} else {
#レコードが存在しない場合は登録
$book->insert();
#body_paramsメソッド[$c->request][$c->req]でサーバに送信する
$c->stash->{message} =decode('sjis','データを新規に登録しました。');
$c->stash->{id} = $c->request->body_params->{'id'};
$c->stash->{title} = $c->request->body_params->{'title'};
$c->stash->{review} = $c->request->body_params->{'review'};
$c->stash->{rating} = $c->request->body_params->{'rating'};
$c->stash->{price} = $c->request->body_params->{'price'};
$c->stash->{published} = $c->request->body_params->{'published'};
}
}
#######################################################################
次にデータ入力画面の[entry_form.tt]とリクエスト情報を表示する[update_or_create_form.tt]を記述します。
[entry_fom.tt] <!DOCTYPE html> <html> <head> <link rel="stylesheet" href="stylesheet.css" > <meta charset="UTF-8"> <title>リクエストオブジェクト</title> </head> <body> <h1>エントリーフォーム―データベースアクセス―</h1> <p> <form method="post" action="/request/update_or_create_form"> <table><tr><td style="width:150px;">ID:</td><td><input type="text" name="id" size="4" maxlength="255"/></td></tr> <tr><td>タイトル:</td><td><input type="text" name="title" size="40" maxlength="255"/></td></tr> <tr><td>レビュー:</td><td><input type="text" name="review" size="80" maxlength="255"/></td></tr> <tr><td>プライス:</td><td><input type="text" name="price" size="10" maxlength="255"/></td></tr> <tr><td>レーティング:</td><td><input type="text" name="rating" size="20" maxlength="255"/></td></tr> <tr><td>出版日:</td><td><input type="text" name="published" size="10" maxlength="255"/></td></tr></table> <input type="submit" value="送信"/> </form> </p> </body> </html>
[update_or_create_form.tt] <!DOCTYPE html> <html> <head> <link rel="stylesheet" href="stylesheet.css" > <meta charset="UTF-8"> <title>リクエストオブジェクト</title> </head> <body> <h1>リクエストフォーム―データベースアクセス―</h1> <p> [% message | html %]<br> <ul> <li>ID:[% id | html %]</li> <li>title:[% title | html %]</li> <li>Review:[% review | html %]</li> <li>Rating:[% rating | html %]</li> <li>Price:[% price | html %]</li> <li>Published:[% published | html %]</li></ul> </p> </body> </html>開発サーバーを立ち上げ[http://localhost:3000/request/entry_form]を開いてエントリーフォームからデータを入力してください。[update_or_create_form]ページが表示されれば、入力されたデータがデータベースにアクセスしておりデータ登録/更新ができていることになります。