ILIAS  Release_4_4_x_branch Revision 61816
 All Data Structures Namespaces Files Functions Variables Groups Pages
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 $showdate = true;
18  protected $time = "00:00:00";
19  protected $showtime = false;
20  protected $showseconds = false;
21  protected $minute_step_size = 1;
22  protected $show_empty = false;
23  protected $startyear = '';
24 
25  protected $activation_title = '';
26  protected $activation_post_var = '';
27 
28  const MODE_SELECT = 1;
29  const MODE_INPUT = 2;
30 
37  function __construct($a_title = "", $a_postvar = "")
38  {
39  parent::__construct($a_title, $a_postvar);
40  $this->setType("datetime");
41  $this->setMode(self::MODE_SELECT);
42  }
43 
49  function setMode($mode)
50  {
51  if(in_array($mode, array(self::MODE_INPUT, self::MODE_SELECT)))
52  {
53  $this->mode = $mode;
54  }
55  }
56 
62  function getMode()
63  {
64  return $this->mode;
65  }
66 
77  public function enableDateActivation($a_title,$a_postvar,$a_checked = true)
78  {
79  $this->activation_title = $a_title;
80  $this->activation_post_var = $a_postvar;
81  $this->activation_checked = $a_checked;
82  }
83 
90  public function getActivationPostVar()
91  {
93  }
94 
106  function setDate(ilDateTime $a_date = NULL)
107  {
108  $this->date = $a_date;
109  }
110 
116  function getDate()
117  {
118  return $this->date;
119  }
120 
126  function setShowDate($a_showdate)
127  {
128  $this->showdate = $a_showdate;
129  }
130 
136  function getShowDate()
137  {
138  return $this->showdate;
139  }
140 
146  function setShowTime($a_showtime)
147  {
148  $this->showtime = $a_showtime;
149  }
150 
156  function getShowTime()
157  {
158  return $this->showtime;
159  }
160 
166  function setShowEmpty($a_empty)
167  {
168  $this->show_empty = $a_empty;
169  }
170 
176  function getShowEmpty()
177  {
178  return $this->show_empty;
179  }
180 
186  function setStartYear($a_year)
187  {
188  $this->startyear = $a_year;
189  }
190 
196  function getStartYear()
197  {
198  return $this->startyear;
199  }
200 
209  public function setMinuteStepSize($a_step_size)
210  {
211  $this->minute_step_size = $a_step_size;
212  }
213 
220  public function getMinuteStepSize()
221  {
223  }
224 
225 
226 
232  function setShowSeconds($a_showseconds)
233  {
234  $this->showseconds = $a_showseconds;
235  }
236 
242  function getShowSeconds()
243  {
244  return $this->showseconds;
245  }
246 
252  function setValueByArray($a_values)
253  {
254  global $ilUser;
255 
256  if($this->getMode() == self::MODE_INPUT &&
257  (!isset($a_values[$this->getPostVar()]["date"]) || $a_values[$this->getPostVar()]["date"] == ""))
258  {
259  $this->date = NULL;
260  }
261  else if(isset($a_values[$this->getPostVar()]["time"]))
262  {
263  $this->setDate(new ilDateTime($a_values[$this->getPostVar()]["date"].' '.$a_values[$this->getPostVar()]["time"],
264  IL_CAL_DATETIME,$ilUser->getTimeZone()));
265  }
266  else if (isset($a_values[$this->getPostVar()]["date"]))
267  {
268  $this->setDate(new ilDate($a_values[$this->getPostVar()]["date"],
269  IL_CAL_DATE));
270  }
271 
272  if($this->activation_post_var)
273  {
274  $this->activation_checked = (bool)$a_values[$this->activation_post_var];
275  }
276 
277  foreach($this->getSubItems() as $item)
278  {
279  $item->setValueByArray($a_values);
280  }
281  }
282 
288  function checkInput()
289  {
290  global $ilUser, $lng;
291 
292  if ($this->getDisabled())
293  {
294  return true;
295  }
296 
297  $post = $_POST[$this->getPostVar()];
298 
299  // empty date valid with input field
300  if(!$this->getRequired() && $this->getMode() == self::MODE_INPUT && $post["date"] == "")
301  {
302  return true;
303  }
304 
305  if($this->getMode() == self::MODE_SELECT)
306  {
307  $post["date"]["y"] = ilUtil::stripSlashes($post["date"]["y"]);
308  $post["date"]["m"] = ilUtil::stripSlashes($post["date"]["m"]);
309  $post["date"]["d"] = ilUtil::stripSlashes($post["date"]["d"]);
310  $dt['year'] = (int) $post['date']['y'];
311  $dt['mon'] = (int) $post['date']['m'];
312  $dt['mday'] = (int) $post['date']['d'];
313 
314  if($this->getShowTime())
315  {
316  $post["time"]["h"] = ilUtil::stripSlashes($post["time"]["h"]);
317  $post["time"]["m"] = ilUtil::stripSlashes($post["time"]["m"]);
318  $post["time"]["s"] = ilUtil::stripSlashes($post["time"]["s"]);
319  $dt['hours'] = (int) $post['time']['h'];
320  $dt['minutes'] = (int) $post['time']['m'];
321  $dt['seconds'] = (int) $post['time']['s'];
322  }
323  }
324  else
325  {
326  $post["date"] = ilUtil::stripSlashes($post["date"]);
327  $post["time"] = ilUtil::stripSlashes($post["time"]);
328 
329  if($post["date"])
330  {
331  switch($ilUser->getDateFormat())
332  {
334  $date = explode(".", $post["date"]);
335  $dt['mday'] = (int)$date[0];
336  $dt['mon'] = (int)$date[1];
337  $dt['year'] = (int)$date[2];
338  break;
339 
341  $date = explode("-", $post["date"]);
342  $dt['mday'] = (int)$date[2];
343  $dt['mon'] = (int)$date[1];
344  $dt['year'] = (int)$date[0];
345  break;
346 
348  $date = explode("/", $post["date"]);
349  $dt['mday'] = (int)$date[1];
350  $dt['mon'] = (int)$date[0];
351  $dt['year'] = (int)$date[2];
352  break;
353  }
354 
355  if($this->getShowTime())
356  {
357  if($ilUser->getTimeFormat() == ilCalendarSettings::TIME_FORMAT_12)
358  {
359  $seconds = "";
360  if($this->getShowSeconds())
361  {
362  $seconds = ":\s*([0-9]{1,2})\s*";
363  }
364  if(preg_match("/([0-9]{1,2})\s*:\s*([0-9]{1,2})\s*".$seconds."(am|pm)/", trim(strtolower($post["time"])), $matches))
365  {
366  $dt['hours'] = (int)$matches[1];
367  $dt['minutes'] = (int)$matches[2];
368  if($seconds)
369  {
370  $dt['seconds'] = (int)$time[2];
371  $ampm = $matches[4];
372  }
373  else
374  {
375  $dt['seconds'] = 0;
376  $ampm = $matches[3];
377  }
378  if($dt['hours'] == 12)
379  {
380  if($ampm == "am")
381  {
382  $dt['hours'] = 0;
383  }
384  }
385  else if($ampm == "pm")
386  {
387  $dt['hours'] += 12;
388  }
389  }
390  }
391  else
392  {
393  $time = explode(":", $post["time"]);
394  $dt['hours'] = (int)$time[0];
395  $dt['minutes'] = (int)$time[1];
396  $dt['seconds'] = (int)$time[2];
397  }
398  }
399  }
400  }
401 
402  // very basic validation
403  if($dt['mday'] == 0 || $dt['mon'] == 0 || $dt['year'] == 0 || $dt['mday'] > 31 || $dt['mon'] > 12)
404  {
405  $dt = false;
406  }
407  else if($this->getShowTime() && ($dt['hours'] > 23 || $dt['minutes'] > 59 || $dt['seconds'] > 59))
408  {
409  $dt = false;
410  }
411 
412  // #11847
413  if(!checkdate($dt['mon'], $dt['mday'], $dt['year']))
414  {
415  $this->invalid_input = $_POST[$this->getPostVar()]['date'];
416  $this->setAlert($lng->txt("exc_date_not_valid"));
417  $dt = false;
418  }
419 
420  $date = new ilDateTime($dt, IL_CAL_FKT_GETDATE, $ilUser->getTimeZone());
421  $this->setDate($date);
422 
423  // post values used to be overwritten anyways - cannot change behaviour
424  $_POST[$this->getPostVar()]['date'] = $date->get(IL_CAL_FKT_DATE, 'Y-m-d', $ilUser->getTimeZone());
425  $_POST[$this->getPostVar()]['time'] = $date->get(IL_CAL_FKT_DATE, 'H:i:s', $ilUser->getTimeZone());
426 
427  return (bool)$dt;
428  }
429 
434  function render()
435  {
436  global $lng,$ilUser;
437 
438  $tpl = new ilTemplate("tpl.prop_datetime.html", true, true, "Services/Form");
439 
440  $lng->loadLanguageModule("jscalendar");
441  require_once("./Services/Calendar/classes/class.ilCalendarUtil.php");
443 
444  if(strlen($this->getActivationPostVar()))
445  {
446  $tpl->setCurrentBlock('prop_date_activation');
447  $tpl->setVariable('CHECK_ENABLED_DATE',$this->getActivationPostVar());
448  $tpl->setVariable('TXT_DATE_ENABLED',$this->activation_title);
449  $tpl->setVariable('CHECKED_ENABLED',$this->activation_checked ? 'checked="checked"' : '');
450  $tpl->setVariable('CHECKED_DISABLED',$this->getDisabled() ? 'disabled="disabled" ' : '');
451  $tpl->parseCurrentBlock();
452  }
453 
454  if($this->getMode() == self::MODE_SELECT)
455  {
456  if(is_a($this->getDate(),'ilDate'))
457  {
458  $date_info = $this->getDate()->get(IL_CAL_FKT_GETDATE,'','UTC');
459  }
460  elseif(is_a($this->getDate(),'ilDateTime'))
461  {
462  $date_info = $this->getDate()->get(IL_CAL_FKT_GETDATE,'',$ilUser->getTimeZone());
463  }
464  else
465  {
466  $this->setDate(new ilDateTime(time(), IL_CAL_UNIX));
467  $date_info = $this->getDate()->get(IL_CAL_FKT_GETDATE,'',$ilUser->getTimeZone());
468  }
469 
470  // display invalid input again
471  if(is_array($this->invalid_input))
472  {
473  $date_info['year'] = $this->invalid_input['y'];
474  $date_info['mon'] = $this->invalid_input['m'];
475  $date_info['mday'] = $this->invalid_input['d'];
476  }
477  }
478 
479  if ($this->getShowDate())
480  {
481  if($this->getMode() == self::MODE_SELECT)
482  {
483  $tpl->setCurrentBlock("prop_date_input_select_setup");
484  $tpl->setVariable("INPUT_FIELDS_DATE", $this->getPostVar()."[date]");
485  $tpl->parseCurrentBlock();
486 
487  $tpl->setCurrentBlock("prop_date");
488  $tpl->setVariable("DATE_SELECT",
489  ilUtil::makeDateSelect($this->getPostVar()."[date]", $date_info['year'], $date_info['mon'], $date_info['mday'],
490  $this->startyear,true,array('disabled' => $this->getDisabled()), $this->getShowEmpty()));
491  }
492  else
493  {
494  $value = $this->getDate();
495  if($value)
496  {
497  $value = substr($this->getDate()->get(IL_CAL_DATETIME), 0, 10);
498  $day = substr($value, 8, 2);
499  $month = substr($value, 5, 2);
500  $year = substr($value, 0, 4);
501  }
502 
503  switch($ilUser->getDateFormat())
504  {
506  if($value)
507  {
508  $value = date("d.m.Y", mktime(0, 0, 0, $month, $day, $year));
509  }
510  $format = "%d.%m.%Y";
511  $input_hint = $lng->txt("dd_mm_yyyy");
512  break;
513 
515  if($value)
516  {
517  $value = date("Y-m-d", mktime(0, 0, 0, $month, $day, $year));
518  }
519  $format = "%Y-%m-%d";
520  $input_hint = $lng->txt("yyyy_mm_dd");
521  break;
522 
524  if($value)
525  {
526  $value = date("m/d/Y", mktime(0, 0, 0, $month, $day, $year));
527  }
528  $format = "%m/%d/%Y";
529  $input_hint = $lng->txt("mm_dd_yyyy");
530  break;
531  }
532 
533  $tpl->setCurrentBlock("prop_date_input_field");
534  $tpl->setVariable("DATE_ID", $this->getPostVar());
535  $tpl->setVariable("DATE_VALUE", $value);
536  $tpl->setVariable("DISABLED", $this->getDisabled() ? " disabled=\"disabled\"" : "");
537  $tpl->parseCurrentBlock();
538 
539  $tpl->setCurrentBlock("prop_date_input_field_info");
540  $tpl->setVariable("TXT_INPUT_FORMAT", $input_hint);
541  $tpl->parseCurrentBlock();
542 
543  $tpl->setCurrentBlock("prop_date_input_field_setup");
544  $tpl->setVariable("DATE_ID", $this->getPostVar());
545  $tpl->setVariable("DATE_FIELD_FORMAT", $format);
546  $tpl->parseCurrentBlock();
547  }
548 
549  $tpl->setCurrentBlock("prop_date");
550  $tpl->setVariable("IMG_DATE_CALENDAR", ilUtil::getImagePath("calendar.png"));
551  $tpl->setVariable("TXT_DATE_CALENDAR", $lng->txt("open_calendar"));
552  $tpl->setVariable("DATE_ID", $this->getPostVar());
553 
554  include_once './Services/Calendar/classes/class.ilCalendarUserSettings.php';
555  $tpl->setVariable('DATE_FIRST_DAY',ilCalendarUserSettings::_getInstance()->getWeekStart());
556 
557  $tpl->parseCurrentBlock();
558  }
559  if($this->getShowTime())
560  {
561  if($this->getMode() == self::MODE_INPUT)
562  {
563  $value = $this->getDate();
564  if($value)
565  {
566  if(!$this->getShowSeconds())
567  {
568  $value = substr($value->get(IL_CAL_DATETIME), 11, 5);
569  if($ilUser->getTimeFormat() == ilCalendarSettings::TIME_FORMAT_12)
570  {
571  $value = date("g:ia", mktime(substr($value, 0, 2), substr($value, 3, 2)));
572  }
573  }
574  else
575  {
576  $value = substr($value->get(IL_CAL_DATETIME), 11, 8);
577  if($ilUser->getTimeFormat() == ilCalendarSettings::TIME_FORMAT_12)
578  {
579  $value = date("g:i:sa", mktime(substr($value, 0, 2), substr($value, 3, 2), substr($value, 6, 2)));
580  }
581  }
582  }
583 
584  $tpl->setCurrentBlock("prop_time_input_field");
585  $tpl->setVariable("DATE_ID", $this->getPostVar());
586  $tpl->setVariable("TIME_VALUE", $value);
587  $tpl->setVariable("DISABLED", $this->getDisabled() ? " disabled=\"disabled\"" : "");
588  $tpl->parseCurrentBlock();
589  }
590 
591  $tpl->setCurrentBlock("prop_time");
592 
593  if($this->getMode() == self::MODE_SELECT)
594  {
595  $tpl->setVariable("TIME_SELECT",
596  ilUtil::makeTimeSelect($this->getPostVar()."[time]", !$this->getShowSeconds(),
597  $date_info['hours'], $date_info['minutes'], $date_info['seconds'],
598  true,array('minute_steps' => $this->getMinuteStepSize(),
599  'disabled' => $this->getDisabled())));
600  }
601 
602  $tpl->setVariable("TXT_TIME", $this->getShowSeconds()
603  ? "(".$lng->txt("hh_mm_ss").")"
604  : "(".$lng->txt("hh_mm").")");
605 
606  $tpl->parseCurrentBlock();
607  }
608 
609  if ($this->getShowTime() && $this->getShowDate() && $this->getMode() == self::MODE_SELECT)
610  {
611  $tpl->setVariable("DELIM", "<br />");
612  }
613 
614  return $tpl->get();
615  }
616 
622  function insert(&$a_tpl)
623  {
624  $html = $this->render();
625 
626  $a_tpl->setCurrentBlock("prop_generic");
627  $a_tpl->setVariable("PROP_GENERIC", $html);
628  $a_tpl->parseCurrentBlock();
629  }
630 
635  {
636  $html = $this->render();
637  return $html;
638  }
639 
643  function serializeData()
644  {
645  return serialize($this->getDate());
646  }
647 
651  function unserializeData($a_data)
652  {
653  $data = unserialize($a_data);
654 
655  if (is_object($data))
656  {
657  $this->setDate($data);
658  }
659  }
660 
667  {
668  return trim($_POST[$this->getPostVar()]["date"]." ". $_POST[$this->getPostVar()]["time"]);
669  }
670 
674  function getToolbarHTML()
675  {
676  $html = $this->render("toolbar");
677  return $html;
678  }
679 }
680 
681 ?>