HTML::Templateでカレンダー出力したい

このQ&Aのポイント
  • Calendar::SimpleとHTML::Templateを利用しtableタグを使ったカレンダー表示を行いたい
  • 1週間ごとに<tr>タグで区切るループの記載の仕方がわからない
  • baseサブルーチンでは1週間ごとに<tr>タグで区切られたきれいなカレンダー表示がされるが、myplanサブルーチンでは日にちの数字が1週間ごとに区切られずに横並びとなってしまっている
回答を見る
  • ベストアンサー

HTML::Templateでカレンダー出力したい

Calendar::SimpleとHTML::Templateを利用しtableタグを使ったカレンダー表示を行いたいのですが、1週間ごとに<tr>タグで区切るループの記載の仕方がわかりません。 見本にした他所様のbaseサブルーチンでは1週間ごとに<tr>タグで区切られたきれいなカレンダー表示がされますが、myplanサブルーチンでは現状<tr>タグで区切る部分が作られていないため、日にちの数字が1週間ごとに区切られずにずらっと横並びとなってしまっている状態です。 Calendar::Simple http://perldoc.jp/docs/modules/Calendar-Simple-1.07/Simple.pod HTML::Template http://perldoc.jp/docs/modules/HTML-Template-2.6/HTML/Template.pod baseでの表示 日 月 火 水 木 金 土     1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 現状のmyplanでの表示 日 月 火 水 木 金 土 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 use HTML::Template; use Calendar::Simple; local $cal = calendar; local @caps = qw( 日 月 火 水 木 金 土 ); local @wdays = qw( sunday monday tuesday wednesday thursday friday saturday ); #&base; &myplan; exit; sub base{ print "Content-type: text/html; charset=\"utf8\"\n\n"; print qq|<table>\n|; print qq|<tr>\n|; for (my $i = 0; $i < 7; $i++) { my $cap = $caps[$i]; my $wday = $wdays[$i]; print qq|<th class="$wday">$cap</th>\n|; } print qq|</tr>\n|; foreach my $week ( @$cal ) { print qq|<tr>\n|; for (my $i = 0; $i < 7; $i++) { my $mday = $week->[$i]; my $wday = $wdays[$i]; print qq|<td class="$wday">$mday</td>\n|; } print qq|</tr>\n|; } print qq|</table>\n|; }#end base sub myplan{ for (my $i = 0; $i < 7; $i++) { my %row_data; $row_data{cap} = $caps[$i]; $row_data{wday} = $wdays[$i]; push(@loop_data, \%row_data); } foreach my $week ( @$cal ) { for (my $i = 0; $i < 7; $i++) { my %row_data; $row_data{mday} = $week->[$i]; $row_data{wday} = $wdays[$i]; push(@loop_data_3, \%row_data); } } my $template = HTML::Template->new( filename => "html_template/calender.tmpl", ); $template->param( THIS_LOOP => \@loop_data, THIS_LOOP3 => \@loop_data_3 ); print "Content-type: text/html; charset=\"utf8\"\n\n"; print $template->output; }#end myplan ##calender.tmpl <html> <body> <table> <tr> <TMPL_LOOP NAME=THIS_LOOP> <th class="<TMPL_VAR NAME=wday>"><TMPL_VAR NAME=cap></th> </TMPL_LOOP> </tr> <tr> <TMPL_LOOP NAME=THIS_LOOP3> <td class="<TMPL_VAR NAME=wday>"><TMPL_VAR NAME=mday></td> </TMPL_LOOP> </tr> </table> </body> </html>

  • Perl
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

表示がくずれるので、空白2文字を全角空白にしていることに注意。 use strict; use warnings; use utf8; use CGI; use CGI::Carp qw(fatalsToBrowser); use CGI::Pretty; use HTML::Template; my @week_caps = (   { jp => '日', class => 'sunday' },   { jp => '月', class => 'monday' },   { jp => '火', class => 'tuesday' },   { jp => '水', class => 'wednesday' },   { jp => '木', class => 'thursday' },   { jp => '金', class => 'friday' },   { jp => '土', class => 'saturday' } ); my @calendar = (   [ '', '', 1, 2, 3, 4, 5 ],   [ 6, 7, 8, 9, 10, 11, 12 ],   [ 13, 14, 15, 16, 17, 18, 19 ],   [ 20, 21, 22, 23, 24, 25, 26 ],   [ 27, 28, 29, 30, 31, '', '' ] ); my @month_weeks = (); for my $week (@calendar) {   my @wdays = ();   for my $i ( 0 .. 6 ) {     push @wdays, { class => $week_caps[$i]->{class}, day => $week->[$i] };   }   push @month_weeks, { WDAYS => \@wdays }; } my $template = HTML::Template->new( filehandle => *DATA ); $template->param(   WEEK_CAPS  => \@week_caps,   MONTH_WEEKS => \@month_weeks ); my $q = CGI->new(); print $q->header( -charset => 'UTF-8' ),   $q->start_html( -title => "TEST", -lang => 'ja', ),   $template->output,   $q->end_html; __DATA__ <table>  <tr>   <TMPL_LOOP NAME=WEEK_CAPS>     <th class="<TMPL_VAR NAME=class>"><TMPL_VAR NAME=jp></th>   </TMPL_LOOP>  </tr>  <TMPL_LOOP NAME=MONTH_WEEKS>   <tr>    <TMPL_LOOP NAME=WDAYS>     <td class="<TMPL_VAR NAME=class>"><TMPL_VAR NAME=day></td>    </TMPL_LOOP>   </tr>  </TMPL_LOOP> </table>

perlerz10
質問者

お礼

ありがとうございます。おかげで正常に出力できる様になりました。 休み前に閲覧はできていたのですが、キーボード等テスト環境がそろわずお礼が遅れてしまいました。

関連するQ&A

  • HTML::Templateの初歩的な質問

    HTML::Templateを使用してサイトを構築しようとしてるのですが、うまくいきません。 例1のようにしたいのですが、どこが間違っているかを指摘していただきたく書き込ませて頂きました。 ちなみに例2ではうまく作動しています。 よろしくお願い致します。 サンプルコード ★sample.html★ <TMPL_LOOP name=arr> <p><TMPL_VAR name=val></p> </TMPL_LOOP> ★例1★ my $template = HTML::Template->new(filename => 'sample.html'); @arr = [ {val=>'1'},{val=>'2'},{val=>'3'} ]; $template->param(arr => \@arr); print "Content-Type: text/html\n\n"; print $template->output; ★例2★ my $template = HTML::Template->new(filename => 'sample.html'); $template->param(arr => [ {val=>'1'},{val=>'2'},{val=>'3'} ] ); print "Content-Type: text/html\n\n"; print $template->output;

    • ベストアンサー
    • Perl
  • HTML::Templateのループと配列のハッシュの作成

    下記の?????の所にpushで配列のハッシュを作成しようと考えていましたが、うまくいきません。 下記のソース自体が的外れでしたら申し訳ございません。?????以外の場所も指摘して頂ければ幸いです。 よろしくお願い致します。 <TMPL_LOOP NAME="loop"> <TMPL_VAR NAME="one"><BR> <TMPL_VAR NAME="two"><BR> <TMPL_VAR NAME="three"><BR> </TMPL_LOOP> use HTML::Template; @data = ('aa<>ab<>ac','ba<>bb<>bc','ca<>cb<>cc'); foreach $xxx (@data) { my ($one,$two,$three) = split(/<>/,$xxx); ???????????????????? } my $template = HTML::Template->new(filename=>'sample.html'); $template->param(loop=>\@loop); print "Content-Type: text/html\n\n"; print $template->output;

    • ベストアンサー
    • Perl
  • HTML::TemplateのTMPL_LOOPについて

    PerlモジュールのHTML::Templateを利用していますが、多重ループの書き方がわかりません。 以下のようなループがある場合、どのようにperlを記述したらいいでしょうか。 <TMPL_LOOP NAME=LOOPA> <TMPL_VAR NAME=title> <TMPL_LOOP NAME=LOOP_GUEST> <TMPL_VAR NAME=guest_name> </TMPL_LOOP> <TMPL_VAR NAME=time> </TMPL_LOOP> ドキュメントを見ると下記のように記述するようですが、下記を値それぞれではなく、配列を利用する場合にはどのように記述すれば良いでしょうか。 $template->param(LOOP => [ { name => 'Bobby', nicknames => [ { name => 'the big bad wolf' }, { name => 'He-Man' }, ], }, ], );

    • ベストアンサー
    • Perl
  • HTMLのテーブルにデータを流し込む際のレイアウト

    度々、失礼させていただきます。なにぶん見よう見まねです。 「abc.csv」より条件(1)で抽出した後HTMLのテーブルに並べます。 但しこのままですとHTML上、右に伸びていってしまうので4つぐらいで 新しいテーブルに改行したいのですが、お力お貸しください。 <table> <tr> <td> <?php $Data=file("abc.csv"); for($i=0;$i<sizeof($Data);$i++){ $line=explode(",",$Data[$i]); if($line[0]=="0" && $line[1]=="1"){ //条件(1) print "<td><table><tr>\n" ; print "<td>{$line[2]}</td></tr>" ; print "<tr>" ; print "<td>{$line[4]}</td></tr>" ; print "</table></td>\n" ; } } ?> </td> </tr> </table>

    • ベストアンサー
    • PHP
  • サブルーチンの返値に配列のハッシュ

    いつもお世話になっております。 HTML::Templateを使用する為、サブルーチンの返値に配列のハッシュを入れたいと思っていますが、うまくいきません。 また、myの使い方が分からず、返値までの方法も若干気になります。 よろしくお願い致します。 use HTML::Template; @loop = &loop_make('aa<>ab<>ac','ba<>bb<>bc','ca<>cb<>cc'); my $template = HTML::Template->new(filename=>'sample.html'); $template->param(loop=>\@loop); print "Content-Type: text/html\n\n"; print $template->output; exit; sub loop_make{ @aaa = (); foreach $xxx (@_) { ($one,$two,$three) = split(/<>/,$xxx); push @loop, { one => $one, two => $two, three => $three }; } return \@aaa; }

  • サブルーチンの受け渡しについて

    以前からいろいろな質問をさせて貰い、 沢山の方に助けてもらったことをまず感謝いたします。 sub html1:{ &serch();#ファイル検索 print qq|Content-type: text/html\n\n|; print qq|<HTML><HEAD><TITLE>ファイル選択</TITLE></HEAD><BODY>\n|; print qq|<BODY text="#660000" bgcolor="#f0f0f0" link="#be7e7e" vlink="#c8c891" alink="#b3b3d9">\n|; print qq|<CENTER>\n|; print qq|<FORM action="edit.cgi" method="GET">|; print qq|<TABLE border="1" width="350" height="100">\n|; print qq|<TBODY>\n|; print qq|<TR>\n|; print qq|<TD colspan="4" height="85" align="center" valign="middle" width="300">|; print qq|<center>テキスト編集プログラム</center></TD>|; print qq|</TR>|; print qq|<TR>|; print qq|<TD colspan="4" align="center">ファイルを選択してください。<BR>|; print qq|<BR>|; print qq|<SELECT name="filename" size="1">|; foreach $file(@filelist){ print qq|<OPTION value="$file">$file</OPTION>\n|; } print qq|</SELECT><BR><BR>|; print qq|</TD></TR>|; print qq|<TR>|; print qq|<TD colspan="4" align="center"><INPUT type="submit" value="決定"></TD>|; print qq|</TR>|; print qq|</TBODY>|; print qq|</TABLE>|; print qq|</FORM>|; print qq|</CENTER>|; print qq|</BODY></HTML>\n|; サブルーチンの受け渡しが勉強が良くわからず、まだ勉強不足なので 申し訳ありませんがどうしたら良いのでしょうか? (ここから編集ルーチンにファイル名を送る手段) あとわかりやすい参考になるサイトなど御座いましたらよろしくお願いします。

    • ベストアンサー
    • Perl
  • for文の中でエラーが出てしまいます。

    Perl初心者で、1から勉強始めました。 質問ですが、 #!c:\perl\bin\perl -w use strict; print "Content-type: text/html\n\n"; my %data1 = ( 'id','ID001', 'name','たなか', 'birthday','1970/10/10' ); my %data2 = ( 'id','ID002', 'name','すずき', 'birthday','1972/03/21' ); my %person = (\%data1,\%data2); for (my $i=0; $i<@person; $i++) { my %row = %{$person[$i]}; print "$row{'id'}:$row{'name'}($row{'birthday'}生)<br>\n"; } テキスト通りにやっているつもりですが、のforの中でエラーが出てしまいます。見直してもどこが悪いか分かりません。誰かお暇な方教えてください。お願いします。

    • ベストアンサー
    • Perl
  • PHPによるカレンダーについて

    PHPでカレンダーを作成しています。 プルダウンで年月を指定し、更新ボタンを押せば、指定した年月のカレンダーを表示させたいのですが、うまくいきません。 更新ボタンを押してもカレンダーが変わらないです。 KOMOカレンダーというサイトを参考にして、文字コードを変えただけです。 教えてくださる方がいらっしゃいましたら宜しくお願いいたします。 <?php $last_year = 2037; $wday_color = "#000000"; $sat_color = "#0000ff"; $sun_color = "#ff0000"; $reg_color = "#ffccff"; $year = (!isset($year)) ? date("Y") : $year; $month = (!isset($month)) ? date("n") : $month; ?> <HTML> <HEAD> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <TITLE>カレンダー</TITLE> </HEAD> <BODY> <P><FONT SIZE="6" COLOR="#006600">カレンダー</FONT></P> <P> <TABLE BORDER="1"CELLSPACING="1" CELLPADDING="1"> <TR> <TD COLSPAN="7"> <SELECT NAME="year"> <?php for($i = 2002; $i <= $last_year; $i++){ echo "<option value=".$i.(($i == $year) ? ' selected':'').">".$i."年\n"; } ?> </SELECT> <SELECT NAME="month"> <?php for($i = 1; $i <= 12; $i++){ echo "<option value=" . $i . (($i == $month) ? ' selected':'').">".$i."月\n"; } ?> </SELECT> <INPUT TYPE="SUBMIT" NAME="Submit" VALUE="更新"></TD> </TR> <TR> <TD> <P ALIGN="CENTER"><FONT COLOR="red">日</FONT> </TD> <TD> <P ALIGN="CENTER">月 </TD> <TD> <P ALIGN="CENTER">火 </TD> <TD> <P ALIGN="CENTER">水 </TD> <TD> <P ALIGN="CENTER">木 </TD> <TD> <P ALIGN="CENTER">金 </TD> <TD> <P ALIGN="CENTER"><FONT COLOR="blue">土</FONT> </TD> </TR> <?php $time = mktime(0, 0, 0, $month, 1, $year); $day_of_first = date("w", $time); $date_of_month = date("t", $time); $week_of_month = ceil($date_of_month / 7); if(($date_of_month % 7 > 7 - $day_of_first) || ($date_of_month % 7 == 0 && $day_of_first != 0)){ $week_of_month++; } for($i = 1; $i <= $week_of_month * 7; $i++){ if($i % 7 == 1){ echo "<tr>"; } if(($i - 1 < $day_of_first) || ($i > $date_of_month + $day_of_first)){ echo "<td>&nbsp;</td>"; }else{ if($i % 7 == 1){ $color = $sun_color; }elseif($i % 7 == 0){ $color = $sat_color; }else{ $color = $wday_color; } echo "<td width=30 height=30 align=right valign=top>"; echo "<font color=" . $color . ">"; echo $i - $day_of_first; echo "</font></td>"; } if($i % 7 == 0){ echo "</tr>\n"; } } ?> </TABLE> </FORM> </BODY> </HTML>

    • ベストアンサー
    • PHP
  • セレクトボタンで、サブルーチンを呼び出したいのですが

    宜しくお願いします セレクトボタンで項目を選択して其々別々のサブルーチンを呼び出したいのですが うまく機能しませんどうか宜しく御教授ください。 以下スクリプトです #!/usr/local/bin/perl &header; print qq|<h3>管理モード</h3>\n|; print qq|<li>新規データ追加 データ更新 データ削除 いづれかの処理項目を選んでください</li>\n|; print qq|<form action=\"$myself\" method=\"POST\">\n|; print qq|処理:<select name=action>\n|; print qq|<option value=\"edit\" value=$s>追加\n|; print qq|<option value=\"update\ value=$s">更新\n|; print qq|<option value=\"del\" value=$s>削除</select>\n|; print qq|<input type=submit value='送信する'>\n|; print qq|<P><table border=1 cellspacing=0><tr>\n|; print qq|</body></html>\n|; if ($s eq "edit"){ &edit; } elsif ($s eq "update"){ &update;} elsif ($s eq "del"){ &del;} sub edit { } sub update {; } sub del {; } #--------------# # HTML記述  # #--------------# sub header { print qq|Content-type: text/html\n\n|; print qq|<html>\n<head>\n|; print qq|<META HTTP-EQUIV=\"Content-type\" CONTENT=\"text/html; charset=Shift_JIS\">\n|; print qq|<LINK rel=\"stylesheet\" type=\"text/css\" href=\"./style.css\">\n|; print qq|<title></title></head>\n|; print qq|<body>\n|; }

  • DBのデータをHTMLファイルに出力したい

    こちらで質問することかどうかわからなかったのですが、 よろしくおねがいします。ちがってたら教えてください。 DBに以下のデータがあります。 歌手名         曲名        カテゴリ ケツメイシ      トレイン       バンド DREAMS COME TRUE   やさしいキスをして  バンド 東京事変       キラーチューン    バンド 嵐          Happiness       アイドル 浜崎あゆみ      M           ソロ(女) … このデータをカテゴリ別にHTMLファイルで出力したいです。 表示させるのではなく、出力したいです。 HTMLのテンプレートを作成しておいて、 「バンド」のボタンを押したときに、バンドの曲のリストを、 作成したHTMLのテンプレート(1.html)に はめ込んだ形で出力したいと考えています。 そのようなことがPHPでできるでしょうか。 PHPのファイルに「バンド」「ソロ(女)」のボタンが あるようなファイルを作成したいです。 また出力するときには、ファイル名を指定できるようにしたいです。 例えば、「バンド」のボタンを押して、 「band.html」のファイル名で出力する。というような。 **********HTMLのテンプレート(1.html)********** <html> <head> </head> <body> <table> <tr> <td>タイトル</td> <td>歌手名</td> </tr> <tr> <td>…ここに曲名を入れたい…</td> <td>…ここに歌手名を入れたい…</td> </tr> </table> </body> </html> **********HTMLのテンプレート********** 文章がわかりにくくて申し訳ありません。 宜しくお願いいたします。

    • ベストアンサー
    • PHP