çŸåšãPerlèšèªãäžåœã«å¿ããããŠããç¶æ³ããããŸãã ç§ã¯ãã®çŽ æŽãããèšèªã®æš©åšãã¡ã¢ã§å°ãäžãããã§ãã
ãã®ãã¯ãããŒãã¯ãPerlã®åŠç¿è
ããã®èšèªã®å°éå®¶ãããã³Perlã®è©³çްãç¥ãããã ãã®äººã察象ãšããŠããŸãã èšäºã§ã¯ãç§ã®çµéšã ããå
±æããããšæããŸãã
ç§ã®æèŠã§ã¯ãäžå°èŠæš¡ã®ãããžã§ã¯ããéçºããéã«ããèµ·ããç°¡åãªç¶æ³ãèããããšæããŸãã ãããŠç¶æ³ã¯ããã§ãïŒå°ããªïŒäžïŒãµã€ããäœæããå¿
èŠããããCMSãæŸæ£ããæ±ºå®ãäžãããŸãããšã³ãžã³ãå°ããã®ã§ã管çããã«ã«ãã«ããã€ãã¹ã«ã®å¿
èŠã¯ãªããè€éãã¯çŽ16-24人/æéã§ã ããšãã°ãç¹å®ã®çš®é¡ã®èšäºïŒéåžžã®ããã¹ãèšäºïŒãšãã¥ãŒã¹ãå«ãå°ããªãµã€ããå¿
èŠã§ãã ããã«ãèšäºããã¥ãŒã¹ã远å ããããã®å°ããªç®¡çããã«ã ãã®èšäºã®2çš®é¡ã®ã³ã³ãã³ãã«ã¯ã倧ããªãéããããããšã«åæããŸãããã
åé¡
ãã®ãããªç¶æ³ã§ã¯ãå€ãã®å Žåãèªè»¢è»ãã€ãŸããšã³ãžã³ãæžããšããæ±ºå®ãäžãããŸãã ãã®ãããªç¶æ³ãèããŠã¿ãŸãããããã®äŸã§ã¯ãPerlãš
CPANã®æ¥œãããèæ
®ããŸãã
MVCã®æ¬æ Œçãªå®è£
ã¯æäŸããŠããŸãããããã¯ç§ãã¡ã®å°ããªãããžã§ã¯ãã«ã¯å€ãããŸãã ãã£ãªããžãšãã¬ãŒã ã¯ãŒã¯ã®å°ããªã«ãŒãïŒMVCãšããã§ãªãäž¡æ¹ïŒãPerlçšã«æžãããŸãããããšãã°ãåªãã
Catalyst㯠ãRubyOnRailsãšéåžžã«ãã䌌ãŠããŸãïŒãŸãã¯ãã®éãç§ã¯å¹Žè¡šãç¥ããŸããïŒã å°ãããã®ã倿°ãã
ãŸã ã奜å¥å¿theçãªæ¹ã¯ã
ãã¡ããã芧ãã ãã ã
ç°¡åã«ããããã«ãåæ§ã®ã¡ã«ããºã ãå®è£
ããŠããŸãããããã·ã³ãã«ã§ãã ããã§ã¯ãã¢ãžã¥ãŒã«ã®åœ¢åŒã§ãšã³ãžã³ã®ã³ã³ããŒãã³ãïŒ
LAMPãããã©ã«ãã§ãïŒãèŠãŠã¿ãŸãããã
1.ããŒã¿-DBIx ::ã¯ã©ã¹
2.衚瀺-ãã³ãã¬ãŒãããŒã«ããã
3.管ç-èªåã§è¡ã
å°ããªäœè«ã ç§ã¯é·ãécgi-binãã©ã«ããŒã奜ãã§ã¯ãããŸãããå¯èœãªéãããããæ¹æ³ã§.htaccessãã¡ã€ã«ãèš±å¯ããããšããŠããŸãïŒã»ãšãã©ãã¹ãŠã®ãã¹ãã£ã³ã°ãµãŒãã¹ã§ïŒããã«ã¯èªå®
ã§ãïŒã ãã®ãããªãã¡ã€ã«ããããžã§ã¯ãã®ã«ãŒããã©ã«ããŒã«äœæããããã«æžã蟌ã¿ãŸãã
Options +ExecCGI
AddHandler cgi-script pl
DirectoryIndex index.pl
ããã§ãçŸåšã®ãã£ã¬ã¯ããªã§æ¡åŒµå.plã®ã¹ã¯ãªãããçŽæ¥å®è¡ã§ããŸãã ããã«ãããã©ã«ãã®ããŒãžã¯index.plã¹ã¯ãªããã«ãªããŸãã
次ã«ãåžžã«èšå®ãäœæããããšããå§ãããŸãã å€ãã®ããªãšãŒã·ã§ã³ããããŸããã誰ããç°ãªã£ãŠå¥œãã§ããç§ã«ãšã£ãŠã¯æå°éã«èŠããŸãïŒ
package Conf;
use warnings;
use strict;
BEGIN
{
use Exporter;
our (@ISA, @EXPORT);
@ISA = qw(Exporter);
@EXPORT = qw(
$DB_Host $DB_Port $DB_Name $DB_User $DB_Pass
);
}
our $DB_Host = "host";
our $DB_Port = 3306;
our $DB_Name = "our_db";
our $DB_User = "our_table";
our $DB_Pass = "our_password";
1;
ããã§ã¯è»äºçãã°ããŒãã«ãªãããžã§ã¯ããã©ã¡ãŒã¿ã¯å°å
¥ãããããšã¯ã¹ããŒããããŸããã
ããŒã¿
DBæ§é
ãšã³ãžã³ã«æ»ããŸãã æåã®ãã€ã³ãã¯ããŒã¿ã®æäœã§ããDBIx:: Classããã±ãŒãžã«ã¯ããã€ãã®ã¢ãžã¥ãŒã«ãå«ãŸããŠããŸãã ãŸããäœæ¥ã«äœ¿çšããåçŽãªããŒã¿ããŒã¹ãäœæããŸãã ããŒã¿ããŒã¹ã®æ§é ã«æ¹å€çã§ããå¿
èŠã¯ãããŸãããå¯èœãªéãåçŽã§ãäœåãªæ§æããªãã ãã§ãã³ã¹ããæå°éã«æããŸãã
create table users (
id smallint not null primary key auto_increment,
name varchar(32) not null,
pass varchar(32) not null);
create table categories (
id int not null primary key auto_increment,
name varchar(128) not null) charset cp1251;
create table articles (
id int not null primary key auto_increment,
category_id int not null,
title varchar(255) not null,
content text not null,
author varchar(128) not null comment 'Author of article',
added_at timestamp not null,
added_by smallint not null comment 'Admin user ID') charset cp1251;
create table news (
id int not null primary key auto_increment,
added_at timestamp not null,
title varchar(255) not null,
content text not null,
is_put_on_main bool not null default 0 comment 'Show on main page?',
added_by smallint not null) charset cp1251;
ãŠãŒã¶ãŒããŒãã«ã«ã¯æãåºæ¬çãªããŒã¿ãå«ãŸãïŒèšªåæ°ãªã©ã¯ãŸã æ°ã«ãªããŸããïŒã
ã«ããŽãªããŒãã«ã«ã¯èšäºã®ã»ã¯ã·ã§ã³ïŒãèªåãããã¹ããŒããããæçããªã©ïŒãå«ãŸãã
èšäºããŒãã«ã«ã¯å®éã®èšäºã
ãã¥ãŒã¹ããŒãã«ãå«ãŸããŸã-ãã¥ãŒã¹ã åŸè
ã«ã¯ãã¡ã€ã³ã®ãã¥ãŒã¹ã衚瀺ãããã£ãŒã«ã
is_put_on_mainããããŸãã ãŸããã»ãšãã©ãã¹ãŠã®ããŒãã«ã§ããšã³ã³ãŒãã£ã³ã°ãèšå®ããŸã-ããã¯ç¿æ
£ã§ãã確ãã«-ããªãã§ãã ããã
ã³ãŒããžã®ãããã³ã°
ããŠãããŒãã«ããããŸããä»åºŠã¯ã³ãŒãã§ãããã衚瀺ããå¿
èŠããããŸãã DBIx :: Classã¢ãžã¥ãŒã«ã䜿çšãããšãSQLã³ãŒãã®èšè¿°ããå®å
šã«é¢ãããªããžã§ã¯ããšããŠããŒãã«ãšéä¿¡ã§ããŸãã ãã®ã¢ãžã¥ãŒã«ã䜿çšããã«ã¯ã2ã€ã®æ¹æ³ããããŸããåããŒãã«ã®æ§é ãæåã§èšè¿°ããããèªååã䜿çšããŸãã äž¡æ¹ã®æ¹æ³ãé çªã«èããŠã¿ãŸãããã
æäœæ¥ã«ããæ¹æ³
ã³ãŒããèŠãŠãããã«èª¬æããããŸãã ãããžã§ã¯ãã®ã«ãŒãã«
DBãšãããã©ã«ããŒãäœæãããã®äžã«4ã€ã®ãã¡ã€ã«ãäœæããŸãïŒUser.pmãCategory.pmãArticle.pmãNews.pmããããã®ãã¡ã€ã«ã®å
å®¹ã¯æ¬¡ã®ãšããã§ãã
# file User.pm
package DB::User;
use base qw/DBIx::Class/;
__PACKAGE__->load_components(qw/PK::Auto Core/);
__PACKAGE__->table('users');
__PACKAGE__->add_columns(qw/id name pass/);
__PACKAGE__->set_primary_key('id');
__PACKAGE__->has_many('articles' => 'DB::Article',
{ 'foreign.added_by' => 'self.id' });
__PACKAGE__->has_many('news' => 'DB::News',
{ 'foreign.added_by' => 'self.id' });
1;
# file Category.pm
package DB::Category;
use base qw/DBIx::Class/;
__PACKAGE__->load_components(qw/PK::Auto Core/);
__PACKAGE__->table('categories');
__PACKAGE__->add_columns(qw/id name/);
__PACKAGE__->set_primary_key('id');
__PACKAGE__->has_many('articles' => 'DB::Article',
{ 'foreign.category_id' => 'self.id' });
1;
# file Article.pm
package DB::Article;
use base qw/DBIx::Class/;
__PACKAGE__->load_components(qw/InflateColumn::DateTime PK::Auto Core/);
__PACKAGE__->table('articles');
__PACKAGE__->add_columns(qw/id category_id title content added_by author/);
__PACKAGE__->add_columns('added_at' => { data_type => 'timestamp' });
__PACKAGE__->set_primary_key('id');
__PACKAGE__->belongs_to('category' => 'DB::Category',
{ 'foreign.id' => 'self.category_id' });
__PACKAGE__->belongs_to('user' => 'DB::User',
{ 'foreign.id' => 'self.added_by' });
1;
# file News.pm
package DB::News;
use base qw/DBIx::Class/;
__PACKAGE__->load_components(qw/InflateColumn::DateTime PK::Auto Core/);
__PACKAGE__->table('news');
__PACKAGE__->add_columns(qw/id title content is_put_on_main added_by/);
__PACKAGE__->add_columns('added_at' => { data_type => 'timestamp' });
__PACKAGE__->set_primary_key('id');
__PACKAGE__->belongs_to('user' => 'DB::User',
{ 'foreign.id' => 'self.added_by' });
1;
ã ãããå°ã説æã 4ã€ã®éåžžã«é¡äŒŒãããã¡ã€ã«ããããæåã«åºæ¬ã¢ãžã¥ãŒã«DBIx :: Classã宣èšããæ¬¡ã«__PACKAGE__ã¡ã«ããºã ã䜿çšããŠãã®ã¡ãœãããåŒã³åºããŸãïŒ
load_components-ã¢ãžã¥ãŒã«ã®ã³ã³ããŒãã³ããããŒãããŸããªã³ã¯ãè¡ãåãå«ãïŒã 次ã«ãããŒãã«ãæå®ãããã®åŸã«åã®ååã远å ããŸãã æ¥æãæ¥ä»ãã¿ã€ã ã¹ã¿ã³ããªã©ã®ã¿ã€ãã®åãæäœããã«ã¯ãå°ããªã¢ãžã¥ãŒã«
InflateColumn :: DateTimeã䜿çšãããŸãã ããã䜿çšãããšã瀺ãããã¿ã€ãã®ãã£ãŒã«ãã¯ã
DateTimeã¿ã€ãã®ãªããžã§ã¯ããšããŠããã°ã©ã ã§äœ¿çšã§ãããã¹ãŠã®åŸç¶ã®ã¢ã¡ããã£ã䜿çšã§ããŸãã ãã®åŸãäž»ããŒãæå®ããŸãïŒè€åããŒã®å Žåã¯ãè€æ°ã®ãã£ãŒã«ã
set_primary_keyïŒqw / name1 name2 /ïŒãæå®ããŸã
;ïŒã次ã«ãRubyOnRailsãhas_manyïŒïŒãbelongs_toïŒïŒãããã³ãã®ä»ãç¥ã£ãŠãã人ã«ãšã£ãŠéŠŽæã¿ã®ããã¡ãœããããããŸãã ãããã®ã¡ãœããã¯ãããŒãã«éã®é¢ä¿ãäœæããããã«èšèšãããŠããŸãã
ãã°ãããDBIx :: Classã¢ãžã¥ãŒã«
ã®ããã¥ã¡ã³ã ããã¥ãŒããªã¢ã«ãã¯ãã¯ããã¯ãªã©ããã¹ãŠã詳现ã«èª¬æãããŠããŸãã
次ã«ããã®å¥è·¡ã䜿çšããå¿
èŠããããŸãããã®ããã«ã¯ã
DBIx :: Class :: Shemaã¢ãžã¥ãŒã«ãå¿
èŠã§ããããã¯ãããŒã¿ã¹ããŒã ã®æœè±¡åã§ãã ãããžã§ã¯ãã®ã«ãŒããã©ã«ããŒã«ãããŒãã«ãèšè¿°ããã¯ã©ã¹ãæã€ãã©ã«ããŒã®ååãšåãååã®ãã¡ã€ã«ãäœæããŸãããã®å Žåã¯
DB.pmã«ãªããŸãã
package SDB;
use base qw/DBIx::Class::Schema/;
use Conf;
__PACKAGE__->load_classes();
sub GetSchema()
{
my $dsn = "dbi:mysql:$DB_Name:$DB_Host";
my $sch = __PACKAGE__->connect($dsn, $DB_User, $DB_Pass);
return $sch;
}
1;
äžè¬ã«ã
GetShemaïŒïŒé¢æ°ãªãã§
DBIx :: Class :: Schemaã䜿çš
ã§ããŸã
ãload_classes ïŒïŒã¡ãœããã¯ãåãååã®ãã©ã«ããŒã§èŠã€ãã£ããã¹ãŠã®ãã¡ã€ã«ãèªåçã«ããŒãããŸãã åè·¯ãååŸããæ¹ã䟿å©ã«ãªãããã«ãå°ããªé¢æ°ã远å ããŸããã ãã®é¢æ°ããªããšãã³ãŒãå
ã®æ¥ç¶ã¯æ¬¡ã®ããã«ãªããŸãã
my $dsn = "dbi:mysql:$DB_Name:$DB_Host";
my $sch = DB->connect($dsn, $DB_User, $DB_Pass);
funkiyaã®å Žåããããã®ããã€ããèšè¿°ããããç°ãªãã¿ã€ãã®ããŒã¹ãšã®æ¥ç¶ãå¥ã
ã«æ§æãããã§ããŸãã
èªåæ¹æ³
ãæåãã®äŸã§ã¯ãããŒãã«éã®ãã¹ãŠã®é¢ä¿ãæåã§èšå®ããŸãã ã¯ã©ã¹ãèªåçã«ããŒãããã³äœæãã
DBIx :: Class :: Shema :: Loaderã¢ãžã¥ãŒã«ããããŸãã ãããè¡ãã«ã¯ãå€éšããŒã®èª¬æãããŒã¿ããŒã¹æ§é ã«è¿œå ããŸãã ããŒããŒã䜿çšãããšãå¿
èŠãªæ¥ç¶ãèªåçã«äœæãããŸãã ããã¯æ¬¡ã®ãããªãã®ã§ãã
package DB;
use base qw/DBIx::Class::Schema::Loader/;
__PACKAGE__->loader_options(
inflect_singular => 1,
components => qw/InflateColumn::DateTime/
);
1;
#
use DB;
my $sch = DB->connect( $dsn, $user, $password, $attrs);
äžèšã®
GetShemaïŒïŒé¢æ°ã远å
ïŒäžèšãåç
§ïŒããŠäœ¿çšããããšãã§ããŸãã ãã®å ŽåãDBãã©ã«ããŒãšãã®äžã®4ã€ã®ãã¡ã€ã«ã¯äžèŠã«ãªããã¹ããŒãèšè¿°ãã¡ã€ã«ã¯ãŸã 1ã€ãããŸãã ããŒããŒã¯ãäœæããã¯ã©ã¹ã®åå空éãã¯ã©ã¹åãçæããããã®ãã©ã¡ãŒã¿ãŒãªã©ãæå®ããå€ãã®
ãªãã·ã§ã³ããµããŒãããŠã
ãŸã ã
ã¹ããŒãã䜿çšãã
次ã«ãããããã¹ãŠãã³ãŒãã§çŽæ¥äœ¿çšãããæ¹æ³ãèŠãŠã¿ãŸãããã
use DB;
my $sch = DB->GetShema();
# id
my $user = $sch->resultset('User')->find({ id => $id });
#
my $new_id = $sch->resultset('Category')->populate(
[
[qw/title content is_put_on_main added_by/],
[$ntitle, $ncontent, 0, $user_id]
]);
#
$sch->resultset('Article')->find({ id => $aid })->delete;
次ã«ãããŒã¿ã衚瀺ããŸãã
ãã£ã¹ãã¬ã€
Template Toolkitã䜿çšã
ãŸã ã ããã«ããã€ãã®ã·ã¹ãã ãããšãã°
MasonããããŸãããæŽå²çã«ãããªã£ããããç§ã®éžæã¯Template Toolkitã«å§ããããŸããã
Template Toolkitã¯ããã³ãã¬ãŒãåŠçã·ã¹ãã ã§ãã äŸã§ãã®äœ¿ç𿹿³ãèŠãŠã¿ãŸãããã ãŸãããããžã§ã¯ãã«ãŒãã«
tmplãã©ã«ããŒãäœæãããã®äžã«
ãµã€ããã©ã«ããŒãäœæããŸãã
tmpl / siteãã©ã«ããŒã§ã次ã®å
容ã®
ãµã€ããã¡ã€ã«ãäœæããŸãã
Portal
[% PROCESS $content %]
次ã«ãããã«start_pageãã¡ã€ã«ãäœæããŸãã
News and articles
ããã¯ã1è¡ã®åçŽãªãã¡ã€ã«ã§ãã ããã¯ãã¹ã¿ãŒãããŒãžã®ç©ºçœã«ãªããŸãã ãã¹ãŠããŸãšããŠã
index.plã¹ã¯ãªããçšã«æ¬¡ã®ã³ãŒãã®ãããªãã®ãååŸããŸãã
#!/usr/bin/perl -w
use strict;
use CGI;
use Template;
use Conf;
use DB;
# CGI
my $q = CGI->new;
my %p = $q->Vars;
# ...
my $tmpl = Template->new(
{
INCLUDE_PATH => 'tmpl/site',
INTERPOLATE => 1,
EVAL_PERL => 1
}) || die "$Template::ERROR\n";
# ...
my $sch = DB->GetShema();
#
my $tmpl_vars = {};
$tmpl_vars->{content} = 'start_page';
print $q->header(-type => 'text/html', -charset => 'windows-1251');
$tmpl->process('site', $tmpl_vars) || die $tmpl->error(), "\n";
誰ããCGIã«ã€ããŠã®2è¡ãçè§£ããŠãããšæããŸããæ¬¡ã«ãã³ãã¬ãŒããã³ãã¬ãŒããäœæããŸãããã³ãã¬ãŒãã®ã¡ã€ã³ãã©ã¡ãŒã¿ã¯
INCLUDE_PATHã§ãã ããå°ããããŒã¿ã¹ããŒã ãäœæããããŒã¿ããŒã¹ã«æ¥ç¶ããŸãã æ¬¡ã«ããã³ãã¬ãŒãã«æž¡ãå¿
èŠã®ãããã¹ãŠã®å€æ°ã远å ããããã·ã¥ãäœæããŸãã ãã®å Žåã1ã€ã®å€æ°
contentã®ã¿ãæž¡ããŸãããã®å€æ°ã¯ã
ãµã€ããã³ãã¬ãŒãã®
PROCESSãã£ã¬ã¯ãã£ãã§äœ¿çšãããŸãã ããã«äœãã®ã¯ããã³ãã¬ãŒãã®åŠçãéå§ããéå§ãã³ãã¬ãŒã-siteãæå®ãã倿°ã®ããã·ã¥ã転éããããšã§ãã
ãµã€ããã³ãã¬ãŒãã¯
PROCESSãã£ã¬ã¯ãã£ãã䜿çšããååããã©ã¡ãŒã¿ãŒãšããŠæž¡ãããå¥ã®ãã³ãã¬ãŒãã®ãã¹ããããåŠçãéå§ããŸããã倿°ã«ååãæ ŒçŽãããŠããããããããçŽæ¥ç€ºããŸã-
[ïŒ
PROCESS $ contentïŒ
] ãããã£ãŠã
start_pageãã³ãã¬ãŒãã®ã³ã³ãã³ãã¯ã
ãµã€ããã³ãã¬ãŒãã®æ¬æã«
æ¿å
¥ãããŸãã å°ããã©ãšãã£ã远å ããŸãã ã¡ã€ã³ããŒãžã§ã¯ãèšäºãšãã¥ãŒã¹ã衚瀺ããå¿
èŠããããŸããããã¹ãŠã§ã¯ãªããæåŸã®10ä»¶ã衚瀺ããå¿
èŠããããŸãã ãŸãããã¥ãŒã¹ã¯ãããŒãã«å
ã®å¯Ÿå¿ãããã©ã°ã§ããŒã¯ãããŠãããã¥ãŒã¹ã®ã¿ã§ãã ãã³ãã¬ãŒããåŠçããåã«ãã¹ã¯ãªããã«æ°è¡ã远å ããŸãã
my $articles = [$sch->resultset('Article')->search(undef,
{
order_by => 'added_at desc',
rows => 10,
page => 1
})];
my $news = [$sch->resultset('News')->search(
{
is_put_on_main => 1
},
{
order_by => 'added_at desc',
rows => 10,
page => 1
})];
$tmpl_vars->{articles} = $articles;
$tmpl_vars->{news} = $news;
[]ã䜿çšããŠãªã¹ãã³ã³ããã¹ããäœæããããšã«æ³šæããŠãã ãããããã§ãªãå Žåãã¹ã«ã©ãŒã³ã³ããã¹ãã§ã¯ã
searchïŒïŒé¢æ°ã¯
ResultSetåã®ãªããžã§ã¯ããè¿ããæ£ç¢ºã«ããŒã¿ã®é
åãå¿
èŠã§ãã
ã§ãããããã¹ãŠãããªãæçœãªã®ã§ã詳现ã«èª¬æããã®ã¯æå³ããããŸããã å¯äžã®ãã®ã¯ã
è¡/ããŒãžãã©ã¡ãŒã¿ã®äœ¿çšã§ãã ãããã¯ãããŒãžããŒã·ã§ã³ãæŽçããã®ã«äŸ¿å©ãªãããããããŒãžã£ãŒãäœæããããã«å¿
èŠã§ãããç¹æ®ãªã±ãŒã¹ã§ããã¬ã³ãŒãã®åçŽãªéžæã«ã䜿çšãããŸãã ãŸããèšäºãšãã¥ãŒã¹ã®æ°ãæ§æã«éä¿¡ã§ããŸãã
次ã«ã
start_pageãã³ãã¬ãŒãã倿Žã
ãŸã ã
[% FOREACH n = news %]
[% n.added_at.dmy('.') %] [% n.title %]
[% n.content FILTER html %]
[% END %]
[% FOREACH a = articles %]
[% a.added_at.dmy('.') %] [% a.title %]
: [% a.category.name %]
[% a.content FILTER html %]
[% END %]
[% FOREACH n = news %]
[% n.added_at.dmy('.') %] [% n.title %]
[% n.content FILTER html %]
[% END %]
[% FOREACH a = articles %]
[% a.added_at.dmy('.') %] [% a.title %]
: [% a.category.name %]
[% a.content FILTER html %]
[% END %]
[% FOREACH n = news %]
[% n.added_at.dmy('.') %] [% n.title %]
[% n.content FILTER html %]
[% END %]
[% FOREACH a = articles %]
[% a.added_at.dmy('.') %] [% a.title %]
: [% a.category.name %]
[% a.content FILTER html %]
[% END %]
[% FOREACH n = news %]
[% n.added_at.dmy('.') %] [% n.title %]
[% n.content FILTER html %]
[% END %]
[% FOREACH a = articles %]
[% a.added_at.dmy('.') %] [% a.title %]
: [% a.category.name %]
[% a.content FILTER html %]
[% END %]
added_atãã£ãŒã«ãããªããžã§ã¯ããšããŠäœ¿çšããŠããããšã«æ³šæããŠãã ããã ãã®ããã«ã
dmyïŒïŒã¡ãœããã
åŒã³åºãããŸã ããã®ã¡ãœããã¯ãæå®ãããåºåãæåïŒãã®å Žåã¯ããªãªãïŒã䜿çšããŠDD-MM-YYYY圢åŒã§æ¥ä»ããã©ãŒãããããŸãã
DateTimeãªããžã§ã¯ãã¯ãã±ãŒã«ããµããŒãããçŸåšã®ïŒãŸãã¯éžæãããïŒãã±ãŒã«ã«å¿ããŠæ¥ä»ãæ£ãã衚瀺ããŸãã ãŸããæ¥ä»ã®æžåŒèšå®ãšæäœã®ããã®å€ãã®ã¡ãœãããå«ãŸããŠããŸãã
æå¹ãªãªã³ã¯ããŸã æå³çã«è¿œå ããŠããŸãããããã¯åŸã§è¡ããŸãã
äžè¬çã«ãããã«ãã¡ã€ã«ã«ç§»åããå¿
èŠããã2ã€ã®é¡äŒŒãããããã¯ããããŸãã
tmpl / siteãã©ã«ããŒã«
short_noteãã¡ã€ã«ãäœæããŸãã
[% text = node.content;
IF text.length > 512;
text = text.substr(0, 512);
END %]
[% note.added_at.dmy('.') %] [% note.title %]
[% IF note.category %]
: [% note.category.name %]
[% END %]
[% text FILTER html %]
ããã§ã
start_pageãã³ãã¬ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
[% FOREACH n = news %]
[% PROCESS short_note note = n %]
[% END %]
[% FOREACH a = articles %]
[% PROCESS short_note note = a %]
[% END %]
[% FOREACH n = news %]
[% PROCESS short_note note = n %]
[% END %]
[% FOREACH a = articles %]
[% PROCESS short_note note = a %]
[% END %]
[% FOREACH n = news %]
[% PROCESS short_note note = n %]
[% END %]
[% FOREACH a = articles %]
[% PROCESS short_note note = a %]
[% END %]
[% FOREACH n = news %]
[% PROCESS short_note note = n %]
[% END %]
[% FOREACH a = articles %]
[% PROCESS short_note note = a %]
[% END %]
ããã§ã
short_noteãã³ãã¬ãŒãã®åŠçãåŒã³åºããçŸåšã®ãã¥ãŒã¹ãŸãã¯èšäºããã©ã¡ãŒã¿ãŒãšããŠ
noteã«æž¡ããŸãã
ãã³ãã¬ãŒãã¯ãèšäºã®æ©èœã§ãã
ã«ããŽãªãã£ãŒã«ãã®ååšã確èªã
ãŸãããã®å Žåãã»ã¯ã·ã§ã³ã®ååã衚瀺ããŸãã
ããŒã¿ã«ã§ã¯ãèšäºå
šäœãŸãã¯ãã¥ãŒã¹ã衚瀺ããèšäºã«ããŽãªã®ãªã¹ããæ€çŽ¢ãã©ãŒã ãããã³æ€çŽ¢çµæã衚瀺ããããã®ãã³ãã¬ãŒããå¿
èŠã§ãã äžè¬ã«ãè€éãã®ç¹ã§äžèšãšããŸãå€ãããªããã³ãã¬ãŒããããã«ããã€ã远å ãããŸãã
éå¶ç®¡ç
äžèšã§ã¯ããã¹ãŠã®çš®é¡ã®ãã¬ãŒã ã¯ãŒã¯ã䜿çšããªãããšã«åæããŸãããç§ãã¡ã¯èªåã®æã§æå°éã®ããšãããããšããŸãã ãããè¡ãããã«ã次ã®åçŽãªæ§é ãäœæããŸãïŒã©ããŒãã¯ãïŒïŒ
my $act = $p{'a'} || 'start';
if ($act eq 'start')
{
}
elsif ($act eq 'article')
{
}
elsif ($act eq 'news')
{
}
# ....
else
{
}
ãã®ãããã¹ã¯ãªããå
ã®åãªã³ã¯ã«ã¯-
ã¢ã¯ã·ã§ã³ãã©ã¡ãŒã¿ãŒãä»éããŸãã çŸåšã®ã³ã³ããã¹ããèšå®ããŸãã ãããã£ãŠããã³ãã¬ãŒãå
ã®äžèšã®ãªã³ã¯ã¯æ¬¡ã®ããã«å€æŽã§ããŸãã
, . id , . :
$p{'id'} =~ s/\D//g if ($p{'id'});
, - , , , -. .
.
if ($act eq 'start')
{
$tmpl_vars->{content} = 'start_page';
my $articles = [$sch->resultset('Article')->search(undef,
{
order_by => 'added_at desc',
rows => 10,
page => 1
})];
my $news = [$sch->resultset('News')->search(
{
is_put_on_main => 1
},
{
order_by => 'added_at desc',
rows => 10,
page => 1
})];
$tmpl_vars->{articles} = $articles;
$tmpl_vars->{news} = $news;
}
elsif ($act eq 'article')
{
$tmpl_vars->{content} = 'full_article';
$tmpl_vars->{article} = $sch->resultset('Article')->find({ id => $p{'id'} });
}
elsif ($act eq 'category')
{
$tmpl_vars->{content} = 'category';
$tmpl_vars->{category} = $sch->resultset('Category')->find({ id => $p{'id'} });
}
elsif ($act eq 'news')
{
$tmpl_vars->{content} = 'full_article';
$tmpl_vars->{article} = $sch->resultset('News')->find({ id => $p{'id'} });
}
else
{
# .
}
, , . , Perl , , HTML-CheckArgs HTML-QuickCheck . , HTML-Widget HTML-Tag . . , . .
: , . ( , error_action , ), :
print $q->header(-location => '?a=start');
exit;
, . , , ( ):
my %action = (
'start' => 'Main page',
'news' => 'News page',
'article' => 'Full article',
# ....
);
my $act = ( $p{'act'} && defined( $actions{$p{'act'}} )) ? $p{'act'} : 'start';
, â , 'start'. - defined(...) .
. , . , tmpl/admin .
: Digest::SHA1 CGI::Session . , â .
, . .
:
[%# login %]
[% IF err %]
Wrong login
[% END %]
/>
Login: />
Password: />
/>
, :
use CGI::Session;
use Digest::SHA1 qw(sha1_hex);
# ... CGI
my $s = CGI::Session->load(undef, undef, { Directory => 'ssss' } );
# ...
if ($s->empty && $act !~ /login(_form)?|logout/)
{
print $q->header(-location => '?a=login_form');
exit;
}
else
{
my $user = $sch->resultset('User')->find({ id => $s->param('uid') });
$tmpl_vars->{user} = $user;
}
if ($act eq 'login_form')
{
$tmpl_vars->{content} = 'login_form';
}
elsif ($act eq 'login')
{
unless (my $u = &login($p{'login'}, $p{'pass'}))
{
$tmpl_vars->{content} = 'login';
$tmpl_vars->{err} = 1;
}
else
{
$s = $s->new;
$s->param('uid', $u->id);
print $s->header(-location => '?a=start');
exit;
}
}
elsif ($act eq 'logout')
{
$s->delete;
print $q->header(-location => '?a=login');
exit;
}
#
sub login
{
my ($u, $p) = @_;
my $pp = sha1_hex($p);
my $res = $sch->resultset('User')->search({
name => $u,
pass => $pp
});
my $user = $res->next;
return $user;
}
, , .
CGI::Session , . â expired. ssss .
Digest::SHA1 - MD5.
. -, CRUD- (CReate, Update, Delete). , , DBIx::Class::WebForm . CRUD CPAN .
-, . FCKeditor , . .
-, . , DBIx::Class::Validation , , , CGI::FormBuilder , CGI::QuickForm .. "Form", "Validate" "Widget" .
"" . , , , . , , . , SQL-.
, - . .
-NOT_FOR_HOLYWARS-
, . id , . :
$p{'id'} =~ s/\D//g if ($p{'id'});
, - , , , -. .
.
if ($act eq 'start')
{
$tmpl_vars->{content} = 'start_page';
my $articles = [$sch->resultset('Article')->search(undef,
{
order_by => 'added_at desc',
rows => 10,
page => 1
})];
my $news = [$sch->resultset('News')->search(
{
is_put_on_main => 1
},
{
order_by => 'added_at desc',
rows => 10,
page => 1
})];
$tmpl_vars->{articles} = $articles;
$tmpl_vars->{news} = $news;
}
elsif ($act eq 'article')
{
$tmpl_vars->{content} = 'full_article';
$tmpl_vars->{article} = $sch->resultset('Article')->find({ id => $p{'id'} });
}
elsif ($act eq 'category')
{
$tmpl_vars->{content} = 'category';
$tmpl_vars->{category} = $sch->resultset('Category')->find({ id => $p{'id'} });
}
elsif ($act eq 'news')
{
$tmpl_vars->{content} = 'full_article';
$tmpl_vars->{article} = $sch->resultset('News')->find({ id => $p{'id'} });
}
else
{
# .
}
, , . , Perl , , HTML-CheckArgs HTML-QuickCheck . , HTML-Widget HTML-Tag . . , . .
: , . ( , error_action , ), :
print $q->header(-location => '?a=start');
exit;
, . , , ( ):
my %action = (
'start' => 'Main page',
'news' => 'News page',
'article' => 'Full article',
# ....
);
my $act = ( $p{'act'} && defined( $actions{$p{'act'}} )) ? $p{'act'} : 'start';
, â , 'start'. - defined(...) .
. , . , tmpl/admin .
: Digest::SHA1 CGI::Session . , â .
, . .
:
[%# login %]
[% IF err %]
Wrong login
[% END %]
/>
Login: />
Password: />
/>
, :
use CGI::Session;
use Digest::SHA1 qw(sha1_hex);
# ... CGI
my $s = CGI::Session->load(undef, undef, { Directory => 'ssss' } );
# ...
if ($s->empty && $act !~ /login(_form)?|logout/)
{
print $q->header(-location => '?a=login_form');
exit;
}
else
{
my $user = $sch->resultset('User')->find({ id => $s->param('uid') });
$tmpl_vars->{user} = $user;
}
if ($act eq 'login_form')
{
$tmpl_vars->{content} = 'login_form';
}
elsif ($act eq 'login')
{
unless (my $u = &login($p{'login'}, $p{'pass'}))
{
$tmpl_vars->{content} = 'login';
$tmpl_vars->{err} = 1;
}
else
{
$s = $s->new;
$s->param('uid', $u->id);
print $s->header(-location => '?a=start');
exit;
}
}
elsif ($act eq 'logout')
{
$s->delete;
print $q->header(-location => '?a=login');
exit;
}
#
sub login
{
my ($u, $p) = @_;
my $pp = sha1_hex($p);
my $res = $sch->resultset('User')->search({
name => $u,
pass => $pp
});
my $user = $res->next;
return $user;
}
, , .
CGI::Session , . â expired. ssss .
Digest::SHA1 - MD5.
. -, CRUD- (CReate, Update, Delete). , , DBIx::Class::WebForm . CRUD CPAN .
-, . FCKeditor , . .
-, . , DBIx::Class::Validation , , , CGI::FormBuilder , CGI::QuickForm .. "Form", "Validate" "Widget" .
"" . , , , . , , . , SQL-.
, - . .
-NOT_FOR_HOLYWARS-
, . id , . :
$p{'id'} =~ s/\D//g if ($p{'id'});
, - , , , -. .
.
if ($act eq 'start')
{
$tmpl_vars->{content} = 'start_page';
my $articles = [$sch->resultset('Article')->search(undef,
{
order_by => 'added_at desc',
rows => 10,
page => 1
})];
my $news = [$sch->resultset('News')->search(
{
is_put_on_main => 1
},
{
order_by => 'added_at desc',
rows => 10,
page => 1
})];
$tmpl_vars->{articles} = $articles;
$tmpl_vars->{news} = $news;
}
elsif ($act eq 'article')
{
$tmpl_vars->{content} = 'full_article';
$tmpl_vars->{article} = $sch->resultset('Article')->find({ id => $p{'id'} });
}
elsif ($act eq 'category')
{
$tmpl_vars->{content} = 'category';
$tmpl_vars->{category} = $sch->resultset('Category')->find({ id => $p{'id'} });
}
elsif ($act eq 'news')
{
$tmpl_vars->{content} = 'full_article';
$tmpl_vars->{article} = $sch->resultset('News')->find({ id => $p{'id'} });
}
else
{
# .
}
, , . , Perl , , HTML-CheckArgs HTML-QuickCheck . , HTML-Widget HTML-Tag . . , . .
: , . ( , error_action , ), :
print $q->header(-location => '?a=start');
exit;
, . , , ( ):
my %action = (
'start' => 'Main page',
'news' => 'News page',
'article' => 'Full article',
# ....
);
my $act = ( $p{'act'} && defined( $actions{$p{'act'}} )) ? $p{'act'} : 'start';
, â , 'start'. - defined(...) .
. , . , tmpl/admin .
: Digest::SHA1 CGI::Session . , â .
, . .
:
[%# login %]
[% IF err %]
Wrong login
[% END %]
/>
Login: />
Password: />
/>
, :
use CGI::Session;
use Digest::SHA1 qw(sha1_hex);
# ... CGI
my $s = CGI::Session->load(undef, undef, { Directory => 'ssss' } );
# ...
if ($s->empty && $act !~ /login(_form)?|logout/)
{
print $q->header(-location => '?a=login_form');
exit;
}
else
{
my $user = $sch->resultset('User')->find({ id => $s->param('uid') });
$tmpl_vars->{user} = $user;
}
if ($act eq 'login_form')
{
$tmpl_vars->{content} = 'login_form';
}
elsif ($act eq 'login')
{
unless (my $u = &login($p{'login'}, $p{'pass'}))
{
$tmpl_vars->{content} = 'login';
$tmpl_vars->{err} = 1;
}
else
{
$s = $s->new;
$s->param('uid', $u->id);
print $s->header(-location => '?a=start');
exit;
}
}
elsif ($act eq 'logout')
{
$s->delete;
print $q->header(-location => '?a=login');
exit;
}
#
sub login
{
my ($u, $p) = @_;
my $pp = sha1_hex($p);
my $res = $sch->resultset('User')->search({
name => $u,
pass => $pp
});
my $user = $res->next;
return $user;
}
, , .
CGI::Session , . â expired. ssss .
Digest::SHA1 - MD5.
. -, CRUD- (CReate, Update, Delete). , , DBIx::Class::WebForm . CRUD CPAN .
-, . FCKeditor , . .
-, . , DBIx::Class::Validation , , , CGI::FormBuilder , CGI::QuickForm .. "Form", "Validate" "Widget" .
"" . , , , . , , . , SQL-.
, - . .
-NOT_FOR_HOLYWARS-
, . id , . :
$p{'id'} =~ s/\D//g if ($p{'id'});
, - , , , -. .
.
if ($act eq 'start')
{
$tmpl_vars->{content} = 'start_page';
my $articles = [$sch->resultset('Article')->search(undef,
{
order_by => 'added_at desc',
rows => 10,
page => 1
})];
my $news = [$sch->resultset('News')->search(
{
is_put_on_main => 1
},
{
order_by => 'added_at desc',
rows => 10,
page => 1
})];
$tmpl_vars->{articles} = $articles;
$tmpl_vars->{news} = $news;
}
elsif ($act eq 'article')
{
$tmpl_vars->{content} = 'full_article';
$tmpl_vars->{article} = $sch->resultset('Article')->find({ id => $p{'id'} });
}
elsif ($act eq 'category')
{
$tmpl_vars->{content} = 'category';
$tmpl_vars->{category} = $sch->resultset('Category')->find({ id => $p{'id'} });
}
elsif ($act eq 'news')
{
$tmpl_vars->{content} = 'full_article';
$tmpl_vars->{article} = $sch->resultset('News')->find({ id => $p{'id'} });
}
else
{
# .
}
, , . , Perl , , HTML-CheckArgs HTML-QuickCheck . , HTML-Widget HTML-Tag . . , . .
: , . ( , error_action , ), :
print $q->header(-location => '?a=start');
exit;
, . , , ( ):
my %action = (
'start' => 'Main page',
'news' => 'News page',
'article' => 'Full article',
# ....
);
my $act = ( $p{'act'} && defined( $actions{$p{'act'}} )) ? $p{'act'} : 'start';
, â , 'start'. - defined(...) .
. , . , tmpl/admin .
: Digest::SHA1 CGI::Session . , â .
, . .
:
[%# login %]
[% IF err %]
Wrong login
[% END %]
/>
Login: />
Password: />
/>
, :
use CGI::Session;
use Digest::SHA1 qw(sha1_hex);
# ... CGI
my $s = CGI::Session->load(undef, undef, { Directory => 'ssss' } );
# ...
if ($s->empty && $act !~ /login(_form)?|logout/)
{
print $q->header(-location => '?a=login_form');
exit;
}
else
{
my $user = $sch->resultset('User')->find({ id => $s->param('uid') });
$tmpl_vars->{user} = $user;
}
if ($act eq 'login_form')
{
$tmpl_vars->{content} = 'login_form';
}
elsif ($act eq 'login')
{
unless (my $u = &login($p{'login'}, $p{'pass'}))
{
$tmpl_vars->{content} = 'login';
$tmpl_vars->{err} = 1;
}
else
{
$s = $s->new;
$s->param('uid', $u->id);
print $s->header(-location => '?a=start');
exit;
}
}
elsif ($act eq 'logout')
{
$s->delete;
print $q->header(-location => '?a=login');
exit;
}
#
sub login
{
my ($u, $p) = @_;
my $pp = sha1_hex($p);
my $res = $sch->resultset('User')->search({
name => $u,
pass => $pp
});
my $user = $res->next;
return $user;
}
, , .
CGI::Session , . â expired. ssss .
Digest::SHA1 - MD5.
. -, CRUD- (CReate, Update, Delete). , , DBIx::Class::WebForm . CRUD CPAN .
-, . FCKeditor , . .
-, . , DBIx::Class::Validation , , , CGI::FormBuilder , CGI::QuickForm .. "Form", "Validate" "Widget" .
"" . , , , . , , . , SQL-.
, - . .
-NOT_FOR_HOLYWARS-
, . id , . :
$p{'id'} =~ s/\D//g if ($p{'id'});
, - , , , -. .
.
if ($act eq 'start')
{
$tmpl_vars->{content} = 'start_page';
my $articles = [$sch->resultset('Article')->search(undef,
{
order_by => 'added_at desc',
rows => 10,
page => 1
})];
my $news = [$sch->resultset('News')->search(
{
is_put_on_main => 1
},
{
order_by => 'added_at desc',
rows => 10,
page => 1
})];
$tmpl_vars->{articles} = $articles;
$tmpl_vars->{news} = $news;
}
elsif ($act eq 'article')
{
$tmpl_vars->{content} = 'full_article';
$tmpl_vars->{article} = $sch->resultset('Article')->find({ id => $p{'id'} });
}
elsif ($act eq 'category')
{
$tmpl_vars->{content} = 'category';
$tmpl_vars->{category} = $sch->resultset('Category')->find({ id => $p{'id'} });
}
elsif ($act eq 'news')
{
$tmpl_vars->{content} = 'full_article';
$tmpl_vars->{article} = $sch->resultset('News')->find({ id => $p{'id'} });
}
else
{
# .
}
, , . , Perl , , HTML-CheckArgs HTML-QuickCheck . , HTML-Widget HTML-Tag . . , . .
: , . ( , error_action , ), :
print $q->header(-location => '?a=start');
exit;
, . , , ( ):
my %action = (
'start' => 'Main page',
'news' => 'News page',
'article' => 'Full article',
# ....
);
my $act = ( $p{'act'} && defined( $actions{$p{'act'}} )) ? $p{'act'} : 'start';
, â , 'start'. - defined(...) .
. , . , tmpl/admin .
: Digest::SHA1 CGI::Session . , â .
, . .
:
[%# login %]
[% IF err %]
Wrong login
[% END %]
/>
Login: />
Password: />
/>
, :
use CGI::Session;
use Digest::SHA1 qw(sha1_hex);
# ... CGI
my $s = CGI::Session->load(undef, undef, { Directory => 'ssss' } );
# ...
if ($s->empty && $act !~ /login(_form)?|logout/)
{
print $q->header(-location => '?a=login_form');
exit;
}
else
{
my $user = $sch->resultset('User')->find({ id => $s->param('uid') });
$tmpl_vars->{user} = $user;
}
if ($act eq 'login_form')
{
$tmpl_vars->{content} = 'login_form';
}
elsif ($act eq 'login')
{
unless (my $u = &login($p{'login'}, $p{'pass'}))
{
$tmpl_vars->{content} = 'login';
$tmpl_vars->{err} = 1;
}
else
{
$s = $s->new;
$s->param('uid', $u->id);
print $s->header(-location => '?a=start');
exit;
}
}
elsif ($act eq 'logout')
{
$s->delete;
print $q->header(-location => '?a=login');
exit;
}
#
sub login
{
my ($u, $p) = @_;
my $pp = sha1_hex($p);
my $res = $sch->resultset('User')->search({
name => $u,
pass => $pp
});
my $user = $res->next;
return $user;
}
, , .
CGI::Session , . â expired. ssss .
Digest::SHA1 - MD5.
. -, CRUD- (CReate, Update, Delete). , , DBIx::Class::WebForm . CRUD CPAN .
-, . FCKeditor , . .
-, . , DBIx::Class::Validation , , , CGI::FormBuilder , CGI::QuickForm .. "Form", "Validate" "Widget" .
"" . , , , . , , . , SQL-.
, - . .
-NOT_FOR_HOLYWARS-