ページ 11

当日分だけの表示

Posted: 2006年4月22日(土) 09:55
by love4
お世話になります。

カレンダー機能の追加を心待ちにしているのですが、まだ実装は先になりそうなのかなと思いながら、トップページに今日のスケジュールを表示させることが今ある機能だけで対応できないかと模索しています。

http://cms.al-design.jp/phpbb/viewtopic.php?t=456

にあるように日付を直接指定するのではなく、今日の日付のものだけをリスト表示させる(今日の日付を動的に理解させる)のにいい方法がありましたらご教授いただけませんでしょうか?

一応検索して見たのですが既出事項でしたら申し訳ありません。

Re: 当日分だけの表示

Posted: 2006年4月23日(日) 10:20
by webmaster
 love4さん、ご質問ありがとうございます。回答が遅れまして申し訳ありません。
 ご質問の件ですが、現状ですと、@daysago 属性が利用可能かもしれません。

 この属性には、そのエントリが「何日前に更新されたか」が格納されています。
 よって、これが"0"のエントリだけを表示すれば、結果的に今日の日付のものだけが
表示されることになります。
 詳しくはリファレンスマニュアルの5.5.14をご覧下さい。

 但し、@daysagoは実行時に動的に格納される値である為、パフォーマンスは
良くありません。サーバの性能と相談しながら実際の動作を見て、使用を検討して
頂いた方が良いかと思います。

 カレンダー機能につきましてはまだしばらくお待たせすることになると思います。
 進捗状況としては、以前お伝えした「一旦実装を止めて再検討」の段階からまだ
進んでおりません。現在は他の細かい作業を進めております。
 ご期待いただいているのに申し訳ありません。

では、未来の一週間分なども可能ですか?

Posted: 2006年4月23日(日) 16:14
by love4
お返事ありがとうございます。
webmaster さんが書きました: @daysago 属性が利用可能かもしれません。

 この属性には、そのエントリが「何日前に更新されたか」が格納されています。
 よって、これが"0"のエントリだけを表示すれば、結果的に今日の日付のものだけが
表示されることになります。
@daysago を使ってみようと思います。
リファレンスを読んでいたのですが、理解不足で申し訳ありません。
パフォーマンスについては、確認のうえクライアントと検討いたします。

あと、同じようにたとえば7日分(未来)のスケジュールを書き出したい場合は、@daysago はマイナス値になるのでしょうか?

コード: 全て選択

本日:
<xsl:if test="@daysago<0">
<cmsd:entrylist name="public_sche" design="default" />
</xsl:if>
<br />
明日:
<xsl:if test="@daysago<-1">
<cmsd:entrylist name="public_sche" design="default" />
</xsl:if>
<br />
・・・中略・・・
7日後:
<xsl:if test="@daysago<-7">
<cmsd:entrylist name="public_sche" design="default" />
</xsl:if>
このような使い方が可能なのでしょうか?
※パフォーマンス的な負荷は実装して検討します。

ご回答頂ければ幸いです。

Re: では、未来の一週間分なども可能ですか?

Posted: 2006年4月23日(日) 17:06
by webmaster
 webmasterです。

 &lt;は、HTML等でも使われている「<」を表す記号なので、この場合は「=」を
使って条件を指定する必要があるかと思います。
 実際、プログラマー的な考え方になるのでなかなか難しいと思います。m(__)m

<xsl:if test="@daysago=0"> ... </xsl:if>
<xsl:if test="@daysago=-1"> ... </xsl:if>
<xsl:if test="@daysago=-2"> ... </xsl:if>
<xsl:if test="@daysago=-3"> ... </xsl:if>
 :

 という感じになるかと思います。
 コンテンツ管理画面では、エントリ更新日付を「未来の日付」で設定しておくように
します。

 実は上記の方法は理論上可能というだけで、実際に試しておりません。m(__)m
 何か問題点などございましたらご連絡頂ければ幸いです。

24時間以内ではなく日付指定は?

Posted: 2006年4月23日(日) 19:03
by love4
webmaster さんが書きました: 
 実際、プログラマー的な考え方になるのでなかなか難しいと思います。m(__)m

<xsl:if test="@daysago=0"> ... </xsl:if>
<xsl:if test="@daysago=-1"> ... </xsl:if>
<xsl:if test="@daysago=-2"> ... </xsl:if>
<xsl:if test="@daysago=-3"> ... </xsl:if>
 :

 という感じになるかと思います。
 コンテンツ管理画面では、エントリ更新日付を「未来の日付」で設定しておくように
します。

 実は上記の方法は理論上可能というだけで、実際に試しておりません。m(__)m
 何か問題点などございましたらご連絡頂ければ幸いです。
プログラムもかじってるのですが初歩的なミスをしてしまいました。申し訳ありません。

<xsl:if test="@daysago=0"> ... </xsl:if>ですと24時間以内という処理になると思うのですが、新着情報などと違い「本日の予定」をリストアップしたいわけですので、今日の年月日を動的に取得する方法について教えていただけませんでしょうか?
それとdate項目を比較し一致すれば吐き出す形を取りたいのです。
こちらでライブラリなどを組んで today を取得する方法しかないのでしょうか?

ご提示頂いた通りに記述してみて、自分が@daysagoを使えないと思った理由を思い出しました。お手数をお掛けしますが宜しくお願い致します。

Re: 24時間以内ではなく日付指定は?

Posted: 2006年4月23日(日) 19:52
by webmaster
 webmasterです。
 仰る通りの問題点があるかと思います。(-_-;

 今日の日付を取得する命令は現在ありませんので、究極的にはCMSDを
改造して頂くしか方法はないかと思います。

 いろいろ考えてみましたが、今回はお役に立てる方法を思いつきませんでした。
 申し訳ありません。m(__)m

 何かアイデアなどございましたらご連絡頂ければ幸いです。

Re: 24時間以内ではなく日付指定は?

Posted: 2006年4月23日(日) 21:20
by love4
了解しました。
というわけで、初めてCMSDのプログラム改造を行ってみました。

cmsdesigner/include/viewcore.php.inc
#2537行 あたりにあるdaysago属性を改造
※属性の新規追加が面倒だったので

コード: 全て選択

    /* ---------------------------------------------------------------
	 * エントリノードから日付を取得し、「今日」との日数差を算出してdaysago属性として追加する。
	 * $xmlEntry : エントリのノード。
	 */	
	function set_daysago_attribute( &$xmlEntry )
	{

		$today = getdate();
		$nowyear = $today[year];
		$nowmonth = $today[mon];
		$nowday = $today[mday];

		$year = $xmlEntry->get_attribute('year');
		$month = $xmlEntry->get_attribute('month');
		$day = $xmlEntry->get_attribute('day');
		
		$dtEntry = mktime( 0, 0, 0, $month, $day, $year );

		$dtNow = mktime( 0, 0, 0, $nowmonth, $nowday, $nowyear );
		
		$daysago = intval(($dtNow - $dtEntry) / ( 24 * 60 * 60 ));
		
		$xmlEntry->set_attribute('daysago', $daysago );
		
	}
改造箇所
1)getdate を使って年月日までを取得
 $today = getdate(); ← 今日を取得
 $nowyear = $today[year]; ← 今の年
 $nowmonth = $today[mon]; ← 今の月
 $nowday = $today[mday]; ← 今の日

2)その取得年月日を比較させるためのdtNowに格納
 $dtNow = mktime( 0, 0, 0, $nowmonth, $nowday, $nowyear );

改造はここまで。
これで24時間を1日とせず日ごとの指定が可能
あとは、xsl を遡りたい日数分製作(力技?w
下記は一週間分のサンプル

file: sche.list.m0.design.xsl
<xsl:if test="@daysago=0"> ... </xsl:if>

file: sche.list.m6.design.xsl
<xsl:if test="@daysago=-6"> ... </xsl:if>

で、PHPで各日毎に呼び出し
file: schedule.php
<cmsd:entrylist name="sche" design="m0" pageno="top" />

<cmsd:entrylist name="sche" design="m6" pageno="top" />

でとりあえずは上手くいってます。
どこか問題があればご指摘下さい。

それと、改造しててひとつ気になることがありました。
元々のdaysago指定について、Entryの日付は時間以下が切られているのにNowには現在の秒数までが格納されている。
ということは、daysagoで得られる1は正確な24時間前でもないのでは??
$dtEntry = mktime( 0, 0, 0, $month, $day, $year );
$dtNow = mktime();

以上、未熟ながらご報告まで。

Re: 24時間以内ではなく日付指定は?

Posted: 2006年4月23日(日) 21:28
by webmaster
 love4さん、ご報告ありがとうございます。
 ところで、ご指摘の件ですが、ホントですね…これは正確な24時間前ではない
ようです(汗)。

 なぜこのようにしたのか記憶が無いのですが、何か理由があったような気がします。
 現時点で大きな問題が起きるわけではないのでこのままにしておきますが、
検討課題としてメモを残しておこうと思います。ご指摘ありがとうございました。

 改造内容はパッと見る限り問題なさそうです。
 他人の書いたコードを改造できるセンスが素晴らしいです。

 一番いいのは、早くカレンダー機能を実装してリリースすることですね。(^^;
 すいません、がんばります。