こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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での表示
日月火水木金土
    12345
6789101112
13141516171819
20212223242526
2728293031

現状のmyplanでの表示
日月火水木金土
12345678910111213141516171819202122232425262728293031

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>

投稿日時 - 2012-05-02 20:14:01

QNo.7453726

困ってます

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

表示がくずれるので、空白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>

投稿日時 - 2012-05-02 21:53:35

お礼

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

投稿日時 - 2012-05-07 11:26:37

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

-広告-
-広告-

回答(1)

-広告-
-広告-

あなたにオススメの質問

-広告-
-広告-