OSDN Git Service

初回コミット(v2.6.17.1)
[magic3/magic3.git] / widgets / reserve_main / include / container / admin_reserve_mainCalendarWidgetContainer.php
1 <?php
2 /**
3  * コンテナクラス
4  *
5  * PHP versions 5
6  *
7  * LICENSE: This source file is licensed under the terms of the GNU General Public License.
8  *
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: admin_reserve_mainCalendarWidgetContainer.php 491 2008-04-10 03:42:31Z fishbone $
14  * @link       http://www.magic3.org
15  */
16 require_once($gEnvManager->getCurrentWidgetContainerPath() .                    '/admin_reserve_mainBaseWidgetContainer.php');
17 require_once($gEnvManager->getCurrentWidgetDbPath() .   '/reserve_mainDb.php');
18
19 class admin_reserve_mainCalendarWidgetContainer extends admin_reserve_mainBaseWidgetContainer
20 {
21         private $db;    // DB接続オブジェクト
22         private $unitIntervalMinute;// 単位時間(分)
23         private $availableTime = array();       // 選択可能時間
24         const CONFIG_ID = 0;            // 設定ID
25         const UNIT_INTERVAL_MINUTE = 'unit_interval_minute';    // 単位時間(分)
26         
27         /**
28          * コンストラクタ
29          */
30         function __construct()
31         {
32                 // 親クラスを呼び出す
33                 parent::__construct();
34                 
35                 // DBオブジェクト作成
36                 $this->db = new reserve_mainDb();
37         }
38         /**
39          * テンプレートファイルを設定
40          *
41          * _assign()でデータを埋め込むテンプレートファイルのファイル名を返す。
42          * 読み込むディレクトリは、「自ウィジェットディレクトリ/include/template」に固定。
43          *
44          * @param RequestManager $request               HTTPリクエスト処理クラス
45          * @param object         $param                 任意使用パラメータ。そのまま_assign()に渡る
46          * @return string                                               テンプレートファイル名。テンプレートライブラリを使用しない場合は空文字列「''」を返す。
47          */
48         function _setTemplate($request, &$param)
49         {
50                 return 'admin_calendar.tmpl.html';
51         }
52         /**
53          * テンプレートにデータ埋め込む
54          *
55          * _setTemplate()で指定したテンプレートファイルにデータを埋め込む。
56          *
57          * @param RequestManager $request               HTTPリクエスト処理クラス
58          * @param object         $param                 任意使用パラメータ。_setTemplate()と共有。
59          * @param                                                               なし
60          */
61         function _assign($request, &$param)
62         {
63                 global $gEnvManager;
64                 
65                 // 時間間隔を取得
66                 $this->unitIntervalMinute       = $this->db->getReserveConfig(self::CONFIG_ID, self::UNIT_INTERVAL_MINUTE);
67                 if (empty($this->unitIntervalMinute)) $this->unitIntervalMinute = 60;
68                         
69                 $act = $request->trimValueOf('act');
70                 if ($act == 'update'){          // 設定更新のとき
71                         $this->availableTime = array();
72                         // 入力チェック
73                         for ($i = 0; $i < 7; $i++){
74                                 $weekName = '';         // 曜日名
75                                 switch ($i){
76                                         case 0: $weekName = '日曜日'; break;
77                                         case 1: $weekName = '月曜日'; break;
78                                         case 2: $weekName = '火曜日'; break;
79                                         case 3: $weekName = '水曜日'; break;
80                                         case 4: $weekName = '木曜日'; break;
81                                         case 5: $weekName = '金曜日'; break;
82                                         case 6: $weekName = '土曜日'; break;
83                                 }
84                                 $itemName = 'time' . $i . '1_start_hour';
85                                 $itemValue1 = $request->trimValueOf($itemName);
86                                 $itemName = 'time' . $i . '1_start_minute';
87                                 $itemValue2 = $request->trimValueOf($itemName);
88                                 $itemName = 'time' . $i . '1_end_hour';
89                                 $itemValue3 = $request->trimValueOf($itemName);
90                                 $itemName = 'time' . $i . '1_end_minute';
91                                 $itemValue4 = $request->trimValueOf($itemName);
92                                 $itemName = 'time' . $i . '2_start_hour';
93                                 $itemValue5 = $request->trimValueOf($itemName);
94                                 $itemName = 'time' . $i . '2_start_minute';
95                                 $itemValue6 = $request->trimValueOf($itemName);
96                                 $itemName = 'time' . $i . '2_end_hour';
97                                 $itemValue7 = $request->trimValueOf($itemName);
98                                 $itemName = 'time' . $i . '2_end_minute';
99                                 $itemValue8 = $request->trimValueOf($itemName);
100
101                                 // 入力データを保存
102                                 $hourMinute = array(array($itemValue1, $itemValue2, $itemValue3, $itemValue4), array($itemValue5, $itemValue6, $itemValue7, $itemValue8));
103                                 $this->availableTime[] = $hourMinute;
104                                 
105                                 $startTime1 = -1;
106                                 $endTime1 = -1;
107                                 $startTime2 = -1;
108                                 $endTime2 = -1;
109                                 if ($this->getMsgCount() == 0){                 // エラーのないとき
110                                         // 前半の入力チェック
111                                         if ($itemValue1 != -1 ||
112                                                 $itemValue2 != -1 ||
113                                                 $itemValue3 != -1 ||
114                                                 $itemValue4 != -1){                     // 値が入力されているとき
115                                                 if ($itemValue1 == -1 ||
116                                                         $itemValue2 == -1 ||
117                                                         $itemValue3 == -1 ||
118                                                         $itemValue4 == -1){                     // すべての値が入力されていなければエラー
119                                                         $this->setUserErrorMsg('選択されていないフィールドがあります。曜日=' . $weekName);
120                                                 } else {
121                                                         // 範囲のチェック
122                                                         $startTime1 = intval($itemValue1) * 100 + intval($itemValue2);
123                                                         $endTime1 = intval($itemValue3) * 100 + intval($itemValue4);
124                                                         if ($startTime1 >= $endTime1) $this->setUserErrorMsg('指定範囲にエラーがあります。曜日=' . $weekName);
125                                                 }
126                                         }
127                                         // 後半の入力チェック
128                                         if ($itemValue5 != -1 ||
129                                                 $itemValue6 != -1 ||
130                                                 $itemValue7 != -1 ||
131                                                 $itemValue8 != -1){                     // 値が入力されているとき
132                                                 if ($itemValue5 == -1 ||
133                                                         $itemValue6 == -1 ||
134                                                         $itemValue7 == -1 ||
135                                                         $itemValue8 == -1){                     // すべての値が入力されていなければエラー
136                                                         $this->setUserErrorMsg('選択されていないフィールドがあります。曜日=' . $weekName);
137                                                 } else {
138                                                         // 範囲のチェック
139                                                         $startTime2 = intval($itemValue5) * 100 + intval($itemValue6);
140                                                         $endTime2 = intval($itemValue7) * 100 + intval($itemValue8);
141                                                         if ($startTime2 >= $endTime2) $this->setUserErrorMsg('指定範囲にエラーがあります。曜日=' . $weekName);
142                                                 }
143                                         }
144                                         // 前半、後半の整合チェック
145                                         if ($this->getMsgCount() == 0){                 // エラーのないとき
146                                                 if ($startTime1 != -1 && $endTime1 != -1 && $startTime2 != -1 && $endTime2 != -1){
147                                                         if ($endTime1 >= $startTime2) $this->setUserErrorMsg('指定範囲にエラーがあります。曜日=' . $weekName);
148                                                 }
149                                         }
150                                 }
151                         }
152                         if ($this->getMsgCount() == 0){                 // エラーのないとき
153                                 // トランザクションスタート
154                                 $this->db->startTransaction();
155                                 
156                                 // 登録項目を一旦削除
157                                 $ret = $this->db->deleteAllCalendar(self::CONFIG_ID);
158                                 
159                                 if ($ret){
160                                         // データを登録
161                                         for ($i = 0; $i < 7; $i++){
162                                                 $hourMinute             = $this->availableTime[$i];                     // 設定時分を取得
163                                                 $startHour              = $hourMinute[0][0];
164                                                 $startMinute    = $hourMinute[0][1];
165                                                 $endHour                = $hourMinute[0][2];
166                                                 $endMinute              = $hourMinute[0][3];
167                                                 $startHour2             = $hourMinute[1][0];
168                                                 $startMinute2   = $hourMinute[1][1];
169                                                 $endHour2               = $hourMinute[1][2];
170                                                 $endMinute2             = $hourMinute[1][3];
171                                         
172                                                 // 指定方法
173                                                 $specifyType = 1;       // 曜日指定
174                                                 $attr = $i + 1;         // 曜日
175                                                 
176                                                 // 前半を追加
177                                                 if ($startHour != -1){          // データが存在するとき
178                                                         $startTime = intval($startHour) * 100 + intval($startMinute);
179                                                         $endTime = intval($endHour) * 100 + intval($endMinute);
180                                                         $ret = $this->db->addCalendar(self::CONFIG_ID, 1/*通常*/, $specifyType, $attr, ''/*日付なし*/, $startTime, $endTime, 1/*利用可能*/);
181                                                         if (!$ret) break;
182                                                 }
183                                                 
184                                                 // 後半を追加
185                                                 if ($startHour2 != -1){         // データが存在するとき
186                                                         $startTime = intval($startHour2) * 100 + intval($startMinute2);
187                                                         $endTime = intval($endHour2) * 100 + intval($endMinute2);
188                                                         $ret = $this->db->addCalendar(self::CONFIG_ID, 1/*通常*/, $specifyType, $attr, ''/*日付なし*/, $startTime, $endTime, 1/*利用可能*/);
189                                                         if (!$ret) break;
190                                                 }
191                                         }
192                                 }
193                                 
194                                 // トランザクション終了
195                                 $ret = $this->db->endTransaction();
196                                 if ($ret){
197                                         $this->setMsg(self::MSG_GUIDANCE, 'データを更新しました');
198                                 } else {
199                                         $this->setMsg(self::MSG_APP_ERR, 'データ更新に失敗しました');
200                                 }                               
201                         }
202                 }
203                 // 設定値を取得
204                 $ret = $this->db->getCalendarByWeek(self::CONFIG_ID, $rows);
205                 if ($ret){
206                         // データ初期化
207                         $newAvailableTime = array();
208                         for ($i = 0; $i < 7; $i++){
209                                 $newAvailableTime[] = array(array(-1, -1, -1, -1), array(-1, -1, -1, -1));
210                         }
211                         for ($i = 0; $i < count($rows); $i++){
212                                 // 時間を解析
213                                 $startHour              = intval($rows[$i]['ra_start_time'] / 100);
214                                 $startMinute    = $rows[$i]['ra_start_time'] - $startHour * 100;
215                                 $endHour                = intval($rows[$i]['ra_end_time'] / 100);
216                                 $endMinute              = $rows[$i]['ra_end_time'] - $endHour * 100;
217
218                                 if ($rows[$i]['ra_specify_type'] == 1){         // 曜日指定のとき
219                                         $attr = $rows[$i]['ra_day_attribute'] -1;               // 曜日取得
220                                         if ($newAvailableTime[$attr][0][0] == -1){      // 前半データ
221                                                 $newAvailableTime[$attr][0][0] = $startHour;
222                                                 $newAvailableTime[$attr][0][1] = $startMinute;
223                                                 $newAvailableTime[$attr][0][2] = $endHour;
224                                                 $newAvailableTime[$attr][0][3] = $endMinute;
225                                         } else {                // 後半データ
226                                                 $newAvailableTime[$attr][1][0] = $startHour;
227                                                 $newAvailableTime[$attr][1][1] = $startMinute;
228                                                 $newAvailableTime[$attr][1][2] = $endHour;
229                                                 $newAvailableTime[$attr][1][3] = $endMinute;
230                                         }
231                                 }
232                         }
233                         // 取得値を更新
234                         $this->availableTime = $newAvailableTime;
235                 }
236                 
237                 // 時間メニューを作成
238                 $this->createTimeMenu();
239         }
240         /**
241          * 時間メニューを作成
242          *
243          * @return なし
244          */
245         function createTimeMenu()
246         {
247                 // 1時間あたりの分割数
248                 $unitCount = 60 / $this->unitIntervalMinute;
249                 
250                 // デフォルトメニュー作成
251                 for ($i = 0; $i < 7; $i++){
252                         // メニュー名作成
253                         $menuName1 = 'time' . $i . '1_start_hour';
254                         $menuName2 = 'time' . $i . '1_start_minute';
255                         $menuName3 = 'time' . $i . '1_end_hour';
256                         $menuName4 = 'time' . $i . '1_end_minute';
257                         $menuName5 = 'time' . $i . '2_start_hour';
258                         $menuName6 = 'time' . $i . '2_start_minute';
259                         $menuName7 = 'time' . $i . '2_end_hour';
260                         $menuName8 = 'time' . $i . '2_end_minute';
261                         
262                         if (count($this->availableTime) > 0){
263                                 $hourMinute = $this->availableTime[$i];                 // 設定時分を取得
264                                 $selectedStartHour = $hourMinute[0][0];
265                                 $selectedStartMinute = $hourMinute[0][1];
266                                 $selectedEndHour = $hourMinute[0][2];
267                                 $selectedEndMinute = $hourMinute[0][3];
268                                 $selectedStartHour2 = $hourMinute[1][0];
269                                 $selectedStartMinute2 = $hourMinute[1][1];
270                                 $selectedEndHour2 = $hourMinute[1][2];
271                                 $selectedEndMinute2 = $hourMinute[1][3];
272                         } else {
273                                 $selectedStartHour = -1;
274                                 $selectedStartMinute = -1;
275                                 $selectedEndHour = -1;
276                                 $selectedEndMinute = -1;
277                                 $selectedStartHour2 = -1;
278                                 $selectedStartMinute2 = -1;
279                                 $selectedEndHour2 = -1;
280                                 $selectedEndMinute2 = -1;
281                         }
282                                                 
283                         // 時メニュー作成
284                         for ($j = 0; $j < 24; $j++){
285                                 // 前半の時間帯
286                                 $selected = '';
287                                 if ($j == $selectedStartHour) $selected = 'selected';
288                                 $row = array(
289                                         'value'    => $j,                       // 値
290                                         'name'     => $j,                       // 表示名
291                                         'selected' => $selected         // 選択中かどうか
292                                 );
293                                 $this->tmpl->addVars($menuName1, $row);
294                                 $this->tmpl->parseTemplate($menuName1, 'a');
295
296                                 $selected = '';
297                                 if ($j == $selectedEndHour) $selected = 'selected';
298                                 $row = array(
299                                         'value'    => $j,                       // 値
300                                         'name'     => $j,                       // 表示名
301                                         'selected' => $selected         // 選択中かどうか
302                                 );
303                                 $this->tmpl->addVars($menuName3, $row);
304                                 $this->tmpl->parseTemplate($menuName3, 'a');
305                                 
306                                 // 後半の時間帯
307                                 $selected = '';
308                                 if ($j == $selectedStartHour2) $selected = 'selected';
309                                 $row = array(
310                                         'value'    => $j,                       // 値
311                                         'name'     => $j,                       // 表示名
312                                         'selected' => $selected         // 選択中かどうか
313                                 );
314                                 $this->tmpl->addVars($menuName5, $row);
315                                 $this->tmpl->parseTemplate($menuName5, 'a');
316
317                                 $selected = '';
318                                 if ($j == $selectedEndHour2) $selected = 'selected';
319                                 $row = array(
320                                         'value'    => $j,                       // 値
321                                         'name'     => $j,                       // 表示名
322                                         'selected' => $selected         // 選択中かどうか
323                                 );
324                                 $this->tmpl->addVars($menuName7, $row);
325                                 $this->tmpl->parseTemplate($menuName7, 'a');
326                         }
327                         // 分メニュー作成
328                         for ($j = 0; $j < $unitCount; $j++){
329                                 // 前半の時間帯
330                                 $minute = $this->unitIntervalMinute * $j;
331                                 $selected = '';
332                                 if ($minute == $selectedStartMinute) $selected = 'selected';
333                                 $row = array(
334                                         'value'    => $minute,                  // 値
335                                         'name'     => $minute,                  // 表示名
336                                         'selected' => $selected         // 選択中かどうか
337                                 );
338                                 $this->tmpl->addVars($menuName2, $row);
339                                 $this->tmpl->parseTemplate($menuName2, 'a');
340                                 
341                                 $selected = '';
342                                 if ($minute == $selectedEndMinute) $selected = 'selected';
343                                 $row = array(
344                                         'value'    => $minute,                  // 値
345                                         'name'     => $minute,                  // 表示名
346                                         'selected' => $selected         // 選択中かどうか
347                                 );
348                                 $this->tmpl->addVars($menuName4, $row);
349                                 $this->tmpl->parseTemplate($menuName4, 'a');
350                                 
351                                 // 後半の時間帯
352                                 $selected = '';
353                                 if ($minute == $selectedStartMinute2) $selected = 'selected';
354                                 $row = array(
355                                         'value'    => $minute,                  // 値
356                                         'name'     => $minute,                  // 表示名
357                                         'selected' => $selected         // 選択中かどうか
358                                 );
359                                 $this->tmpl->addVars($menuName6, $row);
360                                 $this->tmpl->parseTemplate($menuName6, 'a');
361                                 
362                                 $selected = '';
363                                 if ($minute == $selectedEndMinute2) $selected = 'selected';
364                                 $row = array(
365                                         'value'    => $minute,                  // 値
366                                         'name'     => $minute,                  // 表示名
367                                         'selected' => $selected         // 選択中かどうか
368                                 );
369                                 $this->tmpl->addVars($menuName8, $row);
370                                 $this->tmpl->parseTemplate($menuName8, 'a');
371                         }
372                 }
373         }
374 }
375 ?>