-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathCalendarEditDatetimeHelper.php
More file actions
166 lines (154 loc) · 5.22 KB
/
CalendarEditDatetimeHelper.php
File metadata and controls
166 lines (154 loc) · 5.22 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
<?php
/**
* Calendar Edit Datetime Helper
*
* @author Allcreator Co., Ltd. <info@allcreator.net>
* @link http://www.netcommons.org NetCommons Project
* @license http://www.netcommons.org/license.txt NetCommons License
* @copyright Copyright 2014, NetCommons Project
*/
App::uses('AppHelper', 'View/Helper');
App::uses('NetCommonsTime', 'NetCommons.Utility');
App::uses('CalendarTime', 'Calendars.Utility');
/**
* Calendar Edit Datetime Helper
*
* @author Allcreator Co., Ltd. <info@allcreator.net>
* @package NetCommons\Calendars\View\Helper
*/
class CalendarEditDatetimeHelper extends AppHelper {
/**
* Other helpers used by FormHelper
*
* @var array
*/
public $helpers = array(
'NetCommons.NetCommonsForm',
'NetCommons.NetCommonsHtml',
'Form',
);
/**
* makeEditDatetimeHiddens
*
* @param array $fieldNames 対象のデータのフィールド名(複数
* @return string
*/
public function makeEditDatetimeHiddens($fieldNames) {
$html = '';
foreach ($fieldNames as $fieldName) {
$html .= $this->_getHiddens($fieldName);
}
return $html;
}
/**
* _getHiddens
*
* Hiddenエリア
*
* @param string $fieldName 対象のデータのフィールド名
* @return string HTML
*/
protected function _getHiddens($fieldName) {
$dtValue = isset($this->request->data['CalendarActionPlan'][$fieldName])
? $this->request->data['CalendarActionPlan'][$fieldName]
: null;
// そのフィールドはDatetimePickerでいじるのでunlockFieldとしておく
$this->NetCommonsForm->unlockField('CalendarActionPlan.' . $fieldName);
// 隠しフィールド必須
$html = $this->NetCommonsForm->hidden('CalendarActionPlan.' . $fieldName, array(
'value' => $dtValue
));
return $html;
}
/**
* makeEditDatetimeHtml
*
* 予定日時入力用DatetimePicker作成
*
* @param array $vars カレンダー情報
* @param string $type dateのタイプかdatetimeのタイプか
* @param string $label ラベル
* @param string $fieldName 対象のデータのフィールド名
* @param string $ngModel Ng-Model名
* @param string $jsFuncName JSで処理するファンクション名
* @return string HTML
*/
public function makeEditDatetimeHtml($vars, $type, $label, $fieldName, $ngModel, $jsFuncName) {
//なおdatetimepickerのTZ変換オプション(convert_timezone)をfalseにしているので
//ここで準備するYmdHisはユーザー系TZであることに留意してください。
$html = '';
// 指定フィールドのデータ取り出し
$dtValue = isset($this->request->data['CalendarActionPlan'][$fieldName])
? $this->request->data['CalendarActionPlan'][$fieldName]
: null;
$calTime = new CalendarTime();
$dttmObj = $calTime->getDtObjWithTzDateTimeString(
$this->request->data['CalendarActionPlan']['timezone_offset'],
$dtValue
);
$dtValue = $dttmObj->format('Y-m-d H:i');
$addNgInit = $jsFuncName . "('CalendarActionPlan" . Inflector::camelize($fieldName) . "')";
//$enableTime = $this->request->data['CalendarActionPlan']['enable_time'];
//
if ($type == 'datetime') {
$enableTime = isset($this->request->data['CalendarActionPlan']['enable_time'])
? $this->request->data['CalendarActionPlan']['enable_time']
: null;
// 終日予定の場合 DBに格納されている時刻はいい加減なものなのでカットする
if (! $enableTime) {
$dtValue = substr($dtValue, 0, 10);
}
// 時間指定されている場合はそのまま表記
if (strpos($dtValue, ':') !== false) {
$dtDatetimeVal = $dtValue;
} else {
// 時間が指定されていない場合は開始時間は現在時刻、終了時刻は+1時刻
$userTz = (new NetCommonsTime())->getUserTimezone();
$date = new DateTime('now', (new DateTimeZone($userTz)));
$dtDatetimeVal = $dtValue . ' ' . $date->format('H:') . '00';
if ($ngModel == 'detailEndDatetime') {
$date = new DateTime($dtDatetimeVal);
$date->add(new DateInterval('PT1H'));
$dtDatetimeVal = $date->format('Y-m-d H:i');
}
}
$jsFormat = 'YYYY-MM-DD HH:mm';
} elseif ($type == 'date') {
if (strpos($dtValue, ':') !== false) {
$dtDatetimeVal = substr($dtValue, 0, 10);
} else {
$dtDatetimeVal = $dtValue;
}
$jsFormat = 'YYYY-MM-DD';
}
$ngInit = sprintf("%s = '%s'; ", $ngModel, $dtDatetimeVal) . $addNgInit;
//if ($type == 'datetime') {
// if ($enableTime) {
// $ngInit .= $addNgInit;
// }
//} elseif ($type == 'date') {
// if (! $enableTime) {
// $ngInit .= $addNgInit;
// }
//}
$pickerOpt = str_replace('"', "'", json_encode(array(
'format' => $jsFormat,
'minDate' => CalendarsComponent::CALENDAR_RRULE_TERM_UNTIL_MIN,
'maxDate' => CalendarsComponent::CALENDAR_RRULE_TERM_UNTIL_MAX
)));
$html .= $this->NetCommonsForm->input('CalendarActionPlanForDisp.' . $fieldName,
array(
'div' => false,
'label' => $label,
'data-toggle' => 'dropdown',
'datetimepicker' => 'datetimepicker',
'datetimepicker-options' => $pickerOpt,
//日付だけの場合、User系の必要あるのでoffし、カレンダー側でhandlingする。
'convert_timezone' => false,
'ng-model' => $ngModel,
'ng-change' => $addNgInit, //FIXME: selectイベントに変えたい。
'ng-init' => $ngInit,
));
return $html;
}
}