# ----------------------------------------------------------------------------- # Tripletail::Template - テンプレートを扱ㆠ# ----------------------------------------------------------------------------- package Tripletail::Template; use strict; use warnings; use File::Spec::Functions; use Tripletail; use Tripletail::Template::Node; our %_REL2ABS_CACHE; 1; sub __rel2abs { my $path = shift; my $base = shift; $_REL2ABS_CACHE{"$path\0$base"} ||= File::Spec::Functions::rel2abs($path, $base); } sub _new { my $class = shift; my $this = bless {} => $class; $this->{root} = Tripletail::Template::Node->_new( undef, undef, undef, $TL->INI->get(Template => allow_unexpanded_tags => 'false')); $this->{basepath} = $TL->INI->get_reloc('Template' => 'basepath', '.'); if( !File::Spec::Functions::file_name_is_absolute($this->{basepath}) ) { my $cwd = $TL::CWD || $TL->_cwd; $this->{basepath} = __rel2abs($this->{basepath}, $cwd); } $this->{rootpath} = $TL->INI->get_reloc('Template' => 'rootpath', '/'); if( !File::Spec::Functions::file_name_is_absolute($this->{rootpath}) ) { my $cwd = $TL::CWD || $TL->_cwd; $this->{rootpath} = __rel2abs($this->{rootpath}, $cwd); } $TL->getDebug->_templateLog( node => $this->{root}, type => 'new' ); if(defined($_[0])) { $this->loadTemplate(@_); } $this; } sub _checkPathIsAcceptable { my $this = shift; my $path = shift; if( $this->{rootpath} eq '/' ) { return; # void. } # rootpathãƒã‚§ãƒƒã‚¯ my @rootpath = File::Spec::Functions::splitdir( File::Spec::Functions::canonpath($this->{rootpath}) ); length $rootpath[-1] or pop @rootpath; @rootpath && length $rootpath[-1] or pop @rootpath; $path = File::Spec::Functions::canonpath($path); my @path = File::Spec::Functions::splitdir($path); my @abspath; foreach my $dir (@path) { if($dir eq '..') { pop(@abspath); next; } push(@abspath, $dir); } for(my $i = 0; $i < @rootpath; $i++) { if($rootpath[$i] ne $abspath[$i]) { die __PACKAGE__."#_checkPathIsAcceptable: file [$path] is not allowed to be loaded ". "because it is not under [$this->{rootpath}].". " (ファイル[$path]ã¯rootpath[$this->{rootpath}]以下ã«ãªã„ã®ã§èªã¿è¾¼ã‚ã¾ã›ã‚“)\n"; } } return; # void. } sub _expandInclude { my $this = shift; my $inccount = shift; my $str = shift; my $path = shift; my $icode = shift; $$inccount += 1; if($$inccount > 20) { die __PACKAGE__."#_expandInclude: <!include> has a limitation for the recursion depth which has just been exceeded. ". "Maybe this is caused by a recursion loop.". " (<!include>ãŒãƒ«ãƒ¼ãƒ—ã—ã¦ã„ã‚‹ã‹ã€éšŽå±¤ãŒæ·±ã™ãŽã¾ã™)\n"; } if(!defined($path)) { $path = $this->{basepath}; $path .= '/' if($path !~ m,/$,); } my $basedir = $path; $basedir =~ s,[^/]+$,,; # <!include>ã‚’å‡¦ç† $str =~ s{<!include:(.+?)>}{ my $filepath = $1; $filepath = __rel2abs($filepath, $basedir); $this->_checkPathIsAcceptable($filepath); $this->{loadfile}{$filepath} = 1; my $includestr = $TL->readTextFile($filepath, $icode); $includestr = $this->_expandInclude($inccount, $includestr, $filepath); $includestr }eg; $str; } sub setTemplate { my $this = shift; my $str = shift; if(!defined($str)) { die __PACKAGE__."#setTemplate: arg[1] is not defined. (第1å¼•æ•°ãŒæŒ‡å®šã•れã¦ã„ã¾ã›ã‚“)\n"; } elsif(ref($str)) { die __PACKAGE__."#setTemplate: arg[1] is a reference. (第1引数ãŒãƒªãƒ•ァレンスã§ã™)\n"; } my $inccount = 0; $str = $this->_expandInclude(\$inccount, $str); $this->{root}->_setTemplate($str); $TL->getDebug->_templateLog( node => $this->{root}, type => 'set' ); $this; } sub loadTemplate { my $this = shift; my $filepath = shift; my $icode = shift; if(!defined($filepath)) { die __PACKAGE__."#loadTemplate: arg[1] is not defined. (第1å¼•æ•°ãŒæŒ‡å®šã•れã¦ã„ã¾ã›ã‚“)\n"; } elsif(ref($filepath)) { die __PACKAGE__."#loadTemplate: arg[1] is a reference. (第1引数ãŒãƒªãƒ•ァレンスã§ã™)\n"; } $filepath = __rel2abs($filepath, $this->{basepath}); $this->_checkPathIsAcceptable($filepath); my $str = $TL->readTextFile($filepath, $icode); my $inccount = 0; $str = $this->_expandInclude(\$inccount, $str, $filepath, $icode); $this->{root}->_setTemplate($str); $TL->getDebug->_templateLog( node => $this->{root}, type => 'load' ); $this; } sub existsFile { my $this = shift; my $filepath = shift; if(!defined($filepath)) { die __PACKAGE__."#existsFile: arg[1] is not defined. (第1å¼•æ•°ãŒæŒ‡å®šã•れã¦ã„ã¾ã›ã‚“)\n"; } elsif(ref($filepath)) { die __PACKAGE__."#existsFile: arg[1] is a reference. (第1引数ãŒãƒªãƒ•ァレンスã§ã™)\n"; } $filepath = __rel2abs($filepath, $this->{basepath}); -e $filepath; } sub DESTROY { my $this = shift; defined $this->{root} and $this->{root}->_finalize; $this->{root} = undef; } sub isRoot { my $this = shift; $this->{root}->isRoot(@_); } sub getHtml { my $this = shift; $this->{root}->getHtml(@_); } sub setHtml { my $this = shift; $this->{root}->setHtml(@_); $this; } sub isXHTML { my $this = shift; $this->{root}->isXHTML(@_); } sub node { my $this = shift; $this->{root}->node(@_); } sub exists { my $this = shift; $this->{root}->exists(@_); } sub setAttr { my $this = shift; $this->{root}->setAttr(@_); $this; } sub expand { my $this = shift; $this->{root}->expand(@_); $this; } sub expandAny { my $this = shift; $this->{root}->expandAny(@_); $this; } sub toStr { my $this = shift; $this->{root}->toStr(@_); } sub getForm { my $this = shift; $this->{root}->getForm(@_); } sub setForm { my $this = shift; $this->{root}->setForm(@_); $this; } sub extForm { my $this = shift; $this->{root}->extForm(@_); $this; } sub addHiddenForm { my $this = shift; $this->{root}->addHiddenForm(@_); $this; } sub flush { my $this = shift; $this->{root}->flush(@_); $this; } sub addSessionCheck { my $this = shift; $this->{root}->addSessionCheck(@_); $this; } __END__ =encoding utf-8 =head1 NAME Tripletail::Template - テンプレート =head1 SYNOPSIS my $t = $TL->newTemplate ->setTemplate(qq{ <html> <title><&TITLE></title> <!begin:LOOP> <&LINE><br> <!end:LOOP> </html> }); $t->expandAny(TITLE => 'Title'); $t->node('LOOP')->add(LINE => 'line 1'); $t->node('LOOP')->add(LINE => 'line 2'); my $str = $t->toStr; # $str: # <html> # <title>Title</title> # # # line 1<br> # # line 2<br> # # </html> =head1 DESCRIPTION コードã¨ãƒ‡ã‚¶ã‚¤ãƒ³ã‚’分離ã™ã‚‹ãŸã‚ã®ãƒ†ãƒ³ãƒ—レートを扱ã†ã‚¯ãƒ©ã‚¹ã§ã™ã€‚ HTMLやメールã®åŽŸç¨¿ã‚’ãƒ†ãƒ³ãƒ—ãƒ¬ãƒ¼ãƒˆã¨ã—ã¦ãƒ—ãƒã‚°ãƒ©ãƒ 外部㫠用æ„ã—ã€ã‚³ãƒ¼ãƒ‰ã¨ãƒ‡ã‚¶ã‚¤ãƒ³ã‚’分離ã™ã‚‹ã‚ˆã†ã«ã—ã¾ã™ã€‚ =head2 ãƒ†ãƒ³ãƒ—ãƒ¬ãƒ¼ãƒˆæ›¸å¼ =over 4 =item ブãƒãƒƒã‚¯ã‚¿ã‚° <!begin:????> .... <!end:????> beginã¨endã§å›²ã¾ã‚ŒãŸéƒ¨åˆ†ã‚’ノードã¨ã—ã¾ã™ã€‚ ???? 部分ã¯ã€åŒã˜éšŽå±¤ã®ãƒŽãƒ¼ãƒ‰ã§ãƒ¦ãƒ‹ãƒ¼ã‚¯ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“。 ã¾ãŸã€begin/end ãŒäº¤å·®ã—ãŸã‚Šã€å¯¾å¿œãŒå–れã¦ã„ãªã„ã“ã¨ãŒç„¡ã„よ ã†ã«æ³¨æ„ã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“。 ノードã¨ã—ã¦æŒ‡å®šã•れãŸãƒ–ãƒãƒƒã‚¯ã«å¯¾ã—ã¦ã¯ã€node メソッドを使用 ã—ã¦ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã“ã¨ãŒå‡ºæ¥ã¾ã™ã€‚ ã¾ãŸã€Template::Node クラス㮠add メソッドを呼ã¶ã“ã¨ã§ã€ãƒŽãƒ¼ãƒ‰ を繰り返ã—ã¦å±•é–‹ã™ã‚‹ã“ã¨ãŒå¯èƒ½ã§ã™ã€‚ =item 展開タグ <&????> expand/add メソッドã§ã€æ–‡å—列を展開ã™ã‚‹å ´æ‰€ã‚’指定ã—ã¾ã™ã€‚ =item Includeã‚¿ã‚° <!include:????> ã‚¿ã‚°ã®ã‚ã‚‹å ´æ‰€ã«ã€æŒ‡å®šã•れãŸãƒ•ァイルをèªã¿è¾¼ã¿ã€å±•é–‹ã—ã¾ã™ã€‚ ファイルã¯ã€æœ€å¾Œã« loadTemplate ã—ãŸãƒ•ァイルåã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª ã‹ã‚‰ã®ç›¸å¯¾ãƒ‘スã¨ã—ã¦æ‰±ã‚れã¾ã™ã€‚ loadTemplate ãŒå‘¼ã°ã‚Œã¦ã„ãªã„å ´åˆã¯ã€ã‚«ãƒ¬ãƒ³ãƒˆãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‹ã‚‰ ã®ç›¸å¯¾ãƒ‘スã¨ã—ã¦æ‰±ã‚れã¾ã™ã€‚ Includeã‚¿ã‚°ã¯ãƒã‚¹ãƒˆã—ã¦ä½¿ç”¨å¯èƒ½ã§ã™ãŒã€è‡ªåˆ†è‡ªèº«ã‚’èªã¿è¾¼ã‚€ã¨ 永久ループã™ã‚‹ã“ã¨ã«ãªã‚‹ã®ã§ä½¿ç”¨ã«ã¯æ³¨æ„ãŒå¿…è¦ã§ã™ã€‚ =item コピータグ <!copy:????> ????ã¯æ—¢å˜ã®ãƒŽãƒ¼ãƒ‰åを指ã—ã¾ã™ã€‚ <!begin:????> .... <!end:????> ã§å›²ã¾ã‚ŒãŸéƒ¨åˆ†ã®ã‚³ãƒ”ãƒ¼ã‚’åˆ¥ã® å ´æ‰€ã«å±•é–‹ã—ã¾ã™ã€‚ <!copy:????> ã‚¿ã‚°ã¯ã€<!begin:????> .... <!end:????> ã¨åŒã˜ 階層ã«å˜åœ¨ã—ã€ã‹ã¤ã‚³ãƒ”ー元ã®ãƒ–ãƒãƒƒã‚¯ã‚ˆã‚Šå¾Œã‚ã«ä½ç½®ã—ãªã‘れ㰠ãªã‚Šã¾ã›ã‚“。 ãŸã ã—ã€"flush" を使用ã—ãªã„å ´åˆã¯ã€ã‚³ãƒ”ー元ã®ãƒ–ãƒãƒƒã‚¯ã‚ˆã‚Š æ‰‹å‰ã«ã‚ã£ã¦ã‚‚å•題ã‚りã¾ã›ã‚“。 =back =head2 åˆ©ç”¨ä¸Šã®æ³¨æ„ テンプレートクラスã«ã¯ã€å˜ç´”ã«å±•開処ç†ã‚’行ã†ç³»çµ±ã®ãƒ¡ã‚½ãƒƒãƒ‰ã¨ã€ HTMLã®å†…容を解釈ã—ã¦å‡¦ç†ã‚’行ã†ç³»çµ±ã®ãƒ¡ã‚½ãƒƒãƒ‰ãŒã‚りã¾ã™ã€‚ 展開タグやブãƒãƒƒã‚¯ã‚’扱ㆠexpand/add メソッドã¯ã©ã®ã‚ˆã†ãª テã‚ストデータã«å¯¾ã—ã¦ã‚‚処ç†ã‚’行ã†ã“ã¨ãŒã§ãã¾ã™ã®ã§ã€ ã“れらã®ãƒ¡ã‚½ãƒƒãƒ‰ã‚’呼ã³å‡ºã™ã¨ãã«æ£ã—ã„HTMLå½¢å¼ã§ã¯ãªãã¦ã‚‚ 動作ã—ã¾ã™ã€‚ ãŸã¨ãˆã°ã€ä»¥ä¸‹ã®ã‚ˆã†ãªHTMLã«å¯¾ã—ã€expand/addメソッド㯠æ£å¸¸ã«åˆ©ç”¨ã§ãã¾ã™ã€‚ <select name="type"> <!begin:item> <option value="<&ID>" <&SELECTED>><&NAME></option> <!end:item> </select> expand/addメソッドを使ã£ã¦ã€ä¸Šè¨˜ã®HTMLã‚’æ£å¸¸ãªå½¢ã«åŠ å·¥ã—ãŸå¾Œã§ã‚れã°ã€ HTMLã®å†…容を解釈ã—ã¦å‡¦ç†ã‚’行ã†ç³»çµ±ã®ãƒ¡ã‚½ãƒƒãƒ‰ï¼ˆsetFormã‚„addHiddenFormãªã©ï¼‰ã‚’利用ã§ãã¾ã™ã€‚ ãŸã¨ãˆã°ã€ä»¥ä¸‹ã®ã‚ˆã†ãªHTMLã«åŠ å·¥å¾Œã«ã€setFormã‚„addHiddenFormã‚’ 呼ã¶ã“ã¨ã¯å•題ãŒã‚りã¾ã›ã‚“。 <select name="type"> <option value="1" SELECTED>ã„ã¡ã”</option> <option value="2" >ã‚‚ã‚‚</option> <option value="3" >ãªã—</option> </select> ã—ã‹ã—ã€expand/addメソッドã«ã‚ˆã‚‹åŠ å·¥ã‚’è¡Œã†å‰ã®HTMLã«å¯¾ã—ã¦ã€ setFormã‚„addHiddenFormãªã©ã‚’利用ã™ã‚‹ã¨ã€æ£ã—ã„HTMLå½¢å¼ã§ã¯ãªã„ãŸã‚〠内容ã®è§£é‡ˆãŒæ£ã—ã行ãˆãšã€æ„図ã—ãªã„çµæžœã¨ãªã‚‹ã“ã¨ãŒã‚りã¾ã™ã€‚ =head2 METHODS =over 4 =item $TL->newTemplate $t = $TL->newTemplate $t = $TL->newTemplate($filepath) $t = $TL->newTemplate($filepath, $icode) Tripletail::Template オブジェクトを作æˆã€‚ 引数ãŒã‚れã°ã€ãã®å¼•æ•°ã§ loadTemplate ãŒå®Ÿè¡Œã•れる。 =item loadTemplate $t->loadTemplate($filepath) $t->loadTemplate($filepath, $icode) 指定ã•れãŸãƒ•ァイルをテンプレートã¨ã—ã¦èªã¿è¾¼ã‚€ã€‚ $icode ãŒçœç•¥ã•れãŸå ´åˆã¯ 'auto' æ–‡å—コード自動判別ã¨ãªã‚‹ã€‚ 指定ã§ãã‚‹æ–‡å—コードã¯ã€UTF-8,Shift_JIS,EUC-JP,ISO-2022-JP。 ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã¯æ–‡å—コード自動判別ã¨ãªã‚‹ãŒã€ãƒ†ãƒ³ãƒ—レートファイル㫠日本語ãŒã”ãå°‘é‡ã—ã‹å«ã¾ã‚Œãªã„å ´åˆã¯ã€æ£ã—ã判定ã§ããªã„ã“ã¨ãŒã‚る。 自動判別ã¯UTF-8よりShift_JISを優先ã™ã‚‹ã®ã§ã€ãƒ†ãƒ³ãƒ—レートファイル㯠Shift_JISコードã§ä½œæˆã™ã‚‹ã“ã¨ã‚’推奨ã™ã‚‹ã€‚ =item existsFile $t->existsFile($filepath) 指定ã•れãŸãƒ•ァイルãŒå˜åœ¨ã™ã‚‹ãªã‚‰1ã‚’ã€ã—ãªã„ãªã‚‰undefã‚’è¿”ã™ã€‚ loadTemplate ã«å…ˆç«‹ã£ã¦ãƒ†ãƒ³ãƒ—レートファイルãŒå˜åœ¨ã™ã‚‹ã‹ã©ã†ã‹ç¢ºèªã—ãŸã„å ´åˆã«ä½¿ç”¨ã™ã‚‹ã€‚ =item setTemplate $t->setTemplate($str) 指定ã•ã‚ŒãŸæ–‡å—列をテンプレートã¨ã—ã¦ã‚»ãƒƒãƒˆã™ã‚‹ã€‚ =item node $child = $t->node($nodename) 指定ã•れãŸãƒŽãƒ¼ãƒ‰åã®ãƒŽãƒ¼ãƒ‰ã‚ªãƒ–ジェクトを返ã™ã€‚ å˜åœ¨ã—ãªã„ノードåãŒè¦æ±‚ã•れãŸã‚‰ã‚¨ãƒ©ãƒ¼ã€‚ 通常ã®Tripletail::Templateオブジェクトã¨ãƒŽãƒ¼ãƒ‰ã‚ªãƒ–ジェクトã®é•ã„ã¯æ¬¡ã®é€šã‚Šã€‚ =over 8 =item loadTemplateメソッド利用ä¸å¯èƒ½ =item addメソッド利用å¯èƒ½ =back =item exists $t->exists($nodename) 指定ã•れãŸåå‰ã‚’æŒã¤ãƒŽãƒ¼ãƒ‰ãŒå˜åœ¨ã™ã‚‹ãªã‚‰1ã‚’ã€ã—ãªã„ãªã‚‰undefã‚’è¿”ã™ã€‚ =item setAttr $t->setAttr(\%hash) $t->setAttr(%hash) expand/addãƒ¡ã‚½ãƒƒãƒ‰ã§æ¸¡ã™ãƒ‡ãƒ¼ã‚¿ã®å±•開方法を指定ã™ã‚‹ã€‚ 指定ãŒãªã„ã‚‚ã®ã¯ plain 指定ã¨ã¿ãªã™ã€‚ =over 8 =item plain ã¾ãŸã¯æŒ‡å®šç„¡ã— L<< $TL->escapeTag|Tripletail/"escapeTag" >> ã‚’é©ç”¨å¾Œã€å‡ºåŠ›ã™ã‚‹ =item br L<< $TL->escapeTag|Tripletail/"escapeTag" >> ã‚’é©ç”¨å¾Œã€ 改行ã®å‰ã« E<lt>brE<gt> ã‚‚ã—ã㯠E<lt>br /E<gt> を挿入ã—ã€å‡ºåŠ›ã™ã‚‹ã€‚ =item raw ãã®ã¾ã¾å‡ºåŠ›ã™ã‚‹ =item js L<< $TL->escapeJs|Tripletail/"escapeJs" >> ã‚’é©ç”¨å¾Œã€å‡ºåŠ›ã™ã‚‹ =item jsstring L<< $TL->escapeJsString|Tripletail/"escapeJsString" >> ã‚’é©ç”¨å¾Œã€å‡ºåŠ›ã™ã‚‹ =back =item expand $t->expand(\%hash) $t->expand(%hash) 指定ã•れãŸãƒãƒƒã‚·ãƒ¥ã®ãƒ‡ãƒ¼ã‚¿ã‚’å…ƒã«ã€å±•開タグを展開ã™ã‚‹ã€‚ 渡ã•れãŸãƒãƒƒã‚·ãƒ¥ã®ã‚ーã®ä¸ã«ã€å±•é–‹ã‚¿ã‚°ãŒå˜åœ¨ã—ãªã„ã‚‚ã®ãŒã‚ã£ã¦ã‚‚ エラーã«ã¯ãªã‚‰ãªã„。 一回ã®expandã®å‘¼ã³å‡ºã—ã§æœªå±•é–‹ã®ã‚¿ã‚°ãŒæ®‹ã£ãŸå ´åˆã¯ã‚¨ãƒ©ãƒ¼ã¨ãªã‚‹ã€‚ =item expandAny $t->expandAny(\%hash) $t->expandAny(%hash) expandã¨åŒæ§˜ã ãŒã€ãƒ†ãƒ³ãƒ—ãƒ¬ãƒ¼ãƒˆã«æœªå±•é–‹ã®ã‚¿ã‚°ãŒã‚ã£ã¦ã‚‚エラーã¨ã—ãªã„。 但ã—ã€toStrを行ã†ã¾ã§ã«ã¯å…¨ã¦ã®ã‚¿ã‚°ã‚’展開ã™ã‚‹å¿…è¦æ€§ãŒã‚る。 =item add $t->node('foo')->add $t->node('foo')->add(\%hash) $t->node('foo')->add(%hash) ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã¯ãƒŽãƒ¼ãƒ‰ã‚ªãƒ–ジェクトã§ã®ã¿åˆ©ç”¨å¯èƒ½ã€‚ åãƒŽãƒ¼ãƒ‰ã‚’è¦ªãƒŽãƒ¼ãƒ‰ã«æŒ¿å…¥ã™ã‚‹ã€‚ ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ãŒå‘¼ã°ã‚ŒãŸå¾Œã¯ã€åノードã¯å±•é–‹å‰ã®çŠ¶æ…‹ã«æˆ»ã‚‹ã€‚ å¼•æ•°ãŒæŒ‡å®šã•れãŸå ´åˆã¯è¦ªãƒŽãƒ¼ãƒ‰ã¸ã®æŒ¿å…¥å‰ã« expand ã•れる。 =item getForm $form = $t->getForm($name) HTMLテンプレートä¸ã®ãƒ•ォームを解æžã—ã€ä¸ã«ã‚»ãƒƒãƒˆã•れã¦ã„ã‚‹ データを L<Tripletail::Form> オブジェクトã®å½¢å¼ã§å–り出ã™ã€‚ 引数ã¯ãƒ•ォーム㮠name="..." ã§æŒ‡å®šã•れるåå‰ã€‚ çœç•¥ã•れãŸå ´åˆã¯ã€name属性ã®å˜åœ¨ã—ãªã„formè¦ç´ ãŒå–り出ã•れる。 対象ã¨ãªã‚‹ãƒŽãƒ¼ãƒ‰ã® HTML ã‚¿ã‚°ã®å†…éƒ¨ã«æœªç½®æ›ã®ã‚¿ã‚°ãŒã‚ã£ãŸå ´åˆã¯ã‚¨ãƒ©ãƒ¼ã¨ãªã‚‹ã€‚ =item setForm $t->setForm($form) $t->setForm($form, $name) $t->setForm($hashref) $t->setForm($hashref, $name) 渡ã•れ㟠L<Tripletail::Form> オブジェクトをã€HTMLテンプレートä¸ã®ãƒ•ォーム㫠展開ã™ã‚‹ã€‚ L<Tripletail::Form>オブジェクトã®ä»£ã‚りã«ãƒãƒƒã‚·ãƒ¥ã®ãƒªãƒ•ァレンスを渡ã™ã“ã¨ã‚‚出æ¥ã‚‹ã€‚ ãƒãƒƒã‚·ãƒ¥ã®ãƒªãƒ•ァレンスを渡ã—ãŸå ´åˆã¯ã€$TL->newForm($hashref) ã—ãŸçµæžœã®ãƒ•ォームオブジェクトをセットã™ã‚‹ã€‚ 第2引数ã¯ãƒ•ォーム㮠name="..." ã§æŒ‡å®šã•れるåå‰ã€‚ çœç•¥ã•れãŸå ´åˆã¯ã€name属性ã®å˜åœ¨ã—ãªã„formè¦ç´ ãŒå¯¾è±¡ã¨ãªã‚‹ã€‚ テンプレートã«å˜åœ¨ã—ã€ãƒ•ォームオブジェクトã«å˜åœ¨ã—ãªã„ ã‚ーãŒã‚ã£ãŸã‚Šã€ãã®é€†ã®çŠ¶æ…‹ã®ã‚ーãŒå˜åœ¨ã—ã¦ã‚‚〠エラーç‰ã¯ç™ºç”Ÿã—ãªã„。 テンプレートã«å˜åœ¨ã—ã¦ã€ãƒ•ォームオブジェクトã«å˜åœ¨ ã—ãªã„ã‚ーã®é–¢ã—ã¦ã¯ã€ãƒ†ãƒ³ãƒ—レートã®å…ƒã®ãƒ‡ãƒ¼ã‚¿ãŒ ä¿å˜ã•れる。 対象ã¨ãªã‚‹ãƒŽãƒ¼ãƒ‰ã® HTML ã‚¿ã‚°ã®å†…éƒ¨ã«æœªç½®æ›ã®ã‚¿ã‚°ãŒã‚ã£ãŸå ´åˆã¯ã‚¨ãƒ©ãƒ¼ã¨ãªã‚‹ã€‚ =item extForm $t->extForm $t->extForm($name) HTMLテンプレートä¸ã®ãƒ•ォームãŒå¤–部アプリケーションã«å¯¾ã™ã‚‹ã‚‚ã®ã§ã‚ã‚‹ã“ã¨ã‚’指定ã™ã‚‹ã€‚ 第1引数ã¯ãƒ•ォーム㮠name="..." ã§æŒ‡å®šã•れるåå‰ã€‚ çœç•¥ã•れãŸå ´åˆã¯ã€name属性ã®å˜åœ¨ã—ãªã„formè¦ç´ ãŒå¯¾è±¡ã¨ãªã‚‹ã€‚ 通常ã®ãƒ•ォームã¯TLフレームワークã«å¯¾ã™ã‚‹ã‚‚ã®ã¨ã—ã¦ã€ã„ãã¤ã‹ã®æ“作ãŒè¡Œã‚れるãŒã€ extForm を行ã£ãŸå ´åˆã¯ãã‚Œã‚‰ã®æ“作を行ã‚ãªã„。 対象ã¨ãªã‚‹ãƒŽãƒ¼ãƒ‰ã® HTML ã‚¿ã‚°ã®å†…éƒ¨ã«æœªç½®æ›ã®ã‚¿ã‚°ãŒã‚ã£ãŸå ´åˆã¯ã‚¨ãƒ©ãƒ¼ã¨ãªã‚‹ã€‚ =item addHiddenForm $t->addHiddenForm($form) $t->addHiddenForm($form, $name) $t->addHiddenForm($hashref) $t->addHiddenForm($hashref, $name) 渡ã•れ㟠L<Tripletail::Form> オブジェクトをã€HTMLテンプレートä¸ã®ãƒ•ォーム㫠E<lt>input type="hidden"E<gt> è¦ç´ ã¨ã—ã¦è¿½åŠ ã™ã‚‹ã€‚ L<Tripletail::Form>オブジェクトã®ä»£ã‚りã«ãƒãƒƒã‚·ãƒ¥ã®ãƒªãƒ•ァレンスを渡ã™ã“ã¨ã‚‚出æ¥ã‚‹ã€‚ ãƒãƒƒã‚·ãƒ¥ã®ãƒªãƒ•ァレンスを渡ã—ãŸå ´åˆã¯ã€$TL->newForm($hashref) ã—ãŸçµæžœã®ãƒ•ã‚©ãƒ¼ãƒ ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’è¿½åŠ ã™ã‚‹ã€‚ 第2引数ã¯ãƒ•ォーム㮠name="..." ã§æŒ‡å®šã•れるåå‰ã€‚ çœç•¥ã•れãŸå ´åˆã¯ã€name属性ã®å˜åœ¨ã—ãªã„formè¦ç´ ãŒå¯¾è±¡ã¨ãªã‚‹ã€‚ 渡ã•れãŸãƒ•ォームデータã®å…¨ã¦ã®ã‚ーãŒhiddenã¨ã—ã¦è¿½åŠ ã•れる。 æ—¢å˜ã®å€¤ã«ä¸Šæ›¸ãã¯ã•れãšã€ å˜ç´”ã«è¿½åŠ ã•れる。 対象ã¨ãªã‚‹ãƒŽãƒ¼ãƒ‰ã® HTML ã‚¿ã‚°ã®å†…éƒ¨ã«æœªç½®æ›ã®ã‚¿ã‚°ãŒã‚ã£ãŸå ´åˆã¯ã‚¨ãƒ©ãƒ¼ã¨ãªã‚‹ã€‚ =item addSessionCheck $t->addSessionCheck($sessiongroup) $t->addSessionCheck($sessiongroup, $name) $t->addSessionCheck($sessiongroup, $name, $issecure) 指定ã—ãŸã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚°ãƒ«ãƒ¼ãƒ—ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³IDを利用ã—ãŸã‚ーをフォームã«åŸ‹ã‚込む。 埋ã‚込むフォームã¯POSTメソッドã§ãªã‘れã°ã‚¨ãƒ©ãƒ¼ã¨ãªã‚‹ã€‚ ã¾ãŸã€äº‹å‰ã«ã‚»ãƒƒã‚·ãƒ§ãƒ³IDを発行(Sessionクラスã®setValue)ã—ã¦ãªã‘れã°ã‚¨ãƒ©ãƒ¼ã¨ãªã‚‹ã€‚ $CGI->haveSessionCheck ã¨ãƒšã‚¢ã§ä½¿ç”¨ã™ã‚‹ã€‚ 指定ã—ãŸã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚°ãƒ«ãƒ¼ãƒ—ã®Iniã§è¨å®šã™ã‚‹csrfkeyã‚’å¿…è¦ã¨ã™ã‚‹ã€‚未è¨å®šã®å ´åˆã‚¨ãƒ©ãƒ¼ã¨ãªã‚‹ã€‚ csrfkeyã¨ã‚»ãƒƒã‚·ãƒ§ãƒ³IDを利用ã—ã¦ã‚ーを作æˆã™ã‚‹ç‚ºã€csrfkeyã¯ã‚µã‚¤ãƒˆæ¯Žã«é•ã†å€¤ã‚’用ã„ã€å¤–éƒ¨ã«æ¼ã‚Œãªã„よã†ã«ã™ã‚‹äº‹ã€‚ 第2引数ã¯ãƒ•ォーム㮠name="..." ã§æŒ‡å®šã•れるåå‰ã€‚ çœç•¥ã‚‚ã—ãã¯undefãŒæŒ‡å®šã•れãŸå ´åˆã¯ã€name属性ã®å˜åœ¨ã—ãªã„formè¦ç´ ãŒå¯¾è±¡ã¨ãªã‚‹ã€‚ 使用ä¸ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã® mode ㌠'double' ã®å ´åˆã¯ã€ 第3引数㫠0 ã¾ãŸã¯ 1 を指定ã™ã‚‹ã¨ã€httpå´ã€httpså´ã‚’指定ã§ãる。 çœç•¥ã—ãŸå ´åˆã¯ã€ãã®ã¨ãã®é€šä¿¡ãŒ http/https ã®ã©ã¡ã‚‰ã§ã‚ã‚‹ã‹ã«ã‚ˆã£ã¦é¸æŠžã•れる。 対象ã¨ãªã‚‹ãƒŽãƒ¼ãƒ‰ã® HTML ã‚¿ã‚°ã®å†…éƒ¨ã«æœªç½®æ›ã®ã‚¿ã‚°ãŒã‚ã£ãŸå ´åˆã¯ã‚¨ãƒ©ãƒ¼ã¨ãªã‚‹ã€‚ =item getHtml $html = $t->getHtml 特定ã®ãƒŽãƒ¼ãƒ‰ã®ç¾åœ¨ã®å†…容を返ã™ã€‚ç½®æ›æ¸ˆã¿ã®ã‚¿ã‚°ã¯ç½®æ›ã•れã¦ãŠã‚Šã€æœªç½®æ› ã®ã‚¿ã‚°ã¯æœªç½®æ›ã®ã¾ã¾æ®‹ã£ã¦ã„る。 =item setHtml $t->setHtml($html) 特定ã®ãƒŽãƒ¼ãƒ‰ã®ç¾åœ¨ã®å†…容を変更ã™ã‚‹ã€‚L</getHtml> ã¨é€†ã®åƒãã‚’ã™ã‚‹ã€‚ =item flush $t->flush ノードã®å ´åˆã€ãã®ãƒŽãƒ¼ãƒ‰ã®çµ‚端ã¾ã§ã‚’ L<出力|Tripletail/"print"> ã™ã‚‹ã€‚ Templateã®å ´åˆã€å…¨ä½“を出力ã™ã‚‹ã€‚ ãƒ†ãƒ³ãƒ—ãƒ¬ãƒ¼ãƒˆã®æœ€åˆã‹ã‚‰é †ã«flushã—ã¦ã„ã‹ãªã„ã¨ã€ãƒ†ãƒ³ãƒ—レート㮠一部分ãŒé‡è¤‡å‡ºåŠ›ã•れるã®ã§æ³¨æ„ãŒå¿…è¦ã€‚ =item trim $t->trim() C<< <!begin:????> >>, C<< <!end:????> >> ã‚¿ã‚°å‰å¾Œã®ç©ºç™½ã‚’削除ã™ã‚‹ã€‚ ã‚る行ã«ã‚¿ã‚°ã®ã¿ãŒæ›¸ã‹ã‚Œã¦ã„ãŸå ´åˆã«ã€è¡Œã”ã¨å–り除ã‹ã‚ŒãŸã‚ˆã†ã«ã¿ãˆã‚‹ã€‚ =item toStr $str = $t->toStr テンプレート(å±•é–‹çµæžœ)ã‚’æ–‡å—列ã¨ã—ã¦è¿”ã™ã€‚ =item isRoot $is_root = $t->isRoot ノードã®å ´åˆã¯ undef ã‚’è¿”ã—ã€Template ã®å ´åˆã¯ 1 ã‚’è¿”ã™ã€‚ =item isXHTML $is_xhtml = $t->isXHTML テンプレート㌠XHTML ã®ã‚ˆã†ã«è¦‹ãˆã‚‹å ´åˆã¯ 1 ã‚’ã€ãã†ã§ãªã„å ´åˆã¯ undef ã‚’è¿”ã™ã€‚厳密ãªãƒã‚§ãƒƒã‚¯ã¯è¡Œã‚ãªã„。 =back =head2 Ini パラメータ グループå㯠"Template" ã§ãªã‘れã°ãªã‚‰ãªã„。 例: [Template] basepath = /home/www/template/ =over 4 =item basepath basepath = /home/www/template/ 相対パス指定時ã«åŸºæº–ã¨ãªã‚‹ãƒ‘ス。çœç•¥å¯èƒ½ã€‚ デフォルト㯠"." 。 ã™ãªã‚ã¡ã‚«ãƒ¬ãƒ³ãƒˆãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã€‚ =item rootpath rootpath = /home/www/ 特定ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªéšŽå±¤ã‚ˆã‚Šã‚‚下ä½ã«ã‚るファイルã®ã¿ã€ アクセスを許å¯ã™ã‚‹å ´åˆã«æŒ‡å®šã™ã‚‹ã€‚çœç•¥å¯èƒ½ã€‚ デフォルト㯠"/"。 ã™ãªã‚ã¡å…¨ãƒ•ァイルをテンプレートã¨ã—ã¦ä½¿ç”¨è¨±å¯ã€‚ =item allow_unexpanded_tags allow_unexpanded_tags = true éžæŽ¨å¥¨ã‚ªãƒ—ã‚·ãƒ§ãƒ³ã€‚trueを指定ã—ãŸå ´åˆã€ getForm, setForm, extForm, addHiddenForm, addSessionCheckã‚’ 実行ã™ã‚‹å ´åˆã«ã€ãƒ†ãƒ³ãƒ—ãƒ¬ãƒ¼ãƒˆã«æœªç½®æ›ã® <&ã‚¿ã‚°> ãŒã€ <foo <&tag>> ã®ã‚ˆã†ã« HTML ã‚¿ã‚°ã®å†…部ã«å˜åœ¨ã—ã¦ã„ã¦ã‚‚〠エラーã«ãªã‚‰ãªã„よã†ã«ãªã‚‹ã€‚ ã“ã®ã‚ªãƒ—ションを有効ã«ã—ãŸå ´åˆã€<foo <&tag>> ã®ã‚ˆã†ãªã‚¿ã‚°ãŒ テンプレートä¸ã«å˜åœ¨ã—ã¦ã„ãŸå ´åˆã€ã‚¿ã‚°ãŒæ£å¸¸ã«å±•é–‹ã•れãšã€ ç ´å£Šã•れるæã‚ŒãŒã‚る為ã€ä½¿ç”¨ã™ã‚‹éš›ã¯æ³¨æ„ã—ã¦ä¸‹ã•ã„。 =back =head2 flush サンプル =head3 ソースコード $TL->setContentFilter('Tripletail::Filter::Binary'); my $t = $TL->newTemplate->setTemplate( qq{This is a header. <!begin:AAA> node AAA begins... <!begin:BBB> node BBB begins... <!begin:CCC> value of node CCC: <&val> <!end:CCC> node BBB ends... <!end:BBB> <!end:AAA> This is a footer. }); print "\n#--- node('CCC')->add; (twice)\n"; $t->node('AAA')->node('BBB')->node('CCC')->add( val => 100, ); $t->node('AAA')->node('BBB')->node('CCC')->add( val => 200, ); print "\n#--- node('CCC')->flush;\n"; $t->node('AAA')->node('BBB')->node('CCC')->flush; print "\n#--- node('BBB')->add;\n"; $t->node('AAA')->node('BBB')->add; print "\n#--- node('CCC')->add;\n"; $t->node('AAA')->node('BBB')->node('CCC')->add( val => 200, ); print "\n#--- node('CCC')->flush;\n"; $t->node('AAA')->node('BBB')->node('CCC')->flush; print "\n#--- node('BBB')->add;\n"; $t->node('AAA')->node('BBB')->add; print "\n#--- node('AAA')->add;\n"; $t->node('AAA')->add; print "\n#--- root->flush;\n"; $t->flush; =head3 å®Ÿè¡Œçµæžœ #--- node('CCC')->add; (twice) #--- node('CCC')->flush; Content-Type: application/octet-stream This is a header. node AAA begins... node BBB begins... value of node CCC: 100 value of node CCC: 200 #--- node('BBB')->add; #--- node('CCC')->add; #--- node('CCC')->flush; node BBB ends... node BBB begins... value of node CCC: 200 #--- node('BBB')->add; #--- node('AAA')->add; #--- root->flush; node BBB ends... This is a footer. =head1 SEE ALSO L<Tripletail> =head1 AUTHOR INFORMATION =over 4 Copyright 2006 YMIRLINK Inc. This framework is free software; you can redistribute it and/or modify it under the same terms as Perl itself ã“ã®ãƒ•レームワークã¯ãƒ•リーソフトウェアã§ã™ã€‚ã‚ãªãŸã¯ Perl ã¨åŒã˜ãƒ©ã‚¤ã‚»ãƒ³ã‚¹ã® å…ƒã§å†é…布åŠã³å¤‰æ›´ã‚’行ã†ã“ã¨ãŒå‡ºæ¥ã¾ã™ã€‚ Address bug reports and comments to: tl@tripletail.jp HP : http://tripletail.jp/ =back =cut