■ユーザーズフォーラム リニューアルのお知らせ
新規投稿は新ユーザーズフォーラムにお願いします。
このフォーラムは閲覧専用のアーカイブです。

カレンダーの表示方法?

nakaken > カレンダーの表示方法? @ 2012/2/28 17:32
カレンダーを任意のページ位置に表示するにはどのようにしたらよろしいのでしょうか?

探してみたのですが探しきれないので投稿しました。
よろしくおねがいいたします。
goichi > Re: カレンダーの表示方法? @ 2012/2/28 17:38
ブログ用のカレンダーでしたら、
ウィジェット管理で登録して、
<?php $baser->element('widget_area', array('no'=> ○ )) ?>

(○はウィジェットのNO)で表示できるかも。

あとは出力されるソースのクラスやIDを見て、
CSSで適当にデザインするというはいかがでしょうか?


追記:ごめんなさい、プラグインの話でしたね。。。
お詫びついでにアイディアを記載します。

まず、BaserCMSが持っているカレンダーの出力部分をパクリます。(笑)

<?php
/**
 * カレンダーヘルパー.
 *
 */
class CalendarHelper extends AppHelper {
    var $_defaultLang = 'en';
    var $_week = array(
        'en' => array('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'),
        'ja' => array('日', '月', '火', '水', '木', '金', '土')
    );

    /**
     * カレンダーを生成する.
     *
     * @param string $lang 言語
     * @param integer $date 日付
     * @return カレンダー
     */
    function makeCalendar($lang = null, $date = null) {
        if (is_null($date)) {
            $date = date('Ymd');
        }
        if (is_null($lang)) {
            $lang = $this->_defaultLang;
        }
		//日付を解体?もっと別の方法あるきがする。
        $year = substr($date, 0, 4);
        $month = substr($date, 4, 2);
        $day = substr($date, 6, 2);
		//checkdateは日付の妥当性チェック
        if (!checkdate($month, $day, $year)) {
			//cakeのログ出力メソッド
            $this->log('Invalid date format!');
        }
		//出力用メソッド?output
        return $this->output(
            "<div id=\"calendar\"><div id=\"calendar-header\">".$year."年".$month."月</div><table id=\"calendar-content\">".
            $this->_makeWeekHeader($lang).$this->_makeCalendarContent($year, $month, $date)."</table></div>"
        );
    }

    /**
     * 週ヘッダーを生成する.
     *
     * @param string $lang 言語
     * @return 週ヘッダー
     */
    function _makeWeekHeader($lang = null) {
        if (is_null($lang)) {
            $lang = $this->_defaultLang;
        }
        $cell = array();
        foreach ($this->_week[$lang] as $weekId => $week) {
            array_push($cell, "<td class=\"week_".strtolower($this->_week[$this->_defaultLang][$weekId])."\">".$week."</td>");
        }
		//implodeは配列を文字列を使って結合する。
        return "<tr id=\"week_header\">".implode("", $cell)."</tr>";
    }

    /**
     * カレンダーコンテンツを生成する.
     *
     * @param integer $year 年
     * @param integer $month 月
     * @param integer $selecteday 選択日
     * @return カレンダーコンテンツ
     */
    function _makeCalendarContent($year, $month, $selectedDay) {
        if (!is_numeric($year) || !is_numeric($month) || !is_numeric($selectedDay)) {
            throw new Exception("Invalid parameters!");
        }

        $calendar = array();
        $weekNo = 1; // 月内での週番号(第○週)
        $last = substr($this->_getLastDay($year, $month), 6, 2);
        for ($day = 1; $day <= $last; $day++) {
            $date = $year.$month.sprintf("%02d", $day); // Ymd形式
            $weekId = $this->_getWeekIdOfDay($year, $month, $day, $this->_defaultLang);
            $attr = array();
            if ($this->_getToday() == $date) {
                array_push($attr, 'today');
            }
            if ($selectedDay == $date) {
                array_push($attr, 'selected');
            }
            // TODO 祝日判定
            if (false) {
                array_push($attr, 'holiday');
            }
            $calendar[$weekNo][$weekId] = array('day' => $day, 'attribute' => $attr);
            // 翌週へ
            if ($weekId == count($this->_week[$this->_defaultLang]) - 1) {
                $weekNo++;
            }
        }
//        debug($calendar);

        $default = array('day' => '', 'attribute' => array());
        $c = array();
        for ($rowIdx = 1; $rowIdx <= count($calendar); $rowIdx++) {
            $elements = array();
            for ($colIdx = 0; $colIdx < count($this->_week[$this->_defaultLang]); $colIdx++) {
                $day = $default;
                if (array_key_exists($colIdx, $calendar[$rowIdx])) {
                    $day = $calendar[$rowIdx][$colIdx];
                }
//                debug($day);
                array_push(
                    $elements,
                    "<td class=\"week_".strtolower($this->_week[$this->_defaultLang][$colIdx])." ".implode(" ", $day['attribute'])."\">
					<a href=\"edit?year=$year&month=$month&day=".$day['day']."\">
					".$day['day']."
					</a>
					</td>"
                );
            }
            array_push($c, "<tr class=\"week\">".implode("", $elements)."</tr>");
        }
        return implode("", $c);
    }

    /**
     * 月初の日付を返す.
     *
     * @param integer $year 年
     * @param integer $month 月
     * @param unknown_type $format フォーマット
     * @return 月初の日付
     */
    function _getFirstDay($year, $month, $format = 'Ymd') {
        return date($format, mktime(0, 0, 0, $month, 1, $year));
    }
    /**
     * 月末の日付を返す.
     *
     * @param integer $year 年
     * @param integer $month 月
     * @param string $format フォーマット
     * @return 月末の日付
     */
    function _getLastDay($year, $month, $format = 'Ymd') {
        return date($format, mktime(0, 0, 0, $month + 1, 0, $year));
    }
    /**
     * 日付を返す.
     *
     * @param integer $year 年
     * @param integer $month 月
     * @param integer $day 日
     * @param string $format フォーマット
     * @return 月末の日付
     */
    function _getDay($year, $month, $day, $format = 'Ymd') {
        return date($format, mktime(0, 0, 0, $month, $day, $year));
    }
    /**
     * 今日の日付を返す.
     *
     * @param string $format フォーマット
     * @return 今日の日付
     */
    function _getToday($format = 'Ymd') {
        return date($format);
    }
    /**
     * 曜日IDを返す.
     *
     * @param integer $year 年
     * @param integer $month 月
     * @param integer $day 日
     * @param string $lang 言語
     * @return 曜日ID
     */
    function _getWeekIdOfDay($year, $month, $day, $lang = null) {
        if (is_null($lang)) {
            $lang = $this->_defaultLang;
        }
        return $this->_getDay($year, $month, $day, 'w');
    }
    /**
     * 曜日を返す.
     *
     * @param integer $year 年
     * @param integer $month 月
     * @param integer $day 日
     * @param string $lang 言語
     * @return 曜日
     */
    function _getWeekOfDay($year, $month, $day, $lang = null) {
        if (is_null($lang)) {
            $lang = $this->_defaultLang;
        }
        return $this->_week[$lang][$this->_getDay($year, $month, $day, 'w')];
    }
}
?>

次にこれを作成しようとしているプラグインの
/プラグイン名/view/helpers/calendar.php
として保存します。
(2012/2/29追記:ファイル名のスペルミスがありました。修正しました。)

続いてコントローラーでこのヘルパーを呼び出しておきます。

App::import('Controller', 'Plugins');

class ○○○Controller extends PluginsController {

〜略〜
var $helpers = array('○○.calendar');
〜略〜


(○の部分はプラグインの名前にあわせてください。)

そして最後にViewファイル内で

<?php echo $calendar->makeCalendar(); ?>

みたいな感じにすると出てくるのではないかと・・・・。
出来なかったらすみません。。。。
nakaken > Re: カレンダーの表示方法? @ 2012/2/28 17:50
引用:
ブログ用のカレンダーでしたら、
ウィジェット管理で登録して、
<?php $baser->element('widget_area', array('no'=> ○ )) ?>

(○はウィジェットのNO)で表示できるかも。

あとは出力されるソースのクラスやIDを見て、
CSSで適当にデザインするというはいかがでしょうか?



早々のお答えありがとうございます。
ウィジェット管理登録方法はわかるのですが、肝心のブログ用のカレンダーの取り出し方がわかりません。

よろしくお願いいたします
goichi > Re: カレンダーの表示方法? @ 2012/2/28 17:53
すみません、プラグインの話ですものね。
先ほどの記事に追記してみました、参考になりますでしょうか?
nakaken > Re: カレンダーの表示方法? @ 2012/2/28 17:58
ありがとうございます。
さっそく取りかかってみます。

結果はのちほどご報告いたします。
goichi > Re: カレンダーの表示方法? @ 2012/2/29 10:26
ごめんなさい!
ヘルパーファイルの名前をスペルミスしてました。

/プラグイン名/views/helpers/calender.php という部分、
「calender.php」ではなく「calendar.php」ですね。すみません。
(元記事も修正しておきます。)

うちのローカル環境で実行したら、とりあえずカレンダーの出力までは出来ました。
あとは工夫次第だと思います。