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 
11 include_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 ?>
setShowEmpty($a_empty)
Set Show Empty Information.
Interface for property form input GUI classes that can be used in table filters.
$_POST['username']
Definition: cron.php:12
const IL_CAL_DATETIME
getActivationPostVar()
Get activation post var.
getPostValueForComparison()
parse post value to make it comparable
getPostVar()
Get Post Variable.
getDate()
Get Date, yyyy-mm-dd.
getMinuteStepSize()
Get minute step size.
Interface for property form input GUI classes that can be used in ilToolbarGUI.
static get($a_glyph, $a_text="")
Get glyph html.
setMode($mode)
Set Display Mode.
checkInput()
Check input, strip slashes etc.
setStartYear($a_year)
Set start year.
const IL_CAL_UNIX
setDate(ilDateTime $a_date=NULL)
set date E.g $dt_form->setDate(new ilDateTime(time(),IL_CAL_UTC)); or $dt_form->setDate(new ilDateTim...
__construct($a_title="", $a_postvar="")
Constructor.
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.
setAlert($a_alert)
Set Alert Text.
getMode()
Get Display Mode.
This class represents a date/time property in a property form.
getShowTime()
Get Show Time Information.
global $tpl
Definition: ilias.php:8
setType($a_type)
Set Type.
setInfo($a_info)
Set Information Text.
setValueByArray($a_values)
Set value by array.
getTableFilterHTML()
Get HTML for table filter.
$data
Class for single dates.
setShowSeconds($a_showseconds)
Set Show Seconds.
static _getInstance()
get instance for logged in user
getFieldId()
Get Post Variable.
special template class to simplify handling of ITX/PEAR
const IL_CAL_FKT_DATE
Date and time handling
static stripSlashes($a_str, $a_strip_html=true, $a_allow="")
strip slashes if magic qoutes is enabled
getShowSeconds()
Get Show Seconds.
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.
getShowEmpty()
Get Show Empty Information.
unserializeData($a_data)
unserialize data
const IL_CAL_FKT_GETDATE
enableDateActivation($a_title, $a_postvar, $a_checked=true)
Enable date activation.
setMinuteStepSize($a_step_size)
Set minute step size E.g 5 => The selection will only show 00,05,10...
const IL_CAL_DATE
getToolbarHTML()
Get HTML for toolbar.
global $ilUser
Definition: imgupload.php:15
This class represents a property that may include a sub form.
global $lng
Definition: privfeed.php:40
insert(&$a_tpl)
Insert property html.
getInfo()
Get Information Text.
static initJSCalendar()
Init Javascript Calendar.
getStartYear()
Get start year.
render()
Insert property html.
$html
Definition: example_001.php:87
setShowTime($a_showtime)
Set Show Time Information.