Provided by: libjifty-perl_1.10518+dfsg-3ubuntu1_all 

NAME
Jifty::Manual::Tutorial_zhtw - Jifty XXXX
DESCRIPTION
XXXXXXXXXXXXXX jifty XXXXXXXXXXX
XXXX
XX
XXXXXXXXXX
XX Jifty
XXXXXX DRY ( Don't Repeat Yourself ) XXXXXXXXXX Perl X CPAN XXXXXXXXXX
Jifty XXX CPAN XXXXXXXXXXXXXXXXX 60 XXXX CPAN XXX X
XXXXXXXXXXXXXX Perl XXXXXXXXXXXXX Perl XXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Jifty XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXJifty XXXXXXXXX
XXXXXXXXXXXXXX Perl XXXX CPAN XXXXXXXXX Jifty:
# perl -MCPAN -e"install Jifty"
XXXXXX Jifty X ".tar.gz" XXXXXXXXXXX:
# tar xzvf jifty-<version>.tgz
# cd jifty-<version>
# perl Makefile.PL
# make
# make test
# make install
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXX "jifty-devel@lists.jifty.org" XXXXXXXXXXX XXXXXXXXXXXXXXX
"GETTING HELP"
XXXX
XXXXXX Jifty XXXXXXXXXXXXXX Jifty XXXXX
Jifty XXXXXXXXXXXXXXXXXXXXXX Jifty XXX jifty XXXXXXXXXXXXXX
( XXXXXXXXXXX bin/ XXXX )
XXXXXXXXXXXXXXXXXX Jifty XXXXX ( Jifty XXXXXXXXX ).
# jifty app --name MyWeblog
Creating new application MyWeblog
Creating directory lib
Creating directory lib/MyWeblog
Creating directory bin
Creating directory etc
Creating directory doc
Creating directory log
Creating directory var
Creating directory var/mason
Creating directory share
Creating directory share/po
Creating directory share/web
Creating directory share/web/templates
Creating directory share/web/static
Creating directory lib/MyWeblog/Model
Creating directory lib/MyWeblog/Action
Creating directory t
Creating configuration file MyWeblog/etc/config.yml
XXXXXXXX
bin X bin/ XXXXXXX jifty, X Jifty XXXX Jifty XXXXX .
XXXXXXXXX "schema" , XXXXXXXXXXXXXXXXX XXXX "server" , XXXXXXXXXXXXXXXX .
XXXXX Jifty XXXXXXXXX:
jifty help
etc XXXXXX etc/ XXXXXXXXXXXXJifty XXXXXXXXXXXXX
doc XXXXXXXXXXXXXXX doc/ XX
log Jifty XX Log::Log4perl XXXXXXXXXXXXXXXXXXX log XXXXX server.log XX error.log XXX
var Jifty XX Server XXXXXXXXXXX var XXXXXXXXXXXXXXX
share/web/po
Jifty XXXXXX share/web/po/ XXXXXXXXXXXXX ("portable object templates") will go.
share/web/templates
Jifty XXXXXXXX Template::Declare XXXXXXXX XXXXXX HTML::Mason XXXXX
XXXXX Mason XXXX share/web/templates/ XXXX XXX Jifty XXX skeleton XXXXX share/web/templates/ XX
XXXXXXXX Jifty XXXXXXXXXXXXXXXXXXXXXXXX
XXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXX
XXXXXXX Jifty XXXXXXXXX:
perl -MJifty::Util -le 'print Jifty::Util->share_root'
share/web/static
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXX share/web/static XXXX
X Jifty XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXJifty XX CSS XXXJavascript XXXXXXXXXXXXXXXX
XXX Jifty share/web/static XXXXXXXXXXXXXXXXXX
lib/MyWeblog/Model
XXXXXXXXXXXXXXXXXX "lib/MyWeblog/Model"X
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ( Data Model ) XXX
Jifty XXXXXXXXXX ( Model Class ) XXXXXXXXXXXXXXX schemaX
XXX Jifty XXXXXXX Jifty::Manual::ObjectModel
lib/MyWeblog/Action
XX ( Actions ) XXXXXXXX ( Model Class ) X APIX
XXXXXXXXXX HTML XXXXXXXXXXXXX
Jifty XXXXXXXXXXXXXXX ( Models ) XXXXXXXXXXXX ( "CREATE" , "READ" , "UPDATE" , "DELETE" ) XX (
Actions )X
t Jifty XXXXXXXXXXXXXXXXXXX (Model) XXXXXXXXXXXXXXXXXXXXX XXXXXXXXX t/ XXXXXXXXXXXXX
XXXXXXXX (Data Model)
XXXXXXXXXXXXXX MyWeblog XXXXXXXXXXXXXXXXXXXX weblog XXXXX
XXXXXXXXXXXXXXXXXXXX RSS X ATOM FeedsX
XX
Weblogs XXXXXXXXXXXXXXXXXXXXXXXXXX "Post" XXXXXXX:
# cd MyWeblog
# jifty model --name Post
Writing file /tmp/MyWeblog/lib/MyWeblog/Model/Post.pm
Writing file /tmp/MyWeblog/t/00-model-Post.t
XXXXXXXXX Post XXXX ( XXXXXXXXXXXXX )X
XXXXXXXXXXX lib/MyWeblog/Model/Post.pm XXXXX
XXXXXXXXX:
use strict;
use warnings;
package MyWeblog::Model::Post;
use Jifty::DBI::Schema;
use MyWeblog::Record schema {
};
# Your model-specific methods go here.
1;
XXXXXXXXXXXXX (model class) XX
XXXXXXX "body" XX "title" XXXXXX
(XXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXX ("category") XX XX ("tags") XXXXXX )
XXXXXXXXXXXXXXX
use MyWeblog::Record schema {
XXXXX:
column title =>
type is 'text',
label is 'Title',
default is 'Untitled post';
column body =>
type is 'text',
label is 'Content',
render_as 'Textarea';
XXXXX
XX Jifty XXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX "jifty server" XXXX Jifty XXXXXX
XXXXXXXXXXXX Jifty XXXXXXXXXXXXXXXXXXXXXXXX Jifty XXX SQLite XXXXXXXXXXXX XXXXXX PostgreSQL XX MySQL
XXXXXXXXXXX etc/config.ymlX (XXX Jifty::Config XXXXXX)
# jifty server
WARN - Application schema has no version in the database.
WARN - Automatically creating your database.
INFO - Generating SQL for application MyWeblog...
INFO - Using MyWeblog::Model::Post, as it appears to be new.
INFO - Using Jifty::Model::Session, as it appears to be new.
INFO - Using Jifty::Model::Metadata, as it appears to be new.
INFO - Set up version 0.0.1, jifty version 0.81208
INFO - You can connect to your server at http://localhost:8888/
XXXXXXXXXXXXXXXXXXXXXX XXXXXXXX Jifty XXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXX AJAX XXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXX "./bin/jifty server" X
XXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXX (posts) X
XXXXXXXXXXXXXXXXXXXXXXXXXXX welogX
XX
XXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXX lib/MyWeblog/View.pm XXX XXXXXXXX:
package MyWeblog::View;
use strict;
use warnings;
use Jifty::View::Declare -base;
template post => page { title => 'Post Entry' } content {
my $action = new_action(class => 'CreatePost');
form {
render_action $action;
# XXXX
form_submit(label => 'Post');
}
};
1;
XX
XXX XX XXXXXXXXXXXX AJAX XXXXXXXXXXXX XXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
The quick and dirty way
XXXX lib/MyWeblog/View.pm XXXXXX "post" XX "1;" XXXXXXXXXXX:
template '/' => page {
# XXXXXXXX
my $posts = MyWeblog::Model::PostCollection->new;
$posts->unlimit;
# XXXXXXXX <dl> HTML XXXX
dl {
while (my $post = $posts->next) {
dt { $post->title }
dd { $post->body }
}
}
};
XXXX "http://localhost:8888" XXXXXXXXXXXXXXX
XXXXXXXXXX
XX complex way XXX Jifty XXXXXXX: XXXX ( Page regions ) XXXXXXXXXXXXXXXXX AJAX XXXXXXXXXX "lynx" X "w3m"
XXXXX GET XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXX (template) XX XXXXXXXX (regions) XXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXX XX lib/MyWeblog/View.pm XX '/' XXXXXXXXXXXXXXXXXXXXXX:
template '/' => page {
render_region(
name => 'myweblog-posts',
path => '/fragments/page_of_posts',
);
};
XXXXXXXXXXXXXXXXXXXXXXXXXXXXX "/fragments/page_of_posts"X XXXXXXXXXXX:
template '/fragments/page_of_posts' => sub {
# XXXXXXXXXXXXX 1
my $page = get('page') || 1;
# XXXXXX
my $posts = MyWeblog::Model::PostCollection->new;
$posts->unlimit;
# XXXXXXXXXXXXXXXXXX
$posts->set_page_info(
current_page => $page,
per_page => 3,
);
# XXXXXXXXXX
if ($posts->pager->last_page > 1) {
p { "Page $page of " . $posts->pager->last_page }
}
# XXXXXXXXX
dl {
attr { class => 'list' };
while (my $post = $posts->next) {
dt { $post->title }
dd { $post->body }
}
};
# XXXXXXX XXXXXXXXXXXXX 'page' XXXXXXXXXX
if ($posts->pager->previous_page) {
hyperlink(
label => 'Previous Page',
onclick => {
args => {
page => $posts->pager->previous_page,
},
},
);
}
# XXXXXX
if ($posts->pager->next_page) {
hyperlink(
label => 'Next Page',
onclick => {
args => {
page => $posts->pager->next_page,
},
},
);
}
};
XXXXXXXX Jifty XXXXXXXX "/post" XXXXXXXXXXXX XXXXXXXXXX "Next Page" XX "Previous Page" X AJAX XXX
XXXXXXX Javascript XXX "lynx" XXXX XXXXXXXX AJAX XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXX Jifty!
XXXXXXXXXX
XXXXXXX "MyWeblog::Model::PostCollection" XXXXXXXXX PostCollection.pmX Jifty XX "Jifty::ClassLoader"
XXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXX Jifty::ClassLoader X
XXX
XXXXXXXXXXXXXXXXX URL XXXXXXX XXXXXXXXXXXXXXX Post XXXXXXXXXXXXXXXX
XXXXXXX Blog XXXXXXX(dispatcher)XXXXXXXXXXXXXXXX URL XXXXXXXXXXX
XXXXX "XXXXXXXXXX" XXXXXXXXXXXXXXXXX
XXXXXXXX lib/MyWeblog/Dispatcher.pm XXXXXXXXX:
package MyWeblog::Dispatcher;
use strict;
use warnings;
use Jifty::Dispatcher -base;
before '*' => run {
my $top = Jifty->web->navigation;
$top->child(Home => url => '/');
$top->child(Post => url => '/post', label => 'Post Article');
};
1;
XXXXXXXXXXXXXXXXX Jifty::Web::MenuX
XXXXXXXXX (XXXXXXXXXXX)
XX Jifty XX Jifty::ClassLoader XXXXXXX MyWeblog::View::Page XXXXXXXXXXXXXXXXXX XXXXXX Jifty XXXXXXXXXXXXX
XXXX MyWeblog::View::Page XXXX (override) XXXXXXXXX
XXX lib/MyWeblog/View/Page.pm XXXXXXXXXX:
use strict;
use warnings;
package MyWeblog::View::Page;
use base 'Jifty::View::Declare::Page'; # XX Jifty::View::Declare::Page
use Jifty::View::Declare::Helpers;
sub render_body {
my ($self, $body_code) = @_;
$self->render_header();
body {
# so that we don't show menu template here.
$self->render_pre_content_hook();
$body_code->();
};
}
sub render_page {
my $self = shift;
Carp::cluck $self unless $self->content_code;
div {
# XXXXX Page XXXXXXXXXXXX
# page wrapper here
$self->content_code->();
};
}
sub render_footer {
my $self = shift;
# XXXXXXXXXXXXXXXX
# do what you want
$self->SUPER::render_footer;
}
XX MyWeblog::View::Page XXX (override) XXXXXXXXXXX Jifty::View::Declare::Page XXXXXX
XXXXXX
XXXXXXXX Jifty XXXXXXXXXXXXXXXX XXXXXX Jifty XXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXX "jifty-devel" X mailing list XXXXXXXX Jifty XX XXXXXXXXXXXXX
XXXXX
• XXXXXXXXXXX
Jifty::Manual::Models
• X Jifty XX - XX (Action)
Jifty::Manual::Actions
• XXXXXX
Jifty::Manual::PageRegions
• CSS X JS
Jifty::Manual::UsingCSSandJS, Jifty::Manual::JavaScript
• XXXX
XX Jifty::Manual::TutorialRest
• XXXX ( Continuations )
Jifty::Manual::Continuations
• XXXXXXXXX
Jifty::Manual::AccessControl
• XXXXXXXX
Jifty::Manual::Deploying
• XXXXXXXXXX
Jifty::Manual::Upgrading
• XX Jifty XXXXXXXXX
Jifty::Manual::Cookbook
XXXX
XXXX
"jifty" XXXXXXXXXXXX:
jifty help
jifty help <command>
XXXXXXXXXXX ( XXXXX "AdminMode" XXXX ) XXXXXXXXXXXXXX "XXXX" XXXXXXXX Jifty XXXXXXXX
XXXXXX
"jifty-devel@lists.jifty.org" XXXXXXXXX Jifty XXXXXXXXXXXXXXXX
XXXXXXXXXXXXX "jifty-devel-subscribe@lists.jifty.org".
XX Wiki
XXX wiki ! (XXXXX wiki XXXX Jifty XXXXXXXX)
XXX <http://jifty.org/>, XXXXXXX
Wiki XXXX Wifty XXXXXXXXXX Jifty Subversion XXXXXXXX
XXXX
XX Jifty XXXX (Bugs) XXX "jifty-devel@lists.jifty.org"X
XXX
XXX (c9s) ( "cornelius.howl_at_gmail.com" ) <http://oulixe.us/>
perl v5.14.2 2013-06-27 Jifty::Manual::Tutorial_zhtw(3pm)