2008-06-06
JaneseThat's 2 clever by half and 2x2 clever 4 me. Tahkns!
moycscnpymD8QPM5 <a href="http://pfivmnxrucgc.com/">pfivmnxrucgc</a>
xwrkhkowtRknBP1 <a href="http://wibippadhqwi.com/">wibippadhqwi</a>
YuryKnocked my socks off with knlowgede!
dmvllcnnuvwrPgf0 <a href="http://zizmpdgbikla.com/">zizmpdgbikla</a>
cjpruiE8ABVO , [url=http://hatbsvmmexml.com/]hatbsvmmexml[/url], [link=http://oqwucslwsiuz.com/]oqwucslwsiuz[/link], http://sjrttbvoyffd.com/
2008-06-04
チュートリアルを読みながらCatalystサンプルアプリケーションを作ってみる
Catalyst | |
を読みながら作って、まずはとにかく動かしてみる。
途中のTipsは読んでないので、間違っているところがあるかもしれぬ。
1.プロジェクトを作成する
プロジェクト名は「MyApp」。このコマンドを実行した場所に作られる。
perl catalyst.pl MyApp
2.SQLiteのダウンロード
データベースとしてSQLite3を使用。公式サイトにアクセスし、「sqlitedll-3_5_9.zip」をダウンロード。
解凍して、適当な場所に置く。
3.SQLファイルの作成
チュートリアルをコピー&ペースト。以下のソースをエディタにコピーし、「myapp01.sql」という名前で保存。
-- -- Create a very simple database to hold book and author information -- CREATE TABLE books ( id INTEGER PRIMARY KEY, title TEXT , rating INTEGER ); -- 'book_authors' is a many-to-many join table between books & authors CREATE TABLE book_authors ( book_id INTEGER, author_id INTEGER, PRIMARY KEY (book_id, author_id) ); CREATE TABLE authors ( id INTEGER PRIMARY KEY, first_name TEXT, last_name TEXT ); --- --- Load some sample data --- INSERT INTO books VALUES (1, 'CCSP SNRS Exam Certification Guide', 5); INSERT INTO books VALUES (2, 'TCP/IP Illustrated, Volume 1', 5); INSERT INTO books VALUES (3, 'Internetworking with TCP/IP Vol.1', 4); INSERT INTO books VALUES (4, 'Perl Cookbook', 5); INSERT INTO books VALUES (5, 'Designing with Web Standards', 5); INSERT INTO authors VALUES (1, 'Greg', 'Bastien'); INSERT INTO authors VALUES (2, 'Sara', 'Nasseh'); INSERT INTO authors VALUES (3, 'Christian', 'Degu'); INSERT INTO authors VALUES (4, 'Richard', 'Stevens'); INSERT INTO authors VALUES (5, 'Douglas', 'Comer'); INSERT INTO authors VALUES (6, 'Tom', 'Christiansen'); INSERT INTO authors VALUES (7, 'Nathan', 'Torkington'); INSERT INTO authors VALUES (8, 'Jeffrey', 'Zeldman'); INSERT INTO book_authors VALUES (1, 1); INSERT INTO book_authors VALUES (1, 2); INSERT INTO book_authors VALUES (1, 3); INSERT INTO book_authors VALUES (2, 4); INSERT INTO book_authors VALUES (3, 5); INSERT INTO book_authors VALUES (4, 6); INSERT INTO book_authors VALUES (4, 7); INSERT INTO book_authors VALUES (5, 8);
4.DBの作成
先ほど解凍したdllファイルとsqlファイルを同じディレクトリに置き、以下のコマンドを実行。
sqlite3 myapp.db < myapp01.sql
「myapp.db」というファイルが作られる。
ちゃんと作られているかどうかを、「バージョン確認」「SELECT文発行」してみて確認できる。
sqlite3 myapp.db SQLite version 3.2.2 Enter ".help" for instructions sqlite> select * from books; 1|CCSP SNRS Exam Certification Guide|5 2|TCP/IP Illustrated, Volume 1|5 3|Internetworking with TCP/IP Vol.1|4 4|Perl Cookbook|5 5|Designing with Web Standards|5 sqlite> .q
作成したmyapp.dbは、MyAppプロジェクト直下に配置しておく。(C:/MyApp/myapp.db)
5.MyAppDB.pmの作成(スキーマ情報ファイル)
lib直下に「MyAppDB.pm」ファイルを作り、以下のように記述。
package MyAppDB; use base qw/DBIx::Class::Schema/; __PACKAGE__->load_classes({ MyAppDB => [qw/Book BookAuthor Author/] }); 1;
6.Book.pm、BookAuthor.pm、Author.pmの作成(リソース情報ファイル)
lib/MyAppDBディレクトリを作成し、その中に以下の3つのファイルを作成します。
- Book.pm
package MyAppDB::Book; use base qw/DBIx::Class/; # Load required DBIC stuff __PACKAGE__->load_components(qw/PK::Auto Core/); # Set the table name __PACKAGE__->table('books'); # Set columns in table __PACKAGE__->add_columns(qw/id title rating/); # Set the primary key for the table __PACKAGE__->set_primary_key(qw/id/); # has_many(): # カラム名には外部テーブルのキーを記述する __PACKAGE__->has_many(book_authors => 'MyAppDB::BookAuthor', 'book_id'); # many_to_many(): __PACKAGE__->many_to_many(authors => 'book_authors', 'author'); 1;
- Author.pm
package MyAppDB::Author; use base qw/DBIx::Class/; __PACKAGE__->load_components(qw/PK::Auto Core/); __PACKAGE__->table('authors'); __PACKAGE__->add_columns(qw/id first_name last_name/); __PACKAGE__->set_primary_key(qw/id/); __PACKAGE__->has_many(book_author => 'MyAppDB::BookAuthor', 'author_id'); __PACKAGE__->many_to_many(books => 'book_author', 'book'); 1;
- BookAuthor.pm
package MyAppDB::BookAuthor; use base qw/DBIx::Class/; __PACKAGE__->load_components(qw/PK::Auto Core/); __PACKAGE__->table('book_authors'); __PACKAGE__->add_columns(qw/book_id author_id/); __PACKAGE__->set_primary_key(qw/book_id author_id/); # belongs_to(): # カラム名は「この」テーブル __PACKAGE__->belongs_to(book => 'MyAppDB::Book', 'book_id'); # belongs_to(): __PACKAGE__->belongs_to(author => 'MyAppDB::Author', 'author_id'); 1;
7.モジュールダウンロード
Catalyst::Model::DBIC::Schemaモジュールがないので、ppmを通じてインストールします。
ppm install Catalyst::Model::DBIC::Schema
8.Modelファイルを作成
MyAppにカレントディレクトリを移動し、以下のコマンドを実行。
チュートリアルと違うけど、チュートリアル通りやると、作られたファイルの設定がおかしかったので、
あとで確認する。
perl script/myapp_create.pl model MyAppDB DBIC::Schema MyAppDB dbi:SQLite:myapp.db
「dbi:SQLite:myapp:db」(:が1つ)に注意。間違って2つ打っててはまった…。
最後の部分がパスになる。例えば「MyApp/db/myapp.db」という配置だったら、
「dbi:SQLite:db/myapp.db」にするといいみたい。試してないけど。
9.Controllerの作成
同様に以下のコマンドを実行。
perl script/myapp_create.pl controller Books
10.Books.pmに関数追加
lib/MyApp/Controller/Books.pmの最後に以下の関数を追加する。
:(中略) sub list : Local { my ($self, $c) = @_; $c->stash->{books} = [$c->model('MyAppDB::Book')->all]; $c->stash->{template} = 'books/list.tt2'; } 1;
11.Viewの作成
以下のコマンドを実行。
perl script/myapp_create.pl view TT TTSite
12.end関数を有効化
チュートリアルではRenderViewというのを設定していたけど、これは無視した。
lib/MyApp/Controller/Root.pmに行き、コメントアウトされているend関数のコメントを消す。
sub end : Private { my ( $self, $c ) = @_; # Forward to View unless response body is already defined $c->forward( $c->view('') ) unless $c->response->body; }
13.レイアウトファイルの修正
root/lib/site/layoutを以下のように修正。(メッセージ部分の加筆)
<div id="header">[% PROCESS site/header %]</div> <div id="content"> <span class="message">[% status_msg %]</span> <span class="error">[% error_msg %]</span> [% content %] </div> <div id="footer">[% PROCESS site/footer %]</div>
14.テンプレートページの作成
root/src/booksというディレクトリを作り、その中に「list.tt2」ファイルを作る。
list.tt2は以下のように記述。
[% META title = 'Book List' -%] <table> <tr><th>Title</th><th>Rating</th><th>Author(s)</th></tr> [% FOREACH book IN books -%] <tr> <td>[% book.title %]</td> <td>[% book.rating %]</td> <td> [% tt_authors = [ ]; tt_authors.push(author.last_name) FOREACH author = book.authors %] ([% tt_authors.size %]) [% tt_authors.join(', ') %] </td> </tr> [% END -%] </table>
これで実装は完了。
15.起動とアクセス
コマンドでサーバ起動。restartオプションを入れておくと、ファイルを編集した際に即時反映されるらしい。
perl script/myapp_server.pl -restart
「http://localhost:3000/books/list」にアクセスすればテーブルの中身が表示されるはず。
JalenBION I'm ipmreessd! Cool post!
ltuvtdyoovSJpyXY <a href="http://hudzyppcqnac.com/">hudzyppcqnac</a>
wereeyRl1hwy , [url=http://dedxmopjjlcx.com/]dedxmopjjlcx[/url], [link=http://vddxvlskprnw.com/]vddxvlskprnw[/link], http://jxqlhdnejoho.com/
gpygnixxjuTSLFy <a href="http://mnsbvpsuigvv.com/">mnsbvpsuigvv</a>
hnrgzqkVwwbvg , [url=http://lswxttvkylsf.com/]lswxttvkylsf[/url], [link=http://zsuunjgpnmyj.com/]zsuunjgpnmyj[/link], http://taflgtroijpn.com/
<a href=" http://temresults2018.com/ ">bbcode</a>
<a href="http://temresults2018.com/">html</a>
http://temresults2018.com/ simple