[EC-CUBE]カレンダーのカスタマイズ

カレンダーの休日設定を細かくできるようにする。

 1)毎週○曜日休業 の設定
 2)第□の○曜日休業 の設定
 3)上記該当日でも、特別に営業する日

設定ファイルで定休日を細かく設定する。
できあがりはこんな感じ。


CSSを新規作成する。
/html/user_data/packages/default/css/add.css

  1. @charset "utf-8";
  2.  
  3.  
  4. /* カレンダー
  5. ----------------------------------------------- */
  6. #block-calendar .sun {
  7. background: #FFEECC;
  8. color: #E04A00;
  9. }
  10.  
  11. #block-calendar .sat {
  12. background: #e6e6fa;
  13. color: #6495ed;
  14. }
  15.  
  16. #block-calendar .off {
  17. background: #ffc0cb;
  18. color: #ff6347;
  19. font-weight: bolder;
  20. }
  21.  

/html/user_data/packages/default/css/import.css
に作成したadd.cssを追加する。
  1. @charset "utf-8";
  2.  
  3. @import url("./main.css");
  4. @import url("./index.css");
  5. @import url("./products.css");
  6. @import url("./under.css");
  7. @import url("./under02.css");
  8. @import url("./mypage.css");
  9. @import url("./window.css");
  10. @import url("./add.css");
  11.  

/data/class/pages/frontparts/bloc/LC_Page_FrontParts_Bloc_Calendar.php
を修正。
  1. <?php
  2. $current_dir = realpath(dirname(__FILE__));
  3. define('CALENDAR_ROOT', DATA_PATH.'module/Calendar'.DIRECTORY_SEPARATOR);
  4. require_once($current_dir . "/../../../../module/Calendar/Month/Weekdays.php");
  5. require_once(CLASS_PATH . "pages/frontparts/bloc/LC_Page_FrontParts_Bloc.php");
  6.  
  7. /**
  8.  * Calendar のページクラス.
  9.  *
  10.  * @package Page
  11.  * @author LOCKON CO.,LTD.
  12.  * @version $ $
  13.  */
  14. class LC_Page_FrontParts_Bloc_Calendar extends LC_Page_FrontParts_Bloc {
  15.  
  16. /**
  17.   * Page を初期化する.
  18.   *
  19.   * @return void
  20.   */
  21. function init() {
  22. parent::init();
  23. $bloc_file = 'calendar.tpl';
  24. $this->setTplMainpage($bloc_file);
  25.  
  26. // カレンダーの追加初期設定 @2009.05.12
  27. require_once(DATA_PATH. 'calendar_conf.php');
  28. $this->setHoliday_w = $cal_holiday;
  29. $this->setHoliday_open = $cal_open;
  30. $this->setHoliday_wnum = $cal_w_num;
  31. }
  32.  
  33. /**
  34.   * Page のプロセス.
  35.   *
  36.   * @return void
  37.   */
  38. function process() {
  39. if (defined("MOBILE_SITE") && MOBILE_SITE) {
  40. $objView = new SC_MobileView();
  41. } else {
  42. $objView = new SC_SiteView();
  43. }
  44.  
  45. // 定休日取得取得
  46. $this->arrHoliday = $this->lfGetHoliday();
  47.  
  48. // カレンダーデータ取得
  49. $this->arrCalendar = $this->lfGetCalendar(2);
  50.  
  51. $objView->assignobj($this);
  52. $objView->display($this->tpl_mainpage);
  53. }
  54.  
  55. /**
  56.   * モバイルページを初期化する.
  57.   *
  58.   * @return void
  59.   */
  60. function mobileInit() {
  61. $this->tpl_mainpage = MOBILE_TEMPLATE_DIR . "frontparts/"
  62. . BLOC_DIR . 'best5.tpl';
  63. }
  64.  
  65. /**
  66.   * Page のプロセス(モバイル).
  67.   *
  68.   * @return void
  69.   */
  70. function mobileProcess() {
  71. $this->process();
  72. }
  73.  
  74. /**
  75.   * デストラクタ.
  76.   *
  77.   * @return void
  78.   */
  79. function destroy() {
  80. parent::destroy();
  81. }
  82.  
  83. // カレンダー情報取得
  84. function lfGetCalendar($disp_month = 1){
  85.  
  86. for ($j = 0; $j <= $disp_month-1; ++$j) {
  87. $year = date('Y');
  88. $month = date('n') + $j;
  89. if ($month > 12) {
  90. $month = $month%12;
  91. $year = $year + $month%12;
  92. }
  93.  
  94. $Month = new Calendar_Month_Weekdays($year, $month, 0);
  95. $Month->build();
  96. $i = 0;
  97. while ($Day = $Month->fetch()) {
  98. if ($month == $Day->month) {
  99. $arrCalendar[$j][$i]['in_month'] = true;
  100. } else {
  101. $arrCalendar[$j][$i]['in_month'] = false;
  102. }
  103. $arrCalendar[$j][$i]['first'] = $Day->first;
  104. $arrCalendar[$j][$i]['last'] = $Day->last;
  105. $arrCalendar[$j][$i]['empty'] = $Day->empty;
  106. $arrCalendar[$j][$i]['year'] = $year;
  107. $arrCalendar[$j][$i]['month'] = $month;
  108. $arrCalendar[$j][$i]['day'] = $Day->day;
  109. if ($this->lfCheckHoliday($month, $Day->day) || $Day->first || $Day->last) {
  110. $arrCalendar[$j][$i]['holiday'] = true;
  111. } else {
  112. $arrCalendar[$j][$i]['holiday'] = false;
  113. }
  114. ++$i;
  115. }
  116. }
  117.  
  118. return $arrCalendar;
  119. }
  120.  
  121. // 休日取得
  122. function lfGetHoliday() {
  123. $objQuery = new SC_Query();
  124. $objQuery->setorder("rank DESC");
  125.  
  126. $where = "del_flg <> 1";
  127. $arrRet = $objQuery->select("month, day", "dtb_holiday", $where);
  128. foreach ($arrRet AS $key=>$val) {
  129. $arrHoliday[$val['month']][] = $val['day'];
  130. }
  131. return $arrHoliday;
  132. }
  133.  
  134. // 休日チェック
  135. function lfCheckHoliday($month, $day) {
  136. if (!empty($this->arrHoliday[$month])) {
  137. if (in_array($day, $this->arrHoliday[$month])) {
  138. return true;
  139. }
  140. }
  141. return false;
  142. }
  143.  
  144. /***
  145.   * カレンダー情報取得
  146.   * @2009.05.12追加
  147.   ***/
  148. function lfGetCalendar($disp_month = 1) {
  149. for($j = 0; $j <= $disp_month-1; ++$j){
  150. $year = date('Y');
  151. $month = date('n') + $j;
  152. if($month > 12){
  153. $month = $month%12;
  154. $year = $year + $month;
  155. }
  156.  
  157. $Month = new Calendar_Month_Weekdays($year, $month, 0);
  158. $Month->build();
  159.  
  160. $i = 0;
  161. $z = 1; // 週
  162. $w_count = array(0,0,0,0,0,0,0); // 曜日毎のカウント
  163.  
  164. while($Day = $Month->fetch()){
  165. if($month == $Day->month){
  166. $arrCalendar[$j][$i]['in_month'] = true;
  167. } else {
  168. $arrCalendar[$j][$i]['in_month'] = false;
  169. }
  170. $arrCalendar[$j][$i]['first'] = $Day->first;
  171. $arrCalendar[$j][$i]['last'] = $Day->last;
  172. $arrCalendar[$j][$i]['empty'] = $Day->empty;
  173. $arrCalendar[$j][$i]['year'] = $year;
  174. $arrCalendar[$j][$i]['month'] = $month;
  175. $arrCalendar[$j][$i]['day'] = $Day->day;
  176.  
  177. // 曜日を求めたあと、曜日の出現回数をカウント
  178. $w_day = date('w', mktime(0,0,0,$arrCalendar[$j][$i]['month'],
  179. $arrCalendar[$j][$i]['day'], $arrCalendar[$j][$i]['year']));
  180.  
  181. if($arrCalendar[$j][$i]['in_month']){
  182. $w_count[$w_day] ++;
  183. }
  184.  
  185. // 第何週かのカウント
  186. if($Day->last){
  187. $z ++;
  188. }
  189.  
  190. // 1=日曜日、2=土曜日、3=休業日、4=その他
  191. if($this->lfCheckHoliday($month, $Day->day)){
  192. $arrCalendar[$j][$i]['holiday'] = 3;
  193. } elseif($Day->first){
  194. $arrCalendar[$j][$i]['holiday'] = 1;
  195. } elseif($Day->last){
  196. $arrCalendar[$j][$i]['holiday'] = 2;
  197. } else {
  198. $arrCalendar[$j][$i]['holiday'] = 4;
  199. }
  200.  
  201. // 毎週○○曜日が休みの設定をオーバーライド
  202. foreach($this->setHoliday_w as $chk){
  203. if($w_day == $chk){
  204. $arrCalendar[$j][$i]['holiday'] = 3;
  205. }
  206. }
  207.  
  208. // 第○△曜日が休みの設定をオーバーライド
  209. if ($this->setHoliday_wnum[$w_count[$w_day]][$w_day]){
  210. $arrCalendar[$j][$i]['holiday'] = 3;
  211. }
  212.  
  213. // 決まった休みでも特別に営業する場合などをオーバーライド
  214. foreach($this->setHoliday_open as $chk){
  215. $w_day = $arrCalendar[$j][$i]['year'] . "-" . $arrCalendar[$j][$i]['month'] . "-" . $arrCalendar[$j][$i]['day'];
  216. if($w_day == $chk){
  217. $arrCalendar[$j][$i]['holiday'] = 4;
  218. }
  219. }
  220.  
  221. ++$i;
  222. }
  223. }
  224.  
  225. return $arrCalendar;
  226. }
  227. }
  228. ?>
  229.  

管理画面からブロックの編集を行う。
管理画面>デザイン管理>ブロック編集>カレンダー

以下の通りに書き換える
  1. <pre><code><!--▼カレンダーここから-->
  2. <h2></h2>
  3. <div id="block-calendar">
  4. <!--{section name=num loop=$arrCalendar}-->
  5. <!--{assign var=arrCal value=`$arrCalendar[num]`}-->
  6. <!--{section name=cnt loop=$arrCal}-->
  7. <!--{if $smarty.section.cnt.first}-->
  8. <table>
  9. <caption><!--{$arrCal[cnt].year}--><!--{$arrCal[cnt].month}-->月の定休日</caption>
  10. <thead><tr><th></th><th></th><th></th><th></th><th></th><th></th><th></th></tr></thead>
  11. <!--{/if}-->
  12. <!--{if $arrCal[cnt].first}-->
  13. <tr>
  14. <!--{/if}-->
  15. <!--{if !$arrCal[cnt].in_month}-->
  16. <td></td>
  17. <!--{elseif $arrCal[cnt].holiday == 1}-->
  18. <td class="sun"><!--{$arrCal[cnt].day}--></td>
  19. <!--{elseif $arrCal[cnt].holiday == 2}-->
  20. <td class="sat"><!--{$arrCal[cnt].day}--></td>
  21. <!--{elseif $arrCal[cnt].holiday == 3}-->
  22. <td class="off"><!--{$arrCal[cnt].day}--></td>
  23. <!--{else}-->
  24. <td><!--{$arrCal[cnt].day}--></td>
  25. <!--{/if}-->
  26. <!--{if $arrCal[cnt].last}-->
  27. </tr>
  28. <!--{/if}-->
  29. <!--{/section}-->
  30. <!--{if $smarty.section.cnt.last}-->
  31. </table>
  32. <!--{/if}-->
  33. <!--{/section}-->
  34. </div>
  35. <!--▲カレンダーここまで--></code></pre>
  36.  

休日を決める設定ファイルを追加する。
/data/calendar_conf.php
  1. <pre><code><?php
  2.  
  3. // 毎週○○曜日休みの設定。カンマで区切ってください。
  4. //$cal_holiday = array(3,4); // 0=日曜~ 6=土曜
  5. $cal_holiday = array(3); // 0=日曜~ 6=土曜
  6.  
  7. // 第○▲曜日の設定
  8. // $cal_w_num[第○][曜日0~6]
  9. // 例)$cal_w_num[1][2]; 第1火曜日
  10. // 必要数だけ追加してください
  11. //$cal_w_num[2][2] = true;
  12. $cal_w_num[4][5] = true;
  13.  
  14. // 営業日の設定。毎週休みを設定した場合などで、特別に営業する場合など。
  15. // カンマで区切ってください。
  16. $cal_open = array(
  17. '2009-5-22',
  18. '2008-5-17',
  19. );
  20.  
  21. ?></code></pre>
  22.  
最終更新:2009年05月12日 12:21
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。
添付ファイル