記事No | : 3688 |
投稿日 | : 2008/05/20(Tue) 11:52:55 |
タイトル | : スケジュール管理 |
ID情報 | : eritama |
投稿者 | : tanny |
URL | : http://isysi.co.jp/test/cal.cgi |
いつも利用させていただいています。
今回会社の勤務管理のプログラムを作ることになり、自宅のネットショップでお世話になっている、KENT様のCGIを使用することとしました。使用したのは「KENTとつくるワンランク上のPeal/cgiプログラミング」内の「第5章スケジュール管理」のcgiです。
今回実現したいのは、カレンダーの表示方法です。
データの持ち方から考えると、難しいのかもしれないのですが、会社の締め日の関係で、当月21日から翌月20日のスパンで一区切りで考えます。そこで、カレンダーの表示を21日から始まって、翌月の20日までで1ページ表示にしたいというのが、実現したいことです。
今アップしている上記のデータは、少し改造を施したものですが、ほとんど原型のままにしたものを、アップしています。
データはサンプルを入れていますので、ご自由にさわっていただいても構いません。他にも実現したい機能があるのですが、この部分が一番お手上げになっていて、どこをいじればいいのかまったくわからない部分です。
どうか皆様のお知恵をいただきたく、よろしくお願いいたします。
記事No | : 3720 |
投稿日 | : 2008/05/24(Sat) 13:59:26 |
タイトル | : Re: スケジュール管理 |
ID情報 | : teketen |
投稿者 | : てけてん |
スクリプトを見れば、多分改造方法を提案できると思いますが、如何せん、私は件のスクリプトを持っていません。
書籍添付のスクリプトなので、テキストファイルにしてアップロードして戴くことも出来ませんし。
回りくどい形になりますが、WebCalenのカレンダー部分の改造を参考にして、ご自分で改造出来るなら、WebCalenの改造方法を提示するということは出来ますけれど…。
書籍添付のスクリプトは、持っている人で改造方法を提示できる人が限られますので、中々回答が付かないのが現状です。
記事No | : 3751 |
投稿日 | : 2008/05/29(Thu) 22:13:56 |
タイトル | : Re^2: スケジュール管理 |
ID情報 | : eritama |
投稿者 | : tanny |
URL | : http://isysi.co.jp/test/cal.cgi |
出張のため、お返事が遅くなりました。すみません。
・・・そうですか。WebCalen、カレンダー日記ですよね。
実はあの表示方法もしてみたいと思ってるのですが、なにぶん
知識が追いつかなくて。サポートの過去ログを検索してみたのですが、参考になる改造方法が見つけられませんでした。
てけてんさんのおっしゃるように、WebCalenの改造方法が
あれば、是非参考にしてみたいです。
記事No | : 3760 |
投稿日 | : 2008/05/30(Fri) 20:16:36 |
タイトル | : Re^3: スケジュール管理 |
ID情報 | : teketen |
投稿者 | : てけてん |
WebCalen v2.12で改造しました。
改造する必要があるのは、カレンダー表示部分のtableサブルーチンのみです。
ログファイルの形式はそのままで、月ごとに生成しています。
(ログまで21〜末日、次月の1〜20日までにすると、色々面倒なので、これが一番簡単です)
calen.cgiは、月ごとにログを生成しているので、21〜末日までの月のファイルと、
1〜20日までの月のファイルをそれぞれ開いて、別々の配列に一旦格納しています。
スケジュール管理のスクリプトとは、変数などが違うかも知れませんが、何か参考になるでしょうか?
少し説明を加えてみましたので、この改造方法を参考にして、ご自分で試行錯誤してみて下さい。
(何となく、どのようにすれば良いのか、判るのではないでしょうか?)
頑張って下さいね。
以上です。
calen.cgi
#-------------------------------------------------
# カレンダ表示
#-------------------------------------------------
sub table {
local($month) = $_[1];
if ($_[0] eq "FWD") {
$month--;
if ($month < 1) { $month += 12; $year--; }
}
if ($month == $mon && $thisyear == $year) { $thiskey = 1; }
# 追加 ■■
# $thiskeyには、アクセスした日と同じ年月のカレンダーを表示していた場合に1が代入されています。
# ↑上のif ($month == $mon && $thisyear == $year) { $thiskey = 1; }で判断されています。
$month = $month - 1 if($thiskey and $mday < 21); # カレンダーにアクセスした日が1〜20日だった場合、月の値を前月にセット(前月の21日から表示する為)
my $mos = sprintf("$month月 - %s%s",$month == 12 ? $year + 1 . '年' : '',$month == 12 ? 1 : $month + 1); # 次月の月と年を取得。カレンダーの月表示に使用
# ここまで ■■
my $lmon = sprintf("%02d", $month);
# 追加 ■■ …> 1〜20日までの年と月を取得
# 例えば、1月21日〜2月20日までのカレンダーなら、2月1日〜20日までの年を$nexyearに、月を$nextlmonに代入しています。
# $monthが21日〜末日までの月の値なので、$nexyearには、$monthが12月ならば、1〜20日は来年の1月である必要があるため、次の月は来年の西暦を代入します。
# $nextlmonには、$monthが12月ならば、1月を、そうでなければ次の月の値を代入しています。
# $month == 12 ? $year + 1 : $yearという式は、「三項演算」(条件演算子)です。
my $nexyear = $month == 12 ? $year + 1 : $year;
my $nextlmon = sprintf("%02d", $month == 12 ? 1 : $month + 1);
# ここまで ■■
open(IN,"$logdir$year$lmon.txt");
# 修正 ■■ …> my @lines = <IN>;ではなく、whileで回して、21〜末日までのデータを@linesに格納
my @lines = ();
while(<IN>) {
# ↓WebCalenでは、ログファイルが<>で区切られています。行の一番最初の数字が日付になっていますので、それを$daに代入しています。
my $da = (split(/<>/))[0];
next if($da < 21); # $daが21日よりも少ない場合は、ループの先頭に戻る(push(@lines,$_);は処理しない)
push(@lines,$_);
}
# ここまで ■■
close(IN);
# 追加 ■■ …> 1〜20日までのデータを@nextlinesに格納
open(IN,"$logdir$nexyear$nextlmon.txt");
my @nextlines = ();
while(<IN>) {
my $da = (split(/<>/))[0];
last if($da > 20);
push(@nextlines,$_);
}
close(IN);
# ここまで ■■
print <<EOM; # 修正 ■■ …> ↓$month月を$mos月に変更
<Table cellspacing="0" cellpadding="0" border="0">
<Tr><Th bgcolor="$tbl_line">
<table cellpadding="1" cellspacing="1" border="0" width="100%">
<tr bgcolor="$tbl_line">
<th colspan="7" bgcolor="$tbl_color" height="30">$year年 $mos月</th></tr>
<tr>
EOM
# 色
my %col = (
0 => $sun_color,
1 => $nor_color,
2 => $nor_color,
3 => $nor_color,
4 => $nor_color,
5 => $nor_color,
6 => $sat_color,
);
# 曜日項目
foreach (0 .. 6) {
print qq|<td align="center" height="$height" width="$width" bgcolor="$tbl_color">|;
print qq|<font color="$col{$_}">$week[$_]</font></td>|;
}
print "</tr>\n";
# 複雑怪奇なる「ツェラーの公式」を実行し当月1日の曜日を取得
my $wkey = &getweek(21, $year, $month); # 修正 ■■ …> 1を21に変更。21日の曜日の値を取得する為
# 当月の末日を計算
my $lastday = (31,28,31,30,31,30,31,31,30,31,30,31) [$month-1]
+ ($month == 2 && (($year % 4 == 0 && $year % 100 != 0) ||
$year % 400 == 0));
# 第1週の空き枠
print "<tr>\n";
for ( my $i = $wkey; $i > 0; --$i ) {
print qq|<td align="center" bgcolor="$tbl_color" height="$height" width="$width" valign="top"> - </td>|;
}
my $w = $wkey; # 曜日 (ex. 0:日曜, 1:月曜, ... )
my $flg;
my $j = 0; # 追加 ■■ …> 配列の要素を得る為
foreach my $i (21 .. $lastday,1 .. 20) { # 修正 ■■ …> 1 .. $lastdayを21 .. $lastday,1 .. 20に変更。これで、21〜末日、1〜20日の順番でカレンダーを表示します。
# 追加 ■■ …> 1日以降は、@nextlinesのデータを表示し、その年と月に差し替える
# $iには、日付が代入されているので、$iが1ならば、次の月になるので、年と月を差し替える
if($i == 1) {
$year = $lmon == 12 ? $year + 1 : $year;
$lmon = sprintf("%02d", $lmon == 12 ? 1 : $lmon + 1);
@lines = @nextlines;
$j = 0; # @nextlinesの最初の要素を取り出すため、$jに0を代入
}
$j++;
# ここまで ■■
my $day = sprintf("%02d", $i);
# 祝日の色
my $color;
if (&holiday::holiday($year, $lmon, $i)) {
$color = $spe_color;
# 祝日以外の色
} else {
$color = $col{$w};
}
# 週開始
if ($flg && $w == 0) { print "<tr>\n"; }
# 本日
if ($thiskey && $mday == $i) {
print qq|<td align="center" valign="top" bgcolor="$today_color" height="$height" width="$width">|;
# 本日以外
} else {
print qq|<td align="center" valign="top" bgcolor="$tbl_color" height="$height" width="$width">|;
}
print qq|<a href="$registcgi?mode=write&YMD=$year$lmon$day&w=$w" target="main">|;
print qq|<font color="$color">$i</font></a><br>\n|;
my ($sub,$wri) = (split(/<>/, $lines[$j-1]))[1,4]; # 修正 ■■ …> [$i-1]を[$j-1]に変更。$iには日付が入っている為
if ($sub ne "") {
print qq|<a href="$calencgi?mode=main&action=view&YMD=$year$lmon$day&w=$w" target="main">|;
print qq|<img src="$imgurl$wri[$wri]" border="0" alt="$sub"></a>|;
}
print "</td>";
# 週終わり
$w++;
if ($w == 7) {
print "</tr>\n";
$flg++;
$w = 0;
}
}
# 最終週の空き枠
while ( $w % 7 ) {
print qq|<td align="center" bgcolor="$tbl_color" height="$height" width="$width" valign="top"> - </td>|;
$w++;
}
print <<EOM;
</tr></table>
</Th></Tr></Table>
<br>
EOM
}
記事No | : 3763 |
投稿日 | : 2008/05/31(Sat) 19:36:48 |
タイトル | : Re^4: スケジュール管理 |
ID情報 | : eritama |
投稿者 | : tanny |
URL | : http://isysi.co.jp/test/cal.cgi |
ありがとうございました。
現在、WebCalen v2.12をテスト環境に落として、
検証中です。
今のスケジュール管理にどこまで、適応できるか
がんばってみます。
ご指導ありがとうございました。