1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
datetimetype.php
См. документацию.
1<?php
2
3namespace Bitrix\Main\UserField\Types;
4
5use Bitrix\Main;
6use Bitrix\Main\Context;
7use Bitrix\Main\Localization\Loc;
8use Bitrix\Main\Text\HtmlFilter;
9use Bitrix\Main\Type;
10use CLang;
11use CUserTypeManager;
12
13Loc::loadMessages(__FILE__);
14
20{
21 public const
22 USER_TYPE_ID = 'datetime',
23 RENDER_COMPONENT = 'bitrix:main.field.datetime';
24
28 public static function getDescription(): array
29 {
30 return [
31 'DESCRIPTION' => Loc::GetMessage('USER_TYPE_DT_DESCRIPTION'),
32 'BASE_TYPE' => CUserTypeManager::BASE_TYPE_DATETIME,
33 ];
34 }
35
39 public static function getDbColumnType(): string
40 {
42 $helper = $connection->getSqlHelper();
43 return $helper->getColumnTypeByField(new \Bitrix\Main\ORM\Fields\DatetimeField('x'));
44 }
45
50 public static function prepareSettings(array $userField): array
51 {
52 $def = $userField['SETTINGS']['DEFAULT_VALUE'] ?? '';
53 $value = '';
54
55 if(!is_array($def))
56 {
57 $def = ['TYPE' => static::TYPE_NONE, 'VALUE' => $value];
58 }
59 elseif(isset($def['TYPE']) && $def['TYPE'] === static::TYPE_FIXED)
60 {
61 $datetimeObject = \DateTime::createFromFormat('Y-m-d H:i:s', $def['VALUE']);
62 if (!$datetimeObject || $datetimeObject->format('Y-m-d H:i:s') !== $def['VALUE'])
63 {
64 $def['VALUE'] = \CDatabase::FormatDate(
65 $def['VALUE'],
66 CLang::GetDateFormat(static::FORMAT_TYPE_FULL),
67 'YYYY-MM-DD HH:MI:SS'
68 );
69 }
70 }
71 elseif(isset($def['TYPE']) && $def['TYPE'] === static::TYPE_NOW)
72 {
73 $def['VALUE'] = $value;
74 }
75 else
76 {
77 $def = ['TYPE' => static::TYPE_NONE, 'VALUE' => $value];
78 }
79
80 return [
81 'DEFAULT_VALUE' => $def,
82 'USE_SECOND' => (($userField['SETTINGS']['USE_SECOND'] ?? 'Y') === 'N' ? 'N' : 'Y'),
83 'USE_TIMEZONE' => (($userField['SETTINGS']['USE_TIMEZONE'] ?? 'N') === 'Y' ? 'Y' : 'N'),
84 ];
85 }
86
92 public static function getFilterData(?array $userField, array $additionalParameters): array
93 {
94 return [
95 'id' => $additionalParameters['ID'],
96 'name' => $additionalParameters['NAME'],
97 'type' => 'date',
98 'time' => true
99 ];
100 }
101
107 public static function checkFields(array $userField, $value): array
108 {
109 $msg = [];
110 $value = (string)$value;
111 if($value !== '')
112 {
113 try
114 {
116 } catch(Main\ObjectException $e)
117 {
118 $msg[] = [
119 'id' => $userField['FIELD_NAME'],
120 'text' => Loc::GetMessage('USER_TYPE_DT_ERROR',
121 [
122 '#FIELD_NAME#' => HtmlFilter::encode(
123 $userField['EDIT_FORM_LABEL'] <> ''
124 ? $userField['EDIT_FORM_LABEL'] : $userField['FIELD_NAME']
125 ),
126 ]
127 ),
128 ];
129 }
130 }
131 return $msg;
132 }
133
140 public static function onAfterFetch(array $userField, array $fetched): string
141 {
142 $value = $fetched['VALUE'];
143
144 if($userField['MULTIPLE'] === 'Y' && !($value instanceof Type\DateTime))
145 {
146 //Invalid value
147 if(mb_strlen($value) <= 1)
148 {
149 //will be ignored by the caller
150 return '';
151 }
152
153 try
154 {
155 //try new independent datetime format
156 $value = new Type\DateTime(
157 $value,
159 );
160 } catch(Main\ObjectException $e)
161 {
162 //try site format
163 try
164 {
165 $value = new Type\DateTime($value);
166 } catch(Main\ObjectException $e)
167 {
168 //try short format
169 $value = Type\DateTime::createFromUserTime($value);
170 }
171 }
172 }
173
174 $isFieldWithoutTimeZone = static::isFieldWithoutTimeZone($userField);
175
176 if ($isFieldWithoutTimeZone)
177 {
178 \CTimeZone::Disable();
179 }
180
181 $value = (string)$value;
182
183 if ($isFieldWithoutTimeZone)
184 {
185 \CTimeZone::Enable();
186 }
187
188 return $value;
189 }
190
191
198 public static function onBeforeSave(?array $userField, $value)
199 {
200 if($value != '' && !($value instanceof Type\DateTime))
201 {
202 $isFieldWithoutTimeZone = static::isFieldWithoutTimeZone($userField);
203
204 if ($isFieldWithoutTimeZone)
205 {
206 \CTimeZone::Disable();
207 }
208
209 $value = Type\DateTime::createFromUserTime($value);
210
211 if ($isFieldWithoutTimeZone)
212 {
213 \CTimeZone::Enable();
214 }
215 }
216
217 return $value;
218 }
219
225 public static function getFormat(string $value, array $userField): string
226 {
227 $format = CLang::GetDateFormat(static::FORMAT_TYPE_FULL);
228
229 if($userField['SETTINGS']['USE_SECOND'] === 'N' && MakeTimeStamp($value) % 60 <= 0)
230 {
231 $format = str_replace(':SS', '', $format);
232 }
233
234 return $format;
235 }
236
242 public static function formatField(?array $userField, string $fieldName): string
243 {
244 global $DB;
245
246 $isFieldWithoutTimeZone = static::isFieldWithoutTimeZone($userField);
247
248 if ($isFieldWithoutTimeZone)
249 {
250 \CTimeZone::Disable();
251 }
252
253 $date = $DB->dateToCharFunction($fieldName, static::FORMAT_TYPE_FULL);
254
255 if ($isFieldWithoutTimeZone)
256 {
257 \CTimeZone::Enable();
258 }
259
260 return $fieldName . ', ' . $date;
261 }
262
267 protected static function isFieldWithoutTimeZone(?array $userField): bool
268 {
269 return (
270 isset($userField['SETTINGS']['USE_TIMEZONE'])
271 &&
272 $userField['SETTINGS']['USE_TIMEZONE']==='N'
273 &&
274 \CTimeZone::Enabled()
275 );
276 }
277
283 public static function charToDate(array $userField, Type\DateTime $dateTime): string
284 {
285 $isFieldWithoutTimeZone = static::isFieldWithoutTimeZone($userField);
286
287 if ($isFieldWithoutTimeZone)
288 {
289 \CTimeZone::Disable();
290 }
291
292 global $DB;
293 $value = $DB->CharToDateFunction($dateTime);
294
295 if ($isFieldWithoutTimeZone)
296 {
297 \CTimeZone::Enable();
298 }
299
300 return (string) $value;
301 }
302
303 public static function getFieldValue(array $userField, array $additionalParameters = [])
304 {
305 $bVarsFromForm = ($additionalParameters['bVarsFromForm'] ?? false);
306 if(!$bVarsFromForm)
307 {
308 if(
309 isset($userField['ENTITY_VALUE_ID'])
310 &&
311 $userField['ENTITY_VALUE_ID'] <= 0
312 )
313 {
314 if($userField['SETTINGS']['DEFAULT_VALUE']['TYPE'] === self::TYPE_NOW)
315 {
316 $value = \ConvertTimeStamp(
317 time() + \CTimeZone::getOffset(),
318 self::FORMAT_TYPE_FULL
319 );
320 }
321 else
322 {
323 $value = str_replace(
324 ' 00:00:00',
325 '',
326 \CDatabase::formatDate(
327 $userField['SETTINGS']['DEFAULT_VALUE']['VALUE'],
328 'YYYY-MM-DD HH:MI:SS',
329 \CLang::getDateFormat(self::FORMAT_TYPE_FULL)
330 )
331 );
332 }
333 }
334 else
335 {
336 $value = $userField['VALUE'] ?? null;
337 }
338 }
339 elseif(isset($additionalParameters['VALUE']))
340 {
341 $value = $additionalParameters['VALUE'];
342 }
343 else
344 {
345 $value = Context::getCurrent()->getRequest()->get($userField['FIELD_NAME']);
346 }
347
348 return $value;
349 }
350}
$connection
Определения actionsdefinitions.php:38
static getConnection($name="")
Определения application.php:638
static createFromUserTime($timeString)
Определения datetime.php:180
static charToDate(array $userField, Type\DateTime $dateTime)
Определения datetimetype.php:283
static getFormat(string $value, array $userField)
Определения datetimetype.php:225
static getFilterData(?array $userField, array $additionalParameters)
Определения datetimetype.php:92
static onBeforeSave(?array $userField, $value)
Определения datetimetype.php:198
static onAfterFetch(array $userField, array $fetched)
Определения datetimetype.php:140
static isFieldWithoutTimeZone(?array $userField)
Определения datetimetype.php:267
static getFieldValue(array $userField, array $additionalParameters=[])
Определения datetimetype.php:303
static checkFields(array $userField, $value)
Определения datetimetype.php:107
static formatField(?array $userField, string $fieldName)
Определения datetimetype.php:242
static prepareSettings(array $userField)
Определения datetimetype.php:50
const MULTIPLE_DATETIME_FORMAT
Определения userfield.php:36
$bVarsFromForm
Определения file_edit.php:44
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
global $DB
Определения cron_frame.php:29
MakeTimeStamp($datetime, $format=false)
Определения tools.php:538
Определения collection.php:2
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
foreach($arTemplatesList as $templ) if(mb_strpos($templ["NAME"] $def
Определения template_copy.php:264