Search moodle.org's
Developer Documentation

See Release Notes
Long Term Support Release

  • Bug fixes for general core bugs in 4.1.x will end 13 November 2023 (12 months).
  • Bug fixes for security issues in 4.1.x will end 10 November 2025 (36 months).
  • PHP version: minimum PHP 7.4.0 Note: minimum PHP version has increased since Moodle 4.0. PHP 8.0.x is supported too.
   1  <?php
   2  // This file is part of Moodle - http://moodle.org/
   3  //
   4  // Moodle is free software: you can redistribute it and/or modify
   5  // it under the terms of the GNU General Public License as published by
   6  // the Free Software Foundation, either version 3 of the License, or
   7  // (at your option) any later version.
   8  //
   9  // Moodle is distributed in the hope that it will be useful,
  10  // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12  // GNU General Public License for more details.
  13  //
  14  // You should have received a copy of the GNU General Public License
  15  // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
  16  
  17  /**
  18   * Customfield date plugin
  19   *
  20   * @package   customfield_date
  21   * @copyright 2018 Daniel Neis Araujo <daniel@moodle.com>
  22   * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  23   */
  24  
  25  namespace customfield_date;
  26  
  27  use core_customfield\api;
  28  
  29  defined('MOODLE_INTERNAL') || die;
  30  
  31  /**
  32   * Class data
  33   *
  34   * @package customfield_date
  35   * @copyright 2018 Daniel Neis Araujo <daniel@moodle.com>
  36   * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  37   */
  38  class data_controller extends \core_customfield\data_controller {
  39  
  40      /**
  41       * Return the name of the field where the information is stored
  42       * @return string
  43       */
  44      public function datafield() : string {
  45          return 'intvalue';
  46      }
  47  
  48      /**
  49       * Add fields for editing data of a date field on a context.
  50       *
  51       * @param \MoodleQuickForm $mform
  52       */
  53      public function instance_form_definition(\MoodleQuickForm $mform) {
  54          $field = $this->get_field();
  55          // Get the current calendar in use - see MDL-18375.
  56          $calendartype = \core_calendar\type_factory::get_calendar_instance();
  57  
  58          $config = $field->get('configdata');
  59  
  60          // Always set the form element to "optional", even when it's required. Otherwise it defaults to the
  61          // current date and is easy to miss.
  62          $attributes = ['optional' => true];
  63  
  64          if (!empty($config['mindate'])) {
  65              $attributes['startyear'] = $calendartype->timestamp_to_date_array($config['mindate'])['year'];
  66          }
  67  
  68          if (!empty($config['maxdate'])) {
  69              $attributes['stopyear'] = $calendartype->timestamp_to_date_array($config['maxdate'])['year'];
  70          }
  71  
  72          if (empty($config['includetime'])) {
  73              $element = 'date_selector';
  74          } else {
  75              $element = 'date_time_selector';
  76          }
  77          $elementname = $this->get_form_element_name();
  78          $mform->addElement($element, $elementname, $this->get_field()->get_formatted_name(), $attributes);
  79          $mform->setType($elementname, PARAM_INT);
  80          $mform->setDefault($elementname, time());
  81          if ($field->get_configdata_property('required')) {
  82              $mform->addRule($elementname, null, 'required', null, 'client');
  83          }
  84      }
  85  
  86      /**
  87       * Validates data for this field.
  88       *
  89       * @param array $data
  90       * @param array $files
  91       * @return array
  92       */
  93      public function instance_form_validation(array $data, array $files) : array {
  94          $errors = parent::instance_form_validation($data, $files);
  95  
  96          $elementname = $this->get_form_element_name();
  97          if (!empty($data[$elementname])) {
  98              // Compare the date with min/max values, trim the date to the minute or to the day (depending on inludetime setting).
  99              $includetime = $this->get_field()->get_configdata_property('includetime');
 100              $machineformat = $includetime ? '%Y-%m-%d %H:%M' : '%Y-%m-%d';
 101              $humanformat = $includetime ? get_string('strftimedatetimeshort') : get_string('strftimedatefullshort');
 102              $value = userdate($data[$elementname], $machineformat, 99, false, false);
 103              $mindate = $this->get_field()->get_configdata_property('mindate');
 104              $maxdate = $this->get_field()->get_configdata_property('maxdate');
 105  
 106              if ($mindate && userdate($mindate, $machineformat, 99, false, false) > $value) {
 107                  $errors[$elementname] = get_string('errormindate', 'customfield_date', userdate($mindate, $humanformat));
 108              }
 109              if ($maxdate && userdate($maxdate, $machineformat, 99, false, false) < $value) {
 110                  $errors[$elementname] = get_string('errormaxdate', 'customfield_date', userdate($maxdate, $humanformat));
 111              }
 112          }
 113  
 114          return $errors;
 115      }
 116  
 117      /**
 118       * Returns the default value as it would be stored in the database (not in human-readable format).
 119       *
 120       * @return mixed
 121       */
 122      public function get_default_value() {
 123          return 0;
 124      }
 125  
 126      /**
 127       * Returns value in a human-readable format
 128       *
 129       * @return mixed|null value or null if empty
 130       */
 131      public function export_value() {
 132          $value = $this->get_value();
 133  
 134          if ($this->is_empty($value)) {
 135              return null;
 136          }
 137  
 138          // Check if time needs to be included.
 139          if ($this->get_field()->get_configdata_property('includetime')) {
 140              $format = get_string('strftimedaydatetime', 'langconfig');
 141          } else {
 142              $format = get_string('strftimedate', 'langconfig');
 143          }
 144  
 145          return userdate($value, $format);
 146      }
 147  }