EC-Cubeのカレンダー機能を改良
EC-Cubeのフォーラム でも書いたが、カレンダー機能についてのスレッドがあったので、改良してみた。
ソース的には汚いが、それなりのものができたので、こちらにも残すことにした。
もうちょっとスマートなやり方はあるかもしれないが、とりあえず問題無さそうなので、気がついたらさらに修正していきたい。
詳細は、EC-CUBE のカレンダーを便利にする を参照してほしい。
EC-Cubeのフォーラム でも書いたが、カレンダー機能についてのスレッドがあったので、改良してみた。
ソース的には汚いが、それなりのものができたので、こちらにも残すことにした。
もうちょっとスマートなやり方はあるかもしれないが、とりあえず問題無さそうなので、気がついたらさらに修正していきたい。
詳細は、EC-CUBE のカレンダーを便利にする を参照してほしい。
公式サイトのフォーラムにも書いたが、埋もれて探しづらくなりそうなので、備忘録としてこちらにも残すことにした。
【機能改良項目】
・土曜日にスタイルシートクラスを付ける
・日曜・祝日は休業日ではない、あくまでもカレンダー上の「赤い日」
・休業日はさらにスタイルシートクラスを追加
・以上により、スタイルシートは4つとなり、クラスは以下のとおり
1)日曜祝日 = sun
2)土曜日 = sat
3)休業日 = off
4)その他 = 無指定
・休業日は別途ファイルを読み込む。設定可能は以下のとおり。
1)毎週○○曜日休業 の設定追加
2)第○の▲曜日休業 の設定追加
3)上記該当日でも、特別に営業する日
【スタイルシートの例】
#block-calendar .sun {
background: #FFEECC;
color: #E04A00;
}
#block-calendar .sat {
background: #e6e6fa;
color: #6495ed;
}
#block-calendar .off {
background: #ffc0cb;
color: #ff6347;
font-weight: bolder;
}
【カレンダーの生成部分】
data/class/pages/frontparts/bloc/LC_Page_FrontParts_Bloc_Calendar.php
2箇所の関数を変更するので、変更関数の全ソースを掲載
function init() {
parent::init();
$bloc_file = 'calendar.tpl';
$this->setTplMainpage($bloc_file);
// カレンダーの追加初期設定
require_once (DATA_PATH. 'calendar_conf.php');
$this->setHoliday_w = $cal_holiday;
$this->setHoliday_open = $cal_open;
$this->setHoliday_wnum = $cal_w_num;
}
// カレンダー情報取得
function lfGetCalendar($disp_month = 1){
for ($j = 0; $j <= $disp_month-1; ++$j) {
$year = date('Y');
$month = date('n') + $j;
if ($month > 12) {
$month = $month%12;
$year = $year + $month%12;
}
$Month = new Calendar_Month_Weekdays($year, $month, 0);
$Month->build();
$i = 0;
$z = 1; // 週
$w_count = array(0,0,0,0,0,0,0); // 曜日毎のカウント
while ($Day = $Month->fetch()) {
if ($month == $Day->month) {
$arrCalendar[$j][$i]['in_month'] = true;
} else {
$arrCalendar[$j][$i]['in_month'] = false;
}
$arrCalendar[$j][$i]['first'] = $Day->first;
$arrCalendar[$j][$i]['last'] = $Day->last;
$arrCalendar[$j][$i]['empty'] = $Day->empty;
$arrCalendar[$j][$i]['year'] = $year;
$arrCalendar[$j][$i]['month'] = $month;
$arrCalendar[$j][$i]['day'] = $Day->day;
// 曜日を求めた後、曜日の出現回数をカウントする
$w_day = date('w',mktime(0,0,0,$arrCalendar[$j][$i]['month'],$arrCalendar[$j][$i]['day'],$arrCalendar[$j][$i]['year']));
if($arrCalendar[$j][$i]['in_month']){
$w_count[$w_day] ++;
}
// 第何週かのカウント
if($Day->last) {
$z ++;
}
// 1=日曜日,2=土曜日,3=休業日,4=その他
if ($this->lfCheckHoliday($month, $Day->day)) {
$arrCalendar[$j][$i]['holiday'] = 3;
} elseif($Day->first) {
$arrCalendar[$j][$i]['holiday'] = 1;
} elseif($Day->last) {
$arrCalendar[$j][$i]['holiday'] = 2;
} else {
$arrCalendar[$j][$i]['holiday'] = 4;
}
// 毎週○○曜日が休みの設定をオーバーライトする
foreach($this->setHoliday_w as $chk){
if ($w_day == $chk){
$arrCalendar[$j][$i]['holiday'] = 3;
}
}
// 第○▲曜日が休みの設定をオーバーライトする
if ($this->setHoliday_wnum[$w_count[$w_day]][$w_day]){
$arrCalendar[$j][$i]['holiday'] = 3;
}
// 決まった休みでも特別に営業する場合などをオーバーライトする
foreach($this->setHoliday_open as $chk){
$w_day = $arrCalendar[$j][$i]['year']. "-". $arrCalendar[$j][$i]['month']. "-". $arrCalendar[$j][$i]['day'];
if ($w_day == $chk){
$arrCalendar[$j][$i]['holiday'] = 4;
}
}
++$i;
}
}
return $arrCalendar;
}
【カレンダーのブロックテンプレート】
デザイン管理のブロック編集、カレンダーを改変
<!--▼カレンダーここから-->
<h2></h2>
<div id="block-calendar">
<!--{section name=num loop=$arrCalendar}-->
<!--{assign var=arrCal value=`$arrCalendar[num]`}-->
<!--{section name=cnt loop=$arrCal}-->
<!--{if $smarty.section.cnt.first}-->
<table>
<caption><!--{$arrCal[cnt].year}-->年<!--{$arrCal[cnt].month}-->月の定休日</caption>
<thead><tr><th>日</th><th>月</th><th>火</th><th>水</th><th>木</th><th>金</th><th>土</th></tr></thead>
<!--{/if}-->
<!--{if $arrCal[cnt].first}-->
<tr>
<!--{/if}-->
<!--{if !$arrCal[cnt].in_month}-->
<td></td>
<!--{elseif $arrCal[cnt].holiday == 1}-->
<td class="sun"><!--{$arrCal[cnt].day}--></td>
<!--{elseif $arrCal[cnt].holiday == 2}-->
<td class="sat"><!--{$arrCal[cnt].day}--></td>
<!--{elseif $arrCal[cnt].holiday == 3}-->
<td class="off"><!--{$arrCal[cnt].day}--></td>
<!--{else}-->
<td><!--{$arrCal[cnt].day}--></td>
<!--{/if}-->
<!--{if $arrCal[cnt].last}-->
</tr>
<!--{/if}-->
<!--{/section}-->
<!--{if $smarty.section.cnt.last}-->
</table>
<!--{/if}-->
<!--{/section}-->
</div>
<!--▲カレンダーここまで-->
【設定ファイルを追加】
data/calendar_conf.php
<?php /******************************* ■営業日カレンダー設定ファイル Programed at 2008.05.30 http://www.naviwave.com/ Kazuhisa Katoh ********************************/ // 毎週○○曜日休みの設定。カンマで区切ってください。 $cal_holiday = array(3,4); // 0=日曜~ 7=土曜 // 第○▲曜日の設定 // $cal_w_num[第○][曜日0~7] // 例)$cal_w_num[1][2]; 第1火曜日 // 必要数だけ追加してください $cal_w_num[2][2] = true; $cal_w_num[4][2] = true; // 営業日の設定。毎週休みを設定した場合などで、特別に営業する場合など。 // カンマで区切ってください。 $cal_open = array( '2008-6-11', '2008-6-25', ); ?>