ILIAS  release_5-1 Revision 5.0.0-5477-g43f3e3fab5f
class.ilDateTimeInputGUI.php
Go to the documentation of this file.
1<?php
2/* Copyright (c) 1998-2009 ILIAS open source, Extended GPL, see docs/LICENSE */
3
11include_once("./Services/Table/interfaces/interface.ilTableFilterItem.php");
13{
14 protected $mode = null;
15 protected $date_obj = null;
16 protected $date;
17 protected $time = "00:00:00";
18 protected $showtime = false;
19 protected $showseconds = false;
20 protected $minute_step_size = 1;
21 protected $show_empty = false;
22 protected $startyear = '';
23
24 protected $activation_title = '';
25 protected $activation_post_var = '';
26
27 const MODE_SELECT = 1;
28 const MODE_INPUT = 2;
29
36 function __construct($a_title = "", $a_postvar = "")
37 {
38 parent::__construct($a_title, $a_postvar);
39 $this->setType("datetime");
40 $this->setMode(self::MODE_SELECT);
41 }
42
48 function setMode($mode)
49 {
50 if(in_array($mode, array(self::MODE_INPUT, self::MODE_SELECT)))
51 {
52 $this->mode = $mode;
53 }
54 }
55
61 function getMode()
62 {
63 return $this->mode;
64 }
65
76 public function enableDateActivation($a_title,$a_postvar,$a_checked = true)
77 {
78 $this->activation_title = $a_title;
79 $this->activation_post_var = $a_postvar;
80 $this->activation_checked = $a_checked;
81 }
82
89 public function getActivationPostVar()
90 {
92 }
93
105 function setDate(ilDateTime $a_date = NULL)
106 {
107 $this->date = $a_date;
108 }
109
115 function getDate()
116 {
117 return $this->date;
118 }
119
125 function setShowTime($a_showtime)
126 {
127 $this->showtime = $a_showtime;
128 }
129
135 function getShowTime()
136 {
137 return $this->showtime;
138 }
139
145 function setShowEmpty($a_empty)
146 {
147 $this->show_empty = $a_empty;
148 }
149
155 function getShowEmpty()
156 {
157 return $this->show_empty;
158 }
159
165 function setStartYear($a_year)
166 {
167 $this->startyear = $a_year;
168 }
169
175 function getStartYear()
176 {
177 return $this->startyear;
178 }
179
188 public function setMinuteStepSize($a_step_size)
189 {
190 $this->minute_step_size = $a_step_size;
191 }
192
199 public function getMinuteStepSize()
200 {
202 }
203
204
205
211 function setShowSeconds($a_showseconds)
212 {
213 $this->showseconds = $a_showseconds;
214 }
215
221 function getShowSeconds()
222 {
223 return $this->showseconds;
224 }
225
231 function setValueByArray($a_values)
232 {
233 global $ilUser;
234
235 if($this->getMode() == self::MODE_INPUT &&
236 (!isset($a_values[$this->getPostVar()]["date"]) || $a_values[$this->getPostVar()]["date"] == ""))
237 {
238 $this->date = NULL;
239 }
240 else if(isset($a_values[$this->getPostVar()]["time"]))
241 {
242 $this->setDate(new ilDateTime($a_values[$this->getPostVar()]["date"].' '.$a_values[$this->getPostVar()]["time"],
243 IL_CAL_DATETIME,$ilUser->getTimeZone()));
244 }
245 else if (isset($a_values[$this->getPostVar()]["date"]))
246 {
247 $this->setDate(new ilDate($a_values[$this->getPostVar()]["date"],
248 IL_CAL_DATE));
249 }
250
251 if($this->activation_post_var)
252 {
253 $this->activation_checked = (bool)$a_values[$this->activation_post_var];
254 }
255
256 foreach($this->getSubItems() as $item)
257 {
258 $item->setValueByArray($a_values);
259 }
260 }
261
267 function checkInput()
268 {
269 global $ilUser, $lng;
270
271 if ($this->getDisabled())
272 {
273 return true;
274 }
275
276 $post = $_POST[$this->getPostVar()];
277
278 // empty date valid with input field
279 if(!$this->getRequired() && $this->getMode() == self::MODE_INPUT && $post["date"] == "")
280 {
281 return true;
282 }
283
284 if($this->getMode() == self::MODE_SELECT)
285 {
286 $post["date"]["y"] = ilUtil::stripSlashes($post["date"]["y"]);
287 $post["date"]["m"] = ilUtil::stripSlashes($post["date"]["m"]);
288 $post["date"]["d"] = ilUtil::stripSlashes($post["date"]["d"]);
289 $dt['year'] = (int) $post['date']['y'];
290 $dt['mon'] = (int) $post['date']['m'];
291 $dt['mday'] = (int) $post['date']['d'];
292
293 if($this->getShowTime())
294 {
295 $post["time"]["h"] = ilUtil::stripSlashes($post["time"]["h"]);
296 $post["time"]["m"] = ilUtil::stripSlashes($post["time"]["m"]);
297 $post["time"]["s"] = ilUtil::stripSlashes($post["time"]["s"]);
298 $dt['hours'] = (int) $post['time']['h'];
299 $dt['minutes'] = (int) $post['time']['m'];
300 $dt['seconds'] = (int) $post['time']['s'];
301 }
302 }
303 else
304 {
305 $post["date"] = ilUtil::stripSlashes($post["date"]);
306 $post["time"] = ilUtil::stripSlashes($post["time"]);
307
308 if($post["date"])
309 {
310 switch($ilUser->getDateFormat())
311 {
313 $date = explode(".", $post["date"]);
314 $dt['mday'] = (int)$date[0];
315 $dt['mon'] = (int)$date[1];
316 $dt['year'] = (int)$date[2];
317 break;
318
320 $date = explode("-", $post["date"]);
321 $dt['mday'] = (int)$date[2];
322 $dt['mon'] = (int)$date[1];
323 $dt['year'] = (int)$date[0];
324 break;
325
327 $date = explode("/", $post["date"]);
328 $dt['mday'] = (int)$date[1];
329 $dt['mon'] = (int)$date[0];
330 $dt['year'] = (int)$date[2];
331 break;
332 }
333
334 if($this->getShowTime())
335 {
336 if($ilUser->getTimeFormat() == ilCalendarSettings::TIME_FORMAT_12)
337 {
338 $seconds = "";
339 if($this->getShowSeconds())
340 {
341 $seconds = ":\s*([0-9]{1,2})\s*";
342 }
343 if(preg_match("/([0-9]{1,2})\s*:\s*([0-9]{1,2})\s*".$seconds."(am|pm)/", trim(strtolower($post["time"])), $matches))
344 {
345 $dt['hours'] = (int)$matches[1];
346 $dt['minutes'] = (int)$matches[2];
347 if($seconds)
348 {
349 $dt['seconds'] = (int)$time[2];
350 $ampm = $matches[4];
351 }
352 else
353 {
354 $dt['seconds'] = 0;
355 $ampm = $matches[3];
356 }
357 if($dt['hours'] == 12)
358 {
359 if($ampm == "am")
360 {
361 $dt['hours'] = 0;
362 }
363 }
364 else if($ampm == "pm")
365 {
366 $dt['hours'] += 12;
367 }
368 }
369 }
370 else
371 {
372 $time = explode(":", $post["time"]);
373 $dt['hours'] = (int)$time[0];
374 $dt['minutes'] = (int)$time[1];
375 $dt['seconds'] = (int)$time[2];
376 }
377 }
378 }
379 }
380
381 // very basic validation
382 if($dt['mday'] == 0 || $dt['mon'] == 0 || $dt['year'] == 0 || $dt['mday'] > 31 || $dt['mon'] > 12)
383 {
384 $dt = false;
385 }
386 else if($this->getShowTime() && ($dt['hours'] > 23 || $dt['minutes'] > 59 || $dt['seconds'] > 59))
387 {
388 $dt = false;
389 }
390
391 // #11847
392 if(!checkdate($dt['mon'], $dt['mday'], $dt['year']))
393 {
394 $this->invalid_input = $_POST[$this->getPostVar()]['date'];
395 $this->setAlert($lng->txt("exc_date_not_valid"));
396 $dt = false;
397 }
398
399 if($this->getShowTime())
400 {
401 $date = new ilDateTime($dt, IL_CAL_FKT_GETDATE, $ilUser->getTimeZone());
402 $this->setDate($date);
403 }
404 else
405 {
406 $date = new ilDate($dt, IL_CAL_FKT_GETDATE);
407 $this->setDate($date);
408 }
409
410 // post values used to be overwritten anyways - cannot change behaviour
411 $_POST[$this->getPostVar()]['date'] = $date->get(IL_CAL_FKT_DATE, 'Y-m-d', $ilUser->getTimeZone());
412 $_POST[$this->getPostVar()]['time'] = $date->get(IL_CAL_FKT_DATE, 'H:i:s', $ilUser->getTimeZone());
413
414 return (bool)$dt;
415 }
416
421 function render()
422 {
423 global $lng,$ilUser;
424
425 $tpl = new ilTemplate("tpl.prop_datetime.html", true, true, "Services/Form");
426
427 $lng->loadLanguageModule("jscalendar");
428 require_once("./Services/Calendar/classes/class.ilCalendarUtil.php");
430
431 if(strlen($this->getActivationPostVar()))
432 {
433 if(!$this->activation_checked)
434 {
435 $tpl->setCurrentBlock('sub_form_hide');
436 $tpl->setVariable('DSFID',$this->getFieldId());
437 $tpl->parseCurrentBlock();
438 }
439
440 if($this->getInfo())
441 {
442 $tpl->setCurrentBlock('activation_description');
443 $tpl->setVariable('ACT_DESCRIPTION',$this->getInfo());
444 $tpl->parseCurrentBlock();
445
446 // disable standard info block
447 $this->setInfo(null);
448 }
449
450 $tpl->setCurrentBlock('prop_date_activation');
451 $tpl->setVariable('LAB_ID',$this->getFieldId());
452 $tpl->setVariable('SFID',$this->getFieldId());
453 $tpl->setVariable('CHECK_ENABLED_DATE',$this->getActivationPostVar());
454 $tpl->setVariable('TXT_DATE_ENABLED',$this->activation_title);
455 $tpl->setVariable('CHECKED_ENABLED',$this->activation_checked ? 'checked="checked"' : '');
456 $tpl->setVariable('CHECKED_DISABLED',$this->getDisabled() ? 'disabled="disabled" ' : '');
457 $tpl->parseCurrentBlock();
458
459 $tpl->touchBlock('prop_date_activation_out');
460 }
461
462 if($this->getMode() == self::MODE_SELECT)
463 {
464 if(is_a($this->getDate(),'ilDate'))
465 {
466 $date_info = $this->getDate()->get(IL_CAL_FKT_GETDATE,'','UTC');
467 }
468 elseif(is_a($this->getDate(),'ilDateTime'))
469 {
470 $date_info = $this->getDate()->get(IL_CAL_FKT_GETDATE,'',$ilUser->getTimeZone());
471 }
472 else
473 {
474 $this->setDate(new ilDateTime(time(), IL_CAL_UNIX));
475 $date_info = $this->getDate()->get(IL_CAL_FKT_GETDATE,'',$ilUser->getTimeZone());
476 }
477
478 // display invalid input again
479 if(is_array($this->invalid_input))
480 {
481 $date_info['year'] = $this->invalid_input['y'];
482 $date_info['mon'] = $this->invalid_input['m'];
483 $date_info['mday'] = $this->invalid_input['d'];
484 }
485 }
486
487 if($this->getMode() == self::MODE_SELECT)
488 {
489 $tpl->setCurrentBlock("prop_date_input_select_setup");
490 $tpl->setVariable("INPUT_FIELDS_DATE", $this->getPostVar()."[date]");
491 $tpl->parseCurrentBlock();
492
493 $tpl->setCurrentBlock("prop_date");
494 $tpl->setVariable("DATE_SELECT",
495 ilUtil::makeDateSelect($this->getPostVar()."[date]", $date_info['year'], $date_info['mon'], $date_info['mday'],
496 $this->startyear,true,array('disabled' => $this->getDisabled()), $this->getShowEmpty()));
497 }
498 else
499 {
500 $value = $this->getDate();
501 if($value)
502 {
503 $value = substr($this->getDate()->get(IL_CAL_DATETIME), 0, 10);
504 $day = substr($value, 8, 2);
505 $month = substr($value, 5, 2);
506 $year = substr($value, 0, 4);
507 }
508
509 switch($ilUser->getDateFormat())
510 {
512 if($value)
513 {
514 $value = date("d.m.Y", mktime(0, 0, 0, $month, $day, $year));
515 }
516 $format = "%d.%m.%Y";
517 $input_hint = $lng->txt("dd_mm_yyyy");
518 break;
519
521 if($value)
522 {
523 $value = date("Y-m-d", mktime(0, 0, 0, $month, $day, $year));
524 }
525 $format = "%Y-%m-%d";
526 $input_hint = $lng->txt("yyyy_mm_dd");
527 break;
528
530 if($value)
531 {
532 $value = date("m/d/Y", mktime(0, 0, 0, $month, $day, $year));
533 }
534 $format = "%m/%d/%Y";
535 $input_hint = $lng->txt("mm_dd_yyyy");
536 break;
537 }
538
539 // #17232
540 if($this->invalid_input)
541 {
542 $value = $this->invalid_input;
543 }
544
545 $tpl->setCurrentBlock("prop_date_input_field");
546 $tpl->setVariable("DATE_ID", $this->getPostVar());
547 $tpl->setVariable("DATE_VALUE", $value);
548 $tpl->setVariable("DISABLED", $this->getDisabled() ? " disabled=\"disabled\"" : "");
549 $tpl->parseCurrentBlock();
550
551 $tpl->setCurrentBlock("prop_date_input_field_info");
552 $tpl->setVariable("TXT_INPUT_FORMAT", $input_hint);
553 $tpl->parseCurrentBlock();
554
555 $tpl->setCurrentBlock("prop_date_input_field_setup");
556 $tpl->setVariable("DATE_ID", $this->getPostVar());
557 $tpl->setVariable("DATE_FIELD_FORMAT", $format);
558 $tpl->parseCurrentBlock();
559 }
560
561 $tpl->setCurrentBlock("prop_date");
562 include_once("./Services/UIComponent/Glyph/classes/class.ilGlyphGUI.php");
563 $tpl->setVariable("IMG_DATE_CALENDAR", ilGlyphGUI::get(ilGlyphGUI::CALENDAR, $lng->txt("open_calendar")));
564 $tpl->setVariable("DATE_ID", $this->getPostVar());
565
566 include_once './Services/Calendar/classes/class.ilCalendarUserSettings.php';
567 $tpl->setVariable('DATE_FIRST_DAY',ilCalendarUserSettings::_getInstance()->getWeekStart());
568
569 $tpl->parseCurrentBlock();
570
571 if($this->getShowTime())
572 {
573 if($this->getMode() == self::MODE_INPUT)
574 {
575 $value = $this->getDate();
576 if($value)
577 {
578 if(!$this->getShowSeconds())
579 {
580 $value = substr($value->get(IL_CAL_DATETIME), 11, 5);
581 if($ilUser->getTimeFormat() == ilCalendarSettings::TIME_FORMAT_12)
582 {
583 $value = date("g:ia", mktime(substr($value, 0, 2), substr($value, 3, 2)));
584 }
585 }
586 else
587 {
588 $value = substr($value->get(IL_CAL_DATETIME), 11, 8);
589 if($ilUser->getTimeFormat() == ilCalendarSettings::TIME_FORMAT_12)
590 {
591 $value = date("g:i:sa", mktime(substr($value, 0, 2), substr($value, 3, 2), substr($value, 6, 2)));
592 }
593 }
594 }
595
596 $tpl->setCurrentBlock("prop_time_input_field");
597 $tpl->setVariable("DATE_ID", $this->getPostVar());
598 $tpl->setVariable("TIME_VALUE", $value);
599 $tpl->setVariable("DISABLED", $this->getDisabled() ? " disabled=\"disabled\"" : "");
600 $tpl->parseCurrentBlock();
601 }
602
603 $tpl->setCurrentBlock("prop_time");
604
605 if($this->getMode() == self::MODE_SELECT)
606 {
607 $tpl->setVariable("TIME_SELECT",
608 ilUtil::makeTimeSelect($this->getPostVar()."[time]", !$this->getShowSeconds(),
609 $date_info['hours'], $date_info['minutes'], $date_info['seconds'],
610 true,array('minute_steps' => $this->getMinuteStepSize(),
611 'disabled' => $this->getDisabled())));
612 }
613
614 $tpl->setVariable("TXT_TIME", $this->getShowSeconds()
615 ? "(".$lng->txt("hh_mm_ss").")"
616 : "(".$lng->txt("hh_mm").")");
617
618 $tpl->parseCurrentBlock();
619 }
620
621 return $tpl->get();
622 }
623
629 function insert(&$a_tpl)
630 {
631 $html = $this->render();
632
633 $a_tpl->setCurrentBlock("prop_generic");
634 $a_tpl->setVariable("PROP_GENERIC", $html);
635 $a_tpl->parseCurrentBlock();
636 }
637
642 {
643 $html = $this->render();
644 return $html;
645 }
646
650 function serializeData()
651 {
652 return serialize($this->getDate());
653 }
654
658 function unserializeData($a_data)
659 {
660 $data = unserialize($a_data);
661
662 if (is_object($data))
663 {
664 $this->setDate($data);
665 }
666 }
667
674 {
675 return trim($_POST[$this->getPostVar()]["date"]." ". $_POST[$this->getPostVar()]["time"]);
676 }
677
681 function getToolbarHTML()
682 {
683 $html = $this->render("toolbar");
684 return $html;
685 }
686}
687
688?>
global $tpl
Definition: ilias.php:8
const IL_CAL_FKT_GETDATE
const IL_CAL_DATE
const IL_CAL_UNIX
const IL_CAL_DATETIME
const IL_CAL_FKT_DATE
static _getInstance()
get instance for logged in user
static initJSCalendar()
Init Javascript Calendar.
This class represents a date/time property in a property form.
render()
Insert property html.
setMode($mode)
Set Display Mode.
setStartYear($a_year)
Set start year.
insert(&$a_tpl)
Insert property html.
setShowEmpty($a_empty)
Set Show Empty Information.
getShowEmpty()
Get Show Empty Information.
getTableFilterHTML()
Get HTML for table filter.
getToolbarHTML()
Get HTML for toolbar.
getMinuteStepSize()
Get minute step size.
getShowTime()
Get Show Time Information.
__construct($a_title="", $a_postvar="")
Constructor.
setMinuteStepSize($a_step_size)
Set minute step size E.g 5 => The selection will only show 00,05,10... minutes.
enableDateActivation($a_title, $a_postvar, $a_checked=true)
Enable date activation.
getMode()
Get Display Mode.
getShowSeconds()
Get Show Seconds.
getPostValueForComparison()
parse post value to make it comparable
unserializeData($a_data)
unserialize data
checkInput()
Check input, strip slashes etc.
setDate(ilDateTime $a_date=NULL)
set date E.g $dt_form->setDate(new ilDateTime(time(),IL_CAL_UTC)); or $dt_form->setDate(new ilDateTim...
setShowTime($a_showtime)
Set Show Time Information.
getActivationPostVar()
Get activation post var.
getDate()
Get Date, yyyy-mm-dd.
setValueByArray($a_values)
Set value by array.
setShowSeconds($a_showseconds)
Set Show Seconds.
@classDescription Date and time handling
Class for single dates.
setType($a_type)
Set Type.
getInfo()
Get Information Text.
getPostVar()
Get Post Variable.
setInfo($a_info)
Set Information Text.
setAlert($a_alert)
Set Alert Text.
getFieldId()
Get Post Variable.
static get($a_glyph, $a_text="")
Get glyph html.
This class represents a property that may include a sub form.
special template class to simplify handling of ITX/PEAR
static makeDateSelect($prefix, $year="", $month="", $day="", $startyear="", $a_long_month=true, $a_further_options=array(), $emptyoption=false)
Creates a combination of HTML selects for date inputs.
static stripSlashes($a_str, $a_strip_html=true, $a_allow="")
strip slashes if magic qoutes is enabled
static makeTimeSelect($prefix, $short=true, $hour="", $minute="", $second="", $a_use_default=true, $a_further_options=array())
Creates a combination of HTML selects for time inputs.
$_POST['username']
Definition: cron.php:12
$html
Definition: example_001.php:87
$data
Interface for property form input GUI classes that can be used in table filters.
Interface for property form input GUI classes that can be used in ilToolbarGUI.
global $lng
Definition: privfeed.php:40
global $ilUser
Definition: imgupload.php:15