7 * LICENSE: This source file is licensed under the terms of the GNU General Public License.
9 * @package Magic3 Framework
10 * @author 平田直毅(Naoki Hirata) <naoki@aplo.co.jp>
11 * @copyright Copyright 2006-2008 Magic3 Project.
12 * @license http://www.gnu.org/copyleft/gpl.html GPL License
13 * @version SVN: $Id: reserve_mainReserveWidgetContainer.php 5056 2012-07-23 02:50:32Z fishbone $
14 * @link http://www.magic3.org
16 require_once($gEnvManager->getContainerPath() . '/baseWidgetContainer.php');
17 require_once($gEnvManager->getCurrentWidgetDbPath() . '/reserve_mainDb.php');
18 require_once(CALENDAR_ROOT . 'Month/Weekdays.php');
20 class reserve_mainReserveWidgetContainer extends BaseWidgetContainer
22 private $db; // DB接続オブジェクト
23 private $sysDb; // システムDBオブジェクト
24 private $langId; // 表示言語
25 private $serialNo; // シリアル番号
26 private $hour; // 予約時間
27 private $minute; // 予約時間(分)
28 private $reserveDateArray = array(); // 予約日
29 private $viewMinHour; // 最小時間
30 private $viewMaxHour; // 最大時間
31 private $availableTime = array(); // 選択可能時間
32 private $unitIntervalMinute; // 単位時間(分)
33 private $maxUserReserveCount; // 1ユーザの予約可能数
34 private $maxCountPerUnit; // 1単位あたりの予約可能数
35 private $defaultResouceId; // デフォルトのリソースID
36 private $cancelAvailableDay; // 予約キャンセル可能な日数
37 const DEFAULT_CONFIG_ID = 0; // デフォルト定義ID
38 const UNIT_INTERVAL_MINUTE = 'unit_interval_minute'; // 単位時間(分)
39 const MAX_USER_RESERVE_COUNT = 'max_user_reserve_count'; // 最大ユーザ予約可能数
40 const MAX_COUNT_PER_UNIT = 'max_count_per_unit'; // 1単位あたりの登録可能数
41 const DEFAULT_RESOURCE_ID = 'default_resource_id'; // デフォルトのリソースID
42 const CANCEL_AVAILABLE_DAY = 'cancel_available_day'; // 予約キャンセル可能な日数
47 function __construct()
49 global $gInstanceManager;
52 parent::__construct();
55 $this->db = new reserve_mainDb();
56 $this->sysDb = $gInstanceManager->getSytemDbObject();
58 $this->unitIntervalMinute = $this->db->getReserveConfig(self::DEFAULT_CONFIG_ID, self::UNIT_INTERVAL_MINUTE); // 1単位あたりの時間
59 $this->maxUserReserveCount = $this->db->getReserveConfig(self::DEFAULT_CONFIG_ID, self::MAX_USER_RESERVE_COUNT); // 1ユーザ登録可能な予約数
60 $this->maxCountPerUnit = $this->db->getReserveConfig(self::DEFAULT_CONFIG_ID, self::MAX_COUNT_PER_UNIT); // 1単位あたりの予約可能数
61 $this->defaultResouceId = $this->db->getReserveConfig(self::DEFAULT_CONFIG_ID, self::DEFAULT_RESOURCE_ID); // デフォルトのリソースID
62 $this->cancelAvailableDay = $this->db->getReserveConfig(self::DEFAULT_CONFIG_ID, self::CANCEL_AVAILABLE_DAY); // 予約キャンセル可能な日数
67 * _assign()でデータを埋め込むテンプレートファイルのファイル名を返す。
68 * 読み込むディレクトリは、「自ウィジェットディレクトリ/include/template」に固定。
70 * @param RequestManager $request HTTPリクエスト処理クラス
71 * @param object $param 任意使用パラメータ。そのまま_assign()に渡る
72 * @return string テンプレートファイル名。テンプレートライブラリを使用しない場合は空文字列「''」を返す。
74 function _setTemplate($request, &$param)
76 return 'reserve.tmpl.html';
81 * _setTemplate()で指定したテンプレートファイルにデータを埋め込む。
83 * @param RequestManager $request HTTPリクエスト処理クラス
84 * @param object $param 任意使用パラメータ。_setTemplate()と共有。
87 function _assign($request, &$param)
90 global $gAccessManager;
94 $now = date("Y/m/d H:i:s"); // 現在日時
95 $today = date("Y/m/d"); // 現在日付
96 $this->langId = $gEnvManager->getCurrentLanguage(); // 表示言語を取得
97 $userId = $gEnvManager->getCurrentUserId();
100 $this->getAvailableTime();
102 $act = $request->trimValueOf('act');
103 $this->serialNo = $request->trimValueOf('serial'); // 選択項目のシリアル番号
106 // 空の場合は、予約日があれば予約日の月のカレンダーを表示
107 $showReservedDate = false; // 予約日のあるカレンダーを表示するかどうか
108 $year = $request->trimValueOf('year'); // 年指定
109 if (!(is_numeric($year) && 1 <= $year)){ // エラー値のとき
111 $showReservedDate = true; // 予約日のあるカレンダーを表示するかどうか
113 $month = $request->trimValueOf('month'); // 月指定
114 if (!(is_numeric($month) && 1 <= $month && $month <= 12)){ // エラー値のとき
116 $showReservedDate = true; // 予約日のあるカレンダーを表示するかどうか
120 $reserveDate = $request->trimValueOf('reserve_date');
121 if (!empty($reserveDate)) $reserveDate = $this->convertToProperDate($reserveDate); // 予約日時
122 $this->hour = $request->trimValueOf('time_hour');
123 if ($this->hour == '') $this->hour = -1;
124 $this->minute = $request->trimValueOf('time_minute');
125 if ($this->minute == '') $this->minute = -1;
127 if ($act == 'new'){ // 新規予約
129 $this->checkDate($reserveDate, '予約日付');
130 if ($this->hour == -1) $this->setUserErrorMsg('予約時間(時)が選択されていません');
131 if ($this->minute == -1) $this->setUserErrorMsg('予約時間(分)が選択されていません');
134 $reserveDateTime = $reserveDate . ' ' . $this->hour . ':' . $this->minute;
135 $reserveHourMinute = $this->hour * 100 + $this->minute;
139 if ($this->getMsgCount() == 0){
140 if (strtotime(date("Y/m/d")) >= strtotime($reserveDate)) $this->setUserErrorMsg('明日以降を選択してください');
144 if ($this->getMsgCount() == 0){
146 $week = date("w", strtotime($reserveDate));
147 $hourMinute = $this->availableTime[$week]; // 設定時分を取得
148 $startHour = $hourMinute[0][0];
149 $startMinute = $hourMinute[0][1];
150 $endHour = $hourMinute[0][2];
151 $endMinute = $hourMinute[0][3];
152 $startHour2 = $hourMinute[1][0];
153 $startMinute2 = $hourMinute[1][1];
154 $endHour2 = $hourMinute[1][2];
155 $endMinute2 = $hourMinute[1][3];
158 case 0: $weekName = '日曜日'; break;
159 case 1: $weekName = '月曜日'; break;
160 case 2: $weekName = '火曜日'; break;
161 case 3: $weekName = '水曜日'; break;
162 case 4: $weekName = '木曜日'; break;
163 case 5: $weekName = '金曜日'; break;
164 case 6: $weekName = '土曜日'; break;
167 if ($startHour == -1 && $startHour2 == -1){
170 $this->setUserErrorMsg($msg);
171 } else if (!($startHour != -1 && ($startHour * 100 + $startMinute <= $reserveHourMinute && $reserveHourMinute < $endHour * 100 + $endMinute)) &&
172 !($startHour2 != -1 && ($startHour2 * 100 + $startMinute2 <= $reserveHourMinute && $reserveHourMinute < $endHour2 * 100 + $endMinute2))){
174 $msg .= 'の時間の指定可能範囲は ';
175 if ($startHour != -1) $msg .= $startHour . '時' . $startMinute . '分~' . $endHour . '時' . $endMinute . '分';
176 if ($startHour2 != -1) $msg .= '<br>または ' . $startHour2 . '時' . $startMinute2 . '分~' . $endHour2 . '時' . $endMinute2 . '分';
178 $this->setUserErrorMsg($msg);
183 if ($this->getMsgCount() == 0){
184 $reserveCount = $this->db->getReserveStatusCountByDateTime($this->defaultResouceId, 0, $reserveDateTime, 1/*予約状態*/);
185 if ($reserveCount >= $this->maxCountPerUnit) $this->setUserErrorMsg('この時間は予約がいっぱいです');
187 // 同ユーザがすでに登録済みかどうかチェック
188 if ($this->getMsgCount() == 0){
189 $reserveCount = $this->db->getReserveStatusCountByDateTime($this->defaultResouceId, $userId, $reserveDateTime, 1/*予約状態*/);
190 if ($reserveCount >= 1) $this->setUserErrorMsg('この時間にすでに予約があります');
193 //if ($this->getMsgCount() == 0){
194 // $reserveCount = $this->db->getReserveStatusCountByDateTime($this->defaultResouceId, $userId, $reserveDateTime, 1/*予約状態*/);
195 // if ($reserveCount >= $this->maxUserReserveCount) $this->setUserErrorMsg('予約可能最大数を超えています');
199 if ($this->getMsgCount() == 0){
200 $date = $reserveDate . ' ' . $this->hour . ':' . $this->minute . ':0';
202 $ret = $this->db->addReserveStatus($this->defaultResouceId, $userId, $date, 1/*予約*/, $note, $newSerial);
204 $this->setGuidanceMsg('予約が完了しました');
211 $this->setAppErrorMsg('予約に失敗しました');
214 } else if ($act == 'cancel'){ // 予約キャンセルのとき
216 $ret = $this->db->updateReserveStatus($this->serialNo, $this->defaultResouceId, $userId, 2/*キャンセル*/, $note);
218 $this->setGuidanceMsg('予約をキャンセルしました');
220 $this->setAppErrorMsg('予約キャンセルに失敗しました');
222 } else if ($act == 'logout'){ // ログアウトのとき
223 $gAccessManager->userLogout();
226 $gPageManager->redirect($gEnvManager->createCurrentPageUrl());
231 $canCancelReserve = false; // 予約キャンセルできるかどうか
232 $canNewReserve = false; // 新規予約できるかどうか
233 $reservedDate = '予約はありません';
234 $ret = $this->db->getReserveStatus($this->defaultResouceId, $userId, $today, 1/*予約中*/, $rows);
235 if ($ret){ // データが取得できたとき
237 $this->serialNo = $rows[0]['rs_serial'];
240 $this->timestampToYearMonthDay($rows[0]['rs_start_dt'], $reserveYear, $reserveMonth, $reserveDay);
241 $this->timestampToHourMinuteSecond($rows[0]['rs_start_dt'], $reserveHour, $reserveMinute, $reserveSecond);
242 $reservedDate = $reserveYear . '年 ' . $reserveMonth . '月 ' . $reserveDay . '日 ' . $reserveHour. '時 ' . $reserveMinute . '分';
245 $this->reserveDateArray[] = $reserveYear . '/' . $reserveMonth . '/' . $reserveDay;
248 if (strtotime(date("Y/m/d")) < strtotime($reserveYear . '/' . $reserveMonth . '/' . $reserveDay)) $canCancelReserve = true;
251 $canNewReserve = true; // 新規予約できるかどうか
252 $showReservedDate = false; // 予約日のあるカレンダーを表示するかどうか
256 if ($showReservedDate){ // 予約日のあるカレンダーを表示するかどうか
257 if (count($this->reserveDateArray) > 0){
258 $year = $reserveYear;
259 $month = $reserveMonth;
264 $calendarData = $this->createCalendar($year, $month);
265 $this->tmpl->addVar("_widget", "calendar", $calendarData);
268 $userName = $gEnvManager->getCurrentUserName();
269 $this->tmpl->addVar("_widget", "login_status", $userName . ' 様');
272 $this->createTimeMenu(); // 時間メニュー
276 if (!$canNewReserve) $this->tmpl->addVar("_widget", "new_button_disabled", 'disabled'); // ボタン使用不可
278 if ($canCancelReserve) $this->tmpl->setAttribute('cancel_button', 'visibility', 'visible');
281 $todayDate = intval(date("Y")) . '年 ' . intval(date("m")) . '月 ' . intval(date("d")) . '日';
282 $this->tmpl->addVar("_widget", "reserved_date", $reservedDate); // 予約月日登録済み
283 $this->tmpl->addVar("_widget", "reserve_date", $reserveDate); // 予約月日登録用
284 $this->tmpl->addVar("_widget", "today_date", $todayDate); // 本日
285 $this->tmpl->addVar("_widget", "serial", $this->serialNo);
288 $this->tmpl->addVar("_widget", "script_url", $gEnvManager->getScriptsUrl());
294 * @param int $month 月
295 * @param string 生成したカレンダー
297 function createCalendar($year, $month)
299 global $gPageManager;
303 $nowYear = date("Y");
304 $nowMonth = date("m");
307 $calendar = new Calendar_Month_Weekdays($year, $month, 0); // 日曜日を先頭にする
309 $prevMonth = $calendar->prevMonth();
310 $nextMonth = $calendar->nextMonth();
311 if ($prevMonth == 12){
312 $prevYear = $year -1;
316 if ($nextMonth == 1){
317 $nextYear = $year +1;
322 $startDt = $this->convertToProperDate($year . '/' . $month . '/1');
323 $endDt = $this->convertToProperDate($nextYear . '/' . $nextMonth . '/1');
326 $prevUrl = $gEnvManager->createCurrentPageUrl() . '&task=reserve&year=' . $prevYear . '&month=' . $prevMonth;
327 $nextUrl = $gEnvManager->createCurrentPageUrl() . '&task=reserve&year=' . $nextYear . '&month=' . $nextMonth;
330 $calendarData .= '<table class="reserve_calendar">' . M3_NL;
331 $calendarData .= '<div align="center">' . M3_NL;
332 $calendarData .= '<a href="' . $prevUrl . '">' . $prevMonth. '</a>' . M3_NL;
333 $calendarData .= ' | ' . $year . '/' . $month . ' | ' . M3_NL;
334 $calendarData .= '<a href="' . $nextUrl . '">' . $nextMonth . '</a>' . M3_NL;
335 $calendarData .= '</div>' . M3_NL;
336 $calendarData .= '<tr>' . M3_NL;
337 $calendarData .= '<th class="sun">日</th>' . M3_NL;
338 $calendarData .= '<th class="*">月</th>' . M3_NL;
339 $calendarData .= '<th>火</th>' . M3_NL;
340 $calendarData .= '<th>水</th>' . M3_NL;
341 $calendarData .= '<th>木</th>' . M3_NL;
342 $calendarData .= '<th>金</th>' . M3_NL;
343 $calendarData .= '<th class="sat">土</th>' . M3_NL;
344 $calendarData .= '</tr>' . M3_NL;
347 while ($Day = $calendar->fetch()) {
348 if ($Day->isFirst()) {
349 $calendarData .= '<tr>' . M3_NL;
353 if ($Day->isEmpty()) {
354 $calendarData .= '<td> </td>' . M3_NL;
356 $date = intval($year) . '/' . intval($month) . '/' . $Day->thisDay();
357 if (in_array($date, $this->reserveDateArray)){ // 予約ありのとき
358 $weekStr = ' class="select"';
359 $calendarData .= '<td' . $weekStr . '>' . $Day->thisDay() . '</td>' . M3_NL;
360 } else if ($nowYear == $year && $nowMonth == $month && $nowDay == $Day->thisDay()){
361 $weekStr = ' class="today"';
362 $calendarData .= '<td' . $weekStr . '>' . $Day->thisDay() . '</td>' . M3_NL;
365 if ($week == 0){ // 日曜日のとき
366 $weekStr = ' class="sun"';
367 } else if ($week == 6){ // 土曜日のとき
368 $weekStr = ' class="sat"';
370 $calendarData .= '<td' . $weekStr . '>' . $Day->thisDay() . '</td>' . M3_NL;
375 if ($Day->isLast()) {
376 $calendarData .= '</tr>' . M3_NL;
379 $calendarData .= '</table></div>' . M3_NL;
380 return $calendarData;
387 function createTimeMenu()
390 $unitCount = 60 / $this->unitIntervalMinute;
393 for ($j = $this->viewMinHour; $j < $this->viewMaxHour; $j++){
395 if ($j == $this->hour) $selected = 'selected';
399 'selected' => $selected // 選択中かどうか
401 $this->tmpl->addVars('time_hour', $row);
402 $this->tmpl->parseTemplate('time_hour', 'a');
405 for ($j = 0; $j < $unitCount; $j++){
406 $minute = $this->unitIntervalMinute * $j;
408 if ($minute == $this->minute) $selected = 'selected';
410 'value' => $minute, // 値
411 'name' => $minute, // 表示名
412 'selected' => $selected // 選択中かどうか
414 $this->tmpl->addVars('time_minute', $row);
415 $this->tmpl->parseTemplate('time_minute', 'a');
423 function getAvailableTime()
426 $ret = $this->db->getCalendarByWeek(self::DEFAULT_CONFIG_ID, $rows);
429 $newAvailableTime = array();
430 for ($i = 0; $i < 7; $i++){
431 $newAvailableTime[] = array(array(-1, -1, -1, -1), array(-1, -1, -1, -1));
434 $this->viewMinHour = 24; // 最小時間
435 $viewMaxHourMinute = 0; // 最大時間
436 for ($i = 0; $i < count($rows); $i++){
438 $startHour = intval($rows[$i]['ra_start_time'] / 100);
439 $startMinute = $rows[$i]['ra_start_time'] - $startHour * 100;
440 $endHour = intval($rows[$i]['ra_end_time'] / 100);
441 $endMinute = $rows[$i]['ra_end_time'] - $endHour * 100;
444 if ($this->viewMinHour > $startHour) $this->viewMinHour = $startHour;
445 if ($viewMaxHourMinute < $endHour * 100 + $endMinute) $viewMaxHourMinute = $endHour * 100 + $endMinute;
447 if ($rows[$i]['ra_specify_type'] == 1){ // 曜日指定のとき
448 $attr = $rows[$i]['ra_day_attribute'] -1; // 曜日取得
449 if ($newAvailableTime[$attr][0][0] == -1){ // 前半データ
450 $newAvailableTime[$attr][0][0] = $startHour;
451 $newAvailableTime[$attr][0][1] = $startMinute;
452 $newAvailableTime[$attr][0][2] = $endHour;
453 $newAvailableTime[$attr][0][3] = $endMinute;
455 $newAvailableTime[$attr][1][0] = $startHour;
456 $newAvailableTime[$attr][1][1] = $startMinute;
457 $newAvailableTime[$attr][1][2] = $endHour;
458 $newAvailableTime[$attr][1][3] = $endMinute;
463 if ($viewMaxHourMinute > (int)($viewMaxHourMinute / 100) * 100){
464 $this->viewMaxHour = (int)($viewMaxHourMinute / 100) + 1;
466 $this->viewMaxHour = (int)($viewMaxHourMinute / 100);
468 if ($this->viewMaxHour > 24) $this->viewMaxHour = 24;
471 $this->availableTime = $newAvailableTime;