イベント・カレンダー、もどき

CMS Designerを「こんな風に使ってます」等の活用事例や、自分なりのTIPS等のご報告をお待ちしています。
返信
blue
パワーユーザー
記事: 70
登録日時: 2005年1月31日(月) 20:49

イベント・カレンダー、もどき

投稿記事 by blue » 2009年2月18日(水) 15:30

 カレンダー機能は今後の実装予定に入っているので、それを待つのが最善かと思いますが、
待ちきれない人(!)や、ちょっと無理矢理でも良いというのであればお試しください。
無理矢理というのは、スキーマ定義や入力データにちょっと手を加えねばならない点です。
それから、PEAR Calendar モジュールが必要な方法ですので、使えない方にはごめんなさい。

 PEAR Calendar モジュールはインストール済みの前提です。
インストール方法は環境によって違うとも聞きますので、説明は省きます。
 PEAR ディレクトリに以下の2つがインストールされていることを確認してください。
Calendar/Month/Weekdays.php
Calendar/Decorator.php

 誕生日にその人の名前を表示する、というシンプルなカレンダーを作ります。
一月分表示の、一行一週間の、テーブル表示のカレンダーです。
スキーマ定義(長くなりますが、コピペで使えるよう敢えて省略しないでおきます)

コード: 全て選択

    <data name="name" type="text" output="html2(他でも良いよ)" caption="名前" size="80" />
    <data name="month" type="menu" caption="月" group="True">
        <menuitem id="1">1</menuitem>
        <menuitem id="2">2</menuitem>
        <menuitem id="3">3</menuitem>
        <menuitem id="4">4</menuitem>
        <menuitem id="5">5</menuitem>
        <menuitem id="6">6</menuitem>
        <menuitem id="7">7</menuitem>
        <menuitem id="8">8</menuitem>
        <menuitem id="9">9</menuitem>
        <menuitem id="10">10</menuitem>
        <menuitem id="11">11</menuitem>
        <menuitem id="12">12</menuitem>
    </data>
    <data name="day" type="menu" caption="日" group="True">
        <menuitem id="1">1</menuitem>
        <menuitem id="2">2</menuitem>
        <menuitem id="3">3</menuitem>
        <menuitem id="4">4</menuitem>
        <menuitem id="5">5</menuitem>
        <menuitem id="6">6</menuitem>
        <menuitem id="7">7</menuitem>
        <menuitem id="8">8</menuitem>
        <menuitem id="9">9</menuitem>
        <menuitem id="10">10</menuitem>
        <menuitem id="11">11</menuitem>
        <menuitem id="12">12</menuitem>
        <menuitem id="13">13</menuitem>
        <menuitem id="14">14</menuitem>
        <menuitem id="15">15</menuitem>
        <menuitem id="16">16</menuitem>
        <menuitem id="17">17</menuitem>
        <menuitem id="18">18</menuitem>
        <menuitem id="19">19</menuitem>
        <menuitem id="20">20</menuitem>
        <menuitem id="21">21</menuitem>
        <menuitem id="22">22</menuitem>
        <menuitem id="23">23</menuitem>
        <menuitem id="24">24</menuitem>
        <menuitem id="25">25</menuitem>
        <menuitem id="26">26</menuitem>
        <menuitem id="27">27</menuitem>
        <menuitem id="28">28</menuitem>
        <menuitem id="29">29</menuitem>
        <menuitem id="30">30</menuitem>
        <menuitem id="31">31</menuitem>
    </data>
 冗長になりますが、グループキーを与えるためにこのようにします。
 date 項目ですと、「1981-09-20」という文字列ごとグループキーに設定されるので、
月と日で切り分けて絞り込むことができません。(カレンダー機能搭載の際には、この部分の切り分けが可能になるのでしょう、たぶん)
 デザイン定義はどうということはありません。
 同じ誕生日の人がいる可能性がありますから、一覧表示用で作ります。

コード: 全て選択

<xsl:template match="/entrylist ">
<xsl:for-each select="entry">
<div>
	<xsl:value-of select="name" disable-output-escaping="yes" />
</div>
</xsl:for-each>
</xsl:template>
スクリプト部分、別ファイルにしておきます。このままコピペして calendar.inc などとてきとーな名前をつけます。

コード: 全て選択

<?php
//PEAR include
require_once("Calendar/Month/Weekdays.php");
require_once("Calendar/Decorator.php");

class MonthDecorator extends Calendar_Decorator {
    function MonthDecorator(& $Month) {
        parent::Calendar_Decorator($Month);
    }

	function prevMonth() {
        $prevStamp = parent::prevMonth(TRUE);
        return $_SERVER['PHP_SELF'].'?y='.date('Y',$prevStamp).
            '&m='.date('n',$prevStamp).'&d='.date('j',$prevStamp);
    }

	function thisMonth() {
        $thisStamp = parent::thisMonth(TRUE);
        return date("Y年 m月",$thisStamp);
    }

	function nextMonth() {
        $nextStamp = parent::nextMonth(TRUE);
        return $_SERVER['PHP_SELF'].'?y='.date('Y',$nextStamp).
            '&m='.date('n',$nextStamp).'&d='.date('j',$nextStamp);
    }
}

if (!isset($_GET['y'])) $_GET['y'] = date('Y');
if (!isset($_GET['m'])) $_GET['m'] = date('n');

$Month = new Calendar_Month_Weekdays($_GET['y'],$_GET['m'],0);

$MonthDecorator = new MonthDecorator($Month);
$MonthDecorator->build();
?>
 埋め込みページ

コード: 全て選択

<?php require_once( "cmsdesigner/include/view.php.inc" ); // encoding="euc-jp" ?>
の下に

コード: 全て選択

<?php include_once("./include/calendar.inc"); ?>
などとして上記ファイルを読み込みます。

コード: 全て選択

<table class="calendar">
	<caption>
<div>
<?php echo ( $MonthDecorator->thisMonth() ); ?> 
<span style="color: #ff69b4;">おたんじょうび おめでとう!</span>
</div>
<div>
<a href="<?php echo ($MonthDecorator->prevMonth()); ?>" title="前月">前月</a>&nbsp;
<a href="calendar.php" title="今月">今月</a>&nbsp;
<a href="<?php echo ($MonthDecorator->nextMonth()); ?>" title="次月">次月</a>
</div>
</caption>
 <tr>
        <th class="Sun">日</th>
        <th>月</th>
        <th>火</th>
        <th>水</th>
        <th>木</th>
        <th>金</th>
        <th class="Sat">土</th>
    </tr>
<?php
while ( $Day = $MonthDecorator->fetch() ) {
    if ( $Day->isFirst() ) {
        echo ( "<tr>\n" );
    }
    if ( $Day->isEmpty() ) {
        echo ( "<td>&nbsp;</td>\n" );
    }
    else {
		if (date("d") == $Day->thisDay()) {  // 今日
	         echo ( "<td class=\"Today\">\n" );
	    } else {
	         echo ( "<td>\n" );
	    }
			 if ($Day->isFirst()) {  // 日曜
				         echo '<div class="Sun">';
				} else if ($Day->isLast()) {    // 土曜
				         echo '<div class="Sat">';
				} else {
				         echo ( "<div>\n" );
				}
		        echo ( $Day->thisDay() );
				echo ( "</div>\n" );
?>
	<cmsd:entrylist name="calendar" design="default" rows="99" >
	 <cmsd:group key="month" value="<?php echo $Day->thisMonth(); ?>" />
	 <cmsd:group key="day" value="<?php echo $Day->thisDay(); ?>" />
	</cmsd:entrylist>
<?php 
		echo ( "</td>\n" );
    }

    if ( $Day->isLast() ) {
        echo ( "</tr>\n" );
    }
}
?>
</table>
 以上です。
 念のため、最初は CMSD の埋め込みタグをコメントアウトするなりして、
カレンダーそのものの動作を確認してみてください。
 ソースを見てもらえばわかりますが、土日と今日の日付の表示を変えることが可能になってます。
CSS で自由にデザインしてください。

返信