Hatena::Grouptakatoshi

メモ帳 このページをアンテナに追加 RSSフィード

 | 

2006-05-28

Maypole - scaffolding

14:33 |  Maypole - scaffolding - メモ帳 を含むブックマーク はてなブックマーク -  Maypole - scaffolding - メモ帳  Maypole - scaffolding - メモ帳 のブックマークコメント

Maypoleの場合はMaypole::Application継承していろいろと書きます。

POB.pm

package POB;

use strict;
use warnings;

use Maypole::Application;
use Class::DBI::Loader::Relationship;

my $dsn = 'dbi:mysql:pob';
my $user = 'pob';
my $password = 'poob';

POB->setup($dsn, $user, $password);

# basic settings
POB->config->application_name('Plain Old Bookmark');
POB->config->uri_base('http://takatoshi.dyndns.org/misc/pob/maypole/pob.cgi');
POB->config->template_root('/home/takatoshi/misc/pob/maypole/templates');
POB->config->rows_per_page(100);
POB->config->display_tables( [qw( user directory bookmark )] );

# validation
POB::User->untaint_columns(
    printable => [qw( name email password )],
);
POB::Directory->untaint_columns(
    printable => [qw( name flag )],
);
POB::Bookmark->untaint_columns(
    printable => [qw( url title flag )],
);

# table relationships
my @relationships = (
    'a user has many directories',
    'a directory has a user',
    'a user has many bookmarks',
    'a bookmark has a user',
    'a directory has many bookmarks',
    'a bookmark has a directory',
);
        
foreach my $relationship ( @relationships ) {
    POB->config->{loader}->relationship( $relationship );
}

1;

CGIで動かします。

pob.cgi

#!/usr/bin/perl

use strict;
use warnings;

use lib qw( lib );
use POB;

POB->run();

1;

デフォルトテンプレートMaypoleソースから持ってきます。

スタイルシートの配置を換えて、スタイルシートパスも変えます。

header

        <link title="Maypole" href="/misc/pob/maypole/style/maypole.css" type="text/css"
            rel="stylesheet"/>

ディレクトリ構成はこんな感じです。

takatoshi@sarge:~/misc/pob/maypole$ ls -lR
.:
合計 20
drwxr-xr-x  3 takatoshi takatoshi 4096 2006-05-28 14:07 lib
-rwxr-xr-x  1 takatoshi takatoshi   90 2006-05-28 04:30 pob.cgi
drwxr-xr-x  3 takatoshi takatoshi 4096 2006-05-28 04:30 sql
drwxr-xr-x  3 takatoshi takatoshi 4096 2006-05-28 04:30 style
drwxr-xr-x  4 takatoshi takatoshi 4096 2006-05-28 04:31 templates

./lib:
合計 4
-rw-r--r--  1 takatoshi takatoshi 1138 2006-05-28 04:30 POB.pm

./sql:
合計 4
-rw-r--r--  1 takatoshi takatoshi 876 2006-05-28 04:30 pob.sql

./style:
合計 8
-rw-r--r--  1 takatoshi takatoshi 6234 2006-05-28 04:30 maypole.css

./templates:
合計 12
drwxr-xr-x  3 takatoshi takatoshi 4096 2006-05-28 04:30 factory
-rw-r--r--  1 takatoshi takatoshi 6234 2006-05-28 04:30 maypole.css

./templates/factory:
合計 60
-rw-r--r--  1 takatoshi takatoshi 1240 2006-05-28 04:30 addnew
-rw-r--r--  1 takatoshi takatoshi  980 2006-05-28 04:30 edit
-rw-r--r--  1 takatoshi takatoshi   28 2006-05-28 04:30 footer
-rw-r--r--  1 takatoshi takatoshi  492 2006-05-28 04:30 frontpage
-rw-r--r--  1 takatoshi takatoshi  646 2006-05-28 04:30 header
-rw-r--r--  1 takatoshi takatoshi 1856 2006-05-28 04:30 list
-rw-r--r--  1 takatoshi takatoshi  697 2006-05-28 04:30 login
-rw-r--r--  1 takatoshi takatoshi 4530 2006-05-28 04:30 macros
-rw-r--r--  1 takatoshi takatoshi  692 2006-05-28 04:30 maypole
-rw-r--r--  1 takatoshi takatoshi  493 2006-05-28 04:30 navbar
-rw-r--r--  1 takatoshi takatoshi 1298 2006-05-28 04:30 pager
-rw-r--r--  1 takatoshi takatoshi  801 2006-05-28 04:30 search_form
-rw-r--r--  1 takatoshi takatoshi   69 2006-05-28 04:30 title
-rw-r--r--  1 takatoshi takatoshi  781 2006-05-28 04:30 view 

---

no title

Catalyst - scaffolding

14:56 |  Catalyst - scaffolding - メモ帳 を含むブックマーク はてなブックマーク -  Catalyst - scaffolding - メモ帳  Catalyst - scaffolding - メモ帳 のブックマークコメント

Catalystの場合はほとんどヘルパースクリプトですが、できあがるものはMaypoleよりも貧弱です。

テーブル間の関係を定義してないからだと思うんだけど、select boxになってほしいところがtextになってたりします。あとテーブル一覧がありません。

雛形を作ります。

$ catalyst.pl POB
$ cd POB

Modelを作ります。

$ script/pob_create.pl model CDBI CDBI 'dbi:mysql:pob' 'user' 'pass'

Viewを作ります。

$ script/pob_create.pl view TT TT

Controllerを作ります(Catalyst::Helper::Controller::Scaffold)。

$ script/pob_create.pl controller User Scafold CDBI::User
$ script/pob_create.pl controller Directory Scaffold CDBI::Directory
$ script/pob_create.pl controller Bookmark Scaffold CDBI::Bookmark

ソースをちょっといじります。

CDBI.pm

use Class::DBI::AsForm;
use Class::DBI::FromForm;

POB.pm

use Catalyst qw/-Debug ConfigLoader Static::Simple FormValidator/;

Root.pm

sub default : Private {
    my ( $self, $c ) = @_;

    # Hello World
    #$c->response->body( $c->welcome_message );
}

sub end : Private {
    my ( $self, $c ) = @_;

    # Forward to View unless response body is already defined
    $c->forward( $c->view('TT') ) unless $c->response->body;
}

終わり。

サーバーを起動して動作確認。

$ script/pob_server.pl

---

no title

Sledge - scaffolding

22:52 |  Sledge - scaffolding - メモ帳 を含むブックマーク はてなブックマーク -  Sledge - scaffolding - メモ帳  Sledge - scaffolding - メモ帳 のブックマークコメント

まだ途中だけど飽きてきたんで。

scaffoldingっていうか。まあ、自分でソース書いて基盤を作りましたという意味でいいか。

インストールパッケージに付いてくるドキュメントを見ればバッチリわかります。

ソースCatalystみたいにバリバリ作ってくれないし、Maypoleみたいにベースクラスにガリガリ書いてあったりはしないんで、基本的に自分で書かなきゃいけません。

で、簡単なスケルトンを作ってくれるヘルパースクリプトがあるんでそこから始めます。

$ mkdir lib htdocs templates sql
$ cd lib
$ sledge-setup POB

CGIで動かすんで環境変数セットします。

httpd.conf

SetEnv PERL5LIB /home/takatoshi/misc/pob/sledge/POB/lib

こんな感じでCGIからPagesをたたきます。

POB::Pages::User->new->dispatch('index');

これだとPOB::Pages::Userクラスのdispatch_indexが呼ばれます(GETの場合)。

モデルはCDBIを使います。

ビューはデフォルトでTTになってます。

で、Pagesのdispatch_XXXでごにょごにょやります。

sub dispatch_index {
    my $self = shift;
    my @users = POB::CDBI::User->retrieve_all;
    $self->tmpl->param( users => \@users );
} 

POSTの場合はこんな感じです。

sub post_dispatch_add {
    my $self = shift;
    my %user
        = map { $_ => $self->r->param($_) }
            qw( name email password );
    POB::CDBI::User->create( \%user );
    $self->redirect( './user.cgi' );
}  

Fill in formしたいときはこんな感じにします。

sub dispatch_edit {
    my $self = shift;
    my $id = $self->r->param('id');
    my $user = POB::CDBI::User->retrieve($id);

    for my $key ( qw( name email password ) ) {
        $self->r->param( $key => $user->$key );
    }

    $self->load_fillin_form;
    $Sledge::FillInForm::FillPassword = 0;
} 

ちなみにPOSTのときは自動でfill inしてくれるようです。

こんなとこか。

あー、あと。使ってないけどセッション用のテーブルを作ります。

$ mysql -uroot pob < ~/temp/Sledge-1.11/eg/sessions.sql

えーと、

Catalystは中身がどーなってんのかよくわかんないけど、Sledgeの場合は作ってるうちにわかってくる感じ。Maypoleもよくわかんないけどソースが簡単なんで見ればわかる。Catalystが一番わからん。

まあ、でもそれは別にいいです。

no title

---

Sledgeを使ってみるにあたって以下のドキュメントとデモムービーにお世話になりました。とても参考になりました。

Sledge ドキュメント - にぽたん研究所

ekliys mfitaqzkyekliys mfitaqzky2007/03/12 14:40kicjl bjqvdg ckfhiorb fgjuahmw jdcv yzsfu rjmd

ywqagx voqtyywqagx voqty2007/03/12 14:40sewrmd yqxdhat rjwiegvdf bvidc sravyolec dknufmxba dvuolfz http://www.odwnarqb.ljrb.com

rjihnm ufhlmzwrjihnm ufhlmzw2007/03/12 14:41mstrlw nrtahbl bedhqis qgij uwron pmbycq hqbjur <A href="http://www.scuto.nfcesgljb.com">mwbauex keij</A>

ukatnc nlzamyukatnc nlzamy2007/03/12 14:41bnrufzl bkshzf xhkcnsv ameyjzng dyou plmnjbrv wzrgjoqbk [URL=http://www.tdeuz.jzrvg.com]orzip tysigzf[/URL]

tjbq klwitjbq klwi2007/03/12 14:41cvekbxnp zmxjdp vahqtore qxkrndzs hvreifza ewafydosh enkosrj [URL]http://www.dnbtrsvfy.jwef.com[/URL] gedmlu lqsda

 |