• 締切済み

指定日になったら自動で情報変更

各種イベントをホームページに掲載したいです。 更新記録CGIを改造して使いたいと思っているのですが、イベント終了時にそのデータを消さないといけないんですけど、忘れてしまいそうです。 そこで、イベント日付が過ぎたらその情報を非表示としたいのですが、そんなことできるのでしょうか? 今は、同じ名前のイベントを何度もすることがあるので、イベント名などをそのまま保持しておき、表示・非表示のチェックボックスをセットしてあります。また、日付は○月○日の形式で保存してます。(これは、必要であれば200○/○/○の形式に変更することは可能です) なので、イメージとしては 「もし、今日の日付よりイベントの日付が小さい場合、イベント表示チェックをはずす」 if($today>$event_day){$event_view=""}; こんな感じでしょうか? 今日の日付の取得方法や「$today>$event_day」の方法等がいまいち良くわかってないです。 また、これってどう設定したらいいのでしょうか? CGIって誰かが読み込まないと実行しないんですよね? どの部分で実行させるのがいいんでしょう? やっぱりデコード部分と一緒に記事を読み込んだ瞬間実施するってのが現実的なのでしょうか? CGIについてあまり理解できていないので、変な質問しているかもしれませんが、そのときは指摘してください。 お願いします。

みんなの回答

noname#21216
noname#21216
回答No.3

 スクリプトに一癖 あったので 場所をみつけるのに数分かかってしましました NO1さんの 回答にあるものを利用するといいかと思います。 とりあえず、 トップにはタイトルがでますけど 詳細に行くとおわりましたと表示させるだけコードです。 130行目付近の sub html_logのif ($in{'no'} == $no) の上あたりに 下記を入れてみてください。  とりあえず非表示になります。 日が31までしかないので月に100でもかけて 月日をたすと 月日の比較が簡単にできます。 ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time); $year += 1900; $mon++; if (($in{'no'} == $no)&& (($year2<$year) ||(($year2==$year)&&($month2*100+$day2<$mon*100+$mday))) ) { print "$year1/$month1/$day1-$year2/$month2/$day2<br>"; print "[$sub]終了しました"; next; } # ここの上に   if ($in{'no'} == $no) { ---------------------------- 自動削除がおのぞみですよね? 内部をみるかぎり ファイル添付を削除もあるようなので sub usr_delをコピーして改造したものを呼び出した方が むだな読み込みがかかりますが、 そのほうがらくかもしれないです。 では、がんばって

master-3rd
質問者

補足

すみません。説明が悪かったかな… まずは、1つの情報丸々を削除ではないんです。他の項目は残しつつ非表示とするだけなので、「sub usr_del」は利用出来ません。 他の項目は残しつつ一部のみを非表示としたいので、"もし、チェックが入っていればこの項目を非表示"というようにしたいんです。 そのチェックを自動で入れたいというわけです。 なので、 「もし、入力された日付が今日の日付よりも小さかったら、変数"チェック"を空白にする」をすべての行で行う という物を作成したいんです。 で、現状は、"入力された日付が今日の日付よりも小さかったら"という部分はクリアしました。次の"「変数"チェック"を空白にする」をすべての行で行う"という部分が詰まっています。 当初の質問とずれているので、再度質問を出した方が良いかな…

noname#21216
noname#21216
回答No.2

 現在の時間取得はどうにでもかけるので 保存してあるときの 時間をどのように 保存してあるかが問題です。  どこかの提供のcgiでしたら それを示した方が解決できるとおもいますよ >日付は○月○日の形式で保存してます。 >(これは、必要であれば200○/○/○の形式に変更することは可能です) それともまだ できていないものですか? 200○/○/○なら splitなどで 3分割して 現在の時刻で 年 月 日 の順で単純比較でもいいかと思います

master-3rd
質問者

お礼

返答ありがとうございます。 多分ですが、その部分はクリアできました。 で、次の「変更」がうまく出来ていないようで… 物は「ROCO ALBUM v1.21」です。 http://rocomotion.jp 現在、以下のようなサブルーチンをみようみまねで書いてみました。 保存してある変数は必要な分だけ書いてます。消し間違えがあるかもしれないので、そこら辺はスルーしてください。 sub check{ &get_time; open(IN,"$logfile") || &error("Open Error : $logfile"); @lines = <IN>; close(IN);  foreach $lines (@lines) {   ($no,$year1,$month1,$day1,$name,~~$eview,$etitle,$elimit~~) = split(/<>/,$lines); ##解説 : $eviewは、チェックボックスの内容を保持。空白でチェック無し、1でチェック有りとする。で、1ならリスト画面で表示するというように設定。$elimitは、2000/00/00の形で終了日を保持   chomp; #日付チェック手順1 : 日付を変換   if($elimit){    $elimit2 = sprintf('%04d%02d%02d', split('/', $elimit)) ; #日付チェック手順2 : 日付を比較 if ($sysdate2 >= $elimit2) { ##解説 : $sysdate2 は20000000の形で終了日を保持  $eview2 = ""; $_ = "$no<>$year1<>$month1<>$day1<>$name<>~~<>$eview2<>$etitle<>$elimit<>~~<>\n"; push(@new,$_); print OUT @new; }#if閉じ }#if閉じ }#foreach閉じ close(OUT); } こんな感じですが、変更が保存されません。 どこが間違っていますか? すみませんが、よろしくお願いします。

  • moon_night
  • ベストアンサー率32% (598/1831)
回答No.1

$date に YYYYMMDD の形式で入っている場合。 表示の時に日付をチェックして過去の日付だったら表示しないと言うようにすればいいと思います。 ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time); $year +=1900; $mon++; $date2 = $year .$mon .$mday; if ($date >= $date2) { # 表示する処理 }

master-3rd
質問者

補足

早速の返答ありがとうございます。 時間取得のサブルーチンの最後は以下のようになっていました。 # 日時のフォーマット $date = sprintf("%04d/%02d/%02d(%s) %02d:%02d",  $year+1900,$mon2,$mday,$week[$wday],$hour,$min); これだとまずいですよね。もちろん、これは別のところで利用しているので、もう1つ変数を作ってしまおうと思いましたが、 $date2 = sprintf("%04d%02d%02d,  $year+1900,$mon2,$mday); これでOKですか? また、保存してある変数の数が結構多いので、「何番目だけを呼び出してそこだけ変える」的なことはできないでしょうか?

関連するQ&A