You are here

class DateTime in YAML Form 8

Provides a 'datetime' element.

Plugin annotation


@YamlFormElement(
  id = "datetime",
  api = "https://api.drupal.org/api/drupal/core!lib!Drupal!Core!Datetime!Element!Datetime.php/class/Datetime",
  label = @Translation("Date/time"),
  category = @Translation("Date/time elements"),
)

Hierarchy

Expanded class hierarchy of DateTime

File

src/Plugin/YamlFormElement/DateTime.php, line 20

Namespace

Drupal\yamlform\Plugin\YamlFormElement
View source
class DateTime extends DateBase {

  /**
   * {@inheritdoc}
   */
  public function getDefaultProperties() {
    $date_format = '';
    $time_format = '';

    // Date formats cannot be loaded during install or update.
    if (!defined('MAINTENANCE_MODE')) {

      /** @var \Drupal\Core\Datetime\DateFormatInterface $date_format_entity */
      if ($date_format_entity = DateFormat::load('html_date')) {
        $date_format = $date_format_entity
          ->getPattern();
      }

      /** @var \Drupal\Core\Datetime\DateFormatInterface $time_format_entity */
      if ($time_format_entity = DateFormat::load('html_time')) {
        $time_format = $time_format_entity
          ->getPattern();
      }
    }
    return parent::getDefaultProperties() + [
      // Date settings.
      'date_date_format' => $date_format,
      'date_date_element' => 'date',
      'date_time_format' => $time_format,
      'date_time_element' => 'time',
      'date_year_range' => '1900:2050',
      'date_increment' => 1,
      'date_timezone' => '',
    ];
  }

  /**
   * {@inheritdoc}
   */
  public function prepare(array &$element, YamlFormSubmissionInterface $yamlform_submission) {
    parent::prepare($element, $yamlform_submission);

    // Must define a '#default_value' for Datetime element to prevent the
    // below error.
    // Notice: Undefined index: #default_value in Drupal\Core\Datetime\Element\Datetime::valueCallback().
    if (!isset($element['#default_value'])) {
      $element['#default_value'] = NULL;
    }

    // Issue #1838234 Add jQuery Timepicker for the Time element of the
    // datetime field.
    $element['#attached']['library'][] = 'yamlform/yamlform.element.time';
  }

  /**
   * {@inheritdoc}
   */
  public function setDefaultValue(array &$element) {
    if (is_string($element['#default_value']) && !empty($element['#default_value'])) {
      $element['#default_value'] = $element['#default_value'] ? DrupalDateTime::createFromTimestamp(strtotime($element['#default_value'])) : NULL;
    }
  }

  /**
   * {@inheritdoc}
   */
  protected function getElementSelectorInputsOptions(array $element) {
    $t_args = [
      '@title' => $this
        ->getAdminLabel($element),
    ];
    return [
      'date' => $this
        ->t('@title [Date]', $t_args),
      'time' => $this
        ->t('@title [Time]', $t_args),
    ];
  }

  /**
   * {@inheritdoc}
   */
  public function form(array $form, FormStateInterface $form_state) {
    $form = parent::form($form, $form_state);

    // Date.
    $form['date'] = [
      '#type' => 'fieldset',
      '#title' => $this
        ->t('Date/time settings'),
      '#description' => $this
        ->t('Datetime element is designed to have sane defaults so any or all can be omitted.') . ' ' . $this
        ->t('Both the date and time components are configurable so they can be output as HTML5 datetime elements or not, as desired.'),
    ];
    $form['date']['date_date_element'] = [
      '#type' => 'select',
      '#title' => t('Date element'),
      '#options' => [
        'datetime' => $this
          ->t('HTML datetime - Use the HTML5 datetime element type.'),
        'datetime-local' => $this
          ->t('HTML datetime input (localized) - Use the HTML5 datetime-local element type.'),
        'date' => $this
          ->t('HTML date input - Use the HTML5 date element type.'),
        'text' => $this
          ->t('Text input - No HTML5 element, use a normal text field.'),
        'none' => $this
          ->t('None - Do not display a date element'),
      ],
    ];
    $form['date']['date_date_element_datetime_warning'] = [
      '#type' => 'yamlform_message',
      '#message_type' => 'warning',
      '#message_message' => $this
        ->t('HTML5 datetime elements do not gracefully degrade in older browsers and will be displayed as a plain text field without a date or time picker.'),
      '#access' => TRUE,
      '#states' => [
        'visible' => [
          [
            ':input[name="properties[date_date_element]"]' => [
              'value' => 'datetime',
            ],
          ],
          'or',
          [
            ':input[name="properties[date_date_element]"]' => [
              'value' => 'datetime-local',
            ],
          ],
        ],
      ],
    ];
    $form['date']['date_date_element_none_warning'] = [
      '#type' => 'yamlform_message',
      '#message_type' => 'warning',
      '#message_message' => $this
        ->t('You should consider using a dedicated Time element, instead of this Date/time element, which will preprend the current date to the submitted time.'),
      '#access' => TRUE,
      '#states' => [
        'visible' => [
          ':input[name="properties[date_date_element]"]' => [
            'value' => 'none',
          ],
        ],
      ],
    ];
    $date_format = DateFormat::load('html_date')
      ->getPattern();
    $form['date']['date_date_format'] = [
      '#type' => 'yamlform_select_other',
      '#title' => $this
        ->t('Date format'),
      '#options' => [
        $date_format => $this
          ->t('Year-Month-Date (@date)', [
          '@date' => date($date_format),
        ]),
      ],
      '#description' => $this
        ->t("Date format is only applicable for browsers that do not have support for the HTML5 date element. Browsers that support the HTML5 date element will display the date using the user's preferred format."),
      '#other__option_label' => $this
        ->t('Custom...'),
      '#other__placeholder' => $this
        ->t('Custom date format...'),
      '#other__description' => $this
        ->t('Enter date format using <a href="http://php.net/manual/en/function.date.php">Date Input Format</a>.'),
      '#states' => [
        'invisible' => [
          ':input[name="properties[date_date_element]"]' => [
            'value' => 'none',
          ],
        ],
      ],
    ];
    $form['date']['date_year_range'] = [
      '#type' => 'textfield',
      '#title' => $this
        ->t('Date year range'),
      '#description' => $this
        ->t("A description of the range of years to allow, like '1900:2050', '-3:+3' or '2000:+3', where the first value describes the earliest year and the second the latest year in the range.") . ' ' . $this
        ->t('A year in either position means that specific year.') . ' ' . $this
        ->t('A +/- value describes a dynamic value that is that many years earlier or later than the current year at the time the form is displayed.') . ' ' . $this
        ->t("Used in jQueryUI (fallback) datepicker year range and HTML5 min/max date settings. Defaults to '1900:2050'.") . ' ' . $this
        ->t('Use min/max validation to define a more specific date range.'),
      '#states' => [
        'invisible' => [
          ':input[name="properties[date_date_element]"]' => [
            'value' => 'none',
          ],
        ],
      ],
    ];

    // Time.
    $form['date']['date_time_element'] = [
      '#type' => 'select',
      '#title' => t('Time element'),
      '#options' => [
        'time' => $this
          ->t('HTML time input - Use a HTML5 time element type.'),
        'text' => $this
          ->t('Text input - No HTML5 element, use a normal text field.'),
        'none' => $this
          ->t('None - Do not display a time element.'),
      ],
      '#states' => [
        'invisible' => [
          [
            ':input[name="properties[date_date_element]"]' => [
              'value' => 'datetime',
            ],
          ],
          'or',
          [
            ':input[name="properties[date_date_element]"]' => [
              'value' => 'datetime-local',
            ],
          ],
        ],
      ],
    ];
    $form['date']['date_time_format'] = [
      '#type' => 'yamlform_select_other',
      '#title' => $this
        ->t('Time format'),
      '#description' => $this
        ->t("Time format is only applicable for browsers that do not have support for the HTML5 time element. Browsers that support the HTML5 time element will display the time using the user's preferred format."),
      '#options' => [
        'g:i A' => $this
          ->t('12 hour (@time)', [
          '@time' => date('g:i A'),
        ]),
        'g:i:s A' => $this
          ->t('12 hour with seconds (@time)', [
          '@time' => date('g:i:s A'),
        ]),
        'H:i' => $this
          ->t('24 hour (@time)', [
          '@time' => date('H:i'),
        ]),
        'H:i:s' => $this
          ->t('24 hour with seconds (@time)', [
          '@time' => date('H:i:s'),
        ]),
      ],
      '#other__option_label' => $this
        ->t('Custom...'),
      '#other__placeholder' => $this
        ->t('Custom time format...'),
      '#other__description' => $this
        ->t('Enter time format using <a href="http://php.net/manual/en/function.date.php">Time Input Format</a>.'),
      '#states' => [
        'invisible' => [
          [
            ':input[name="properties[date_date_element]"]' => [
              'value' => 'datetime',
            ],
          ],
          'or',
          [
            ':input[name="properties[date_date_element]"]' => [
              'value' => 'datetime-local',
            ],
          ],
          'or',
          [
            ':input[name="properties[date_time_element]"]' => [
              'value' => 'none',
            ],
          ],
        ],
      ],
    ];
    $form['date']['date_increment'] = [
      '#type' => 'number',
      '#title' => $this
        ->t('Date increment'),
      '#description' => $this
        ->t("The increment to use for minutes and seconds, i.e. '15' would show only :00, :15, :30 and :45. Used for HTML5 step values and jQueryUI (fallback) datepicker settings. Defaults to 1 to show every minute."),
      '#min' => 1,
      '#states' => [
        'invisible' => [
          [
            ':input[name="properties[date_date_element]"]' => [
              'value' => 'datetime',
            ],
          ],
          'xor',
          [
            ':input[name="properties[date_date_element]"]' => [
              'value' => 'datetime-local',
            ],
          ],
          'xor',
          [
            ':input[name="properties[date_time_element]"]' => [
              'value' => 'none',
            ],
          ],
        ],
      ],
    ];
    $form['date']['date_timezone'] = [
      '#type' => 'select',
      '#title' => $this
        ->t('Date timezone override'),
      '#options' => system_time_zones(TRUE),
      '#description' => $this
        ->t('Generally this should be left empty and it will be set correctly for the user using the form.') . ' ' . $this
        ->t('Useful if the default value is empty to designate a desired timezone for dates created in form processing.') . ' ' . $this
        ->t('If a default date is provided, this value will be ignored, the timezone in the default date takes precedence.') . ' ' . $this
        ->t('Defaults to the value returned by drupal_get_user_timezone().'),
    ];
    return $form;
  }

  /**
   * {@inheritdoc}
   */
  public function getConfigurationFormProperties(array &$form, FormStateInterface $form_state) {
    $properties = parent::getConfigurationFormProperties($form, $form_state);

    // Remove hidden date properties.
    if (isset($properties['#date_date_element'])) {
      switch ($properties['#date_date_element']) {
        case 'datetime':
        case 'datetime-local':
          unset($properties['#date_time_element'], $properties['#date_time_format'], $properties['#date_increment']);
          break;
        case 'none':
          unset($properties['#date_date_format'], $properties['#date_year_range']);
          break;
      }
    }

    // Remove hidden date properties.
    if (isset($properties['#date_time_element']) && $properties['#date_time_element'] == 'none') {
      unset($properties['#date_time_format'], $properties['date_increment']);
    }
    return $properties;
  }

}

Members

Namesort descending Modifiers Type Description Overrides
DateBase::buildExportRecord public function Build an element's export row. Overrides YamlFormElementBase::buildExportRecord
DateBase::formatText public function Format an element's value as plain text. Overrides YamlFormElementBase::formatText
DateBase::getDateType protected function Get the type of date/time element.
DateBase::getDefaultFormat public function Get an element's default format name. Overrides YamlFormElementBase::getDefaultFormat
DateBase::getFormat public function Get element's format name by looking for '#format' property, global settings, and finally default settings. Overrides YamlFormElementBase::getFormat
DateBase::getFormats public function Get an element's available formats. Overrides YamlFormElementBase::getFormats
DateBase::parseInputFormat protected function Parse GNU Date Input Format.
DateBase::setInputFormatError protected function Set GNU input format error.
DateBase::validateConfigurationForm public function Form validation handler. Overrides YamlFormElementBase::validateConfigurationForm 1
DateBase::validateDate public static function Form element validation handler for base elements.
DateTime::form public function Gets the actual configuration form array to be built. Overrides DateBase::form
DateTime::getConfigurationFormProperties public function Get an associative array of element properties from configuration form. Overrides YamlFormElementBase::getConfigurationFormProperties
DateTime::getDefaultProperties public function Only a few elements don't inherit these default properties. Overrides DateBase::getDefaultProperties
DateTime::getElementSelectorInputsOptions protected function Get an element's (sub)inputs selectors as options. Overrides YamlFormElementBase::getElementSelectorInputsOptions
DateTime::prepare public function Prepare an element to be rendered within a form. Overrides DateBase::prepare
DateTime::setDefaultValue public function Set an element's default value using saved data. Overrides YamlFormElementBase::setDefaultValue
PluginBase::$configuration protected property Configuration information passed into the plugin. 1
PluginBase::$pluginDefinition protected property The plugin implementation definition. 1
PluginBase::$pluginId protected property The plugin_id.
PluginBase::DERIVATIVE_SEPARATOR constant A string which is used to separate base plugin IDs from the derivative ID.
PluginBase::getBaseId public function Gets the base_plugin_id of the plugin instance. Overrides DerivativeInspectionInterface::getBaseId
PluginBase::getDerivativeId public function Gets the derivative_id of the plugin instance. Overrides DerivativeInspectionInterface::getDerivativeId
PluginBase::getPluginDefinition public function Gets the definition of the plugin implementation. Overrides PluginInspectionInterface::getPluginDefinition 3
PluginBase::getPluginId public function Gets the plugin_id of the plugin instance. Overrides PluginInspectionInterface::getPluginId
PluginBase::isConfigurable public function Determines if the plugin is configurable.
StringTranslationTrait::$stringTranslation protected property The string translation service. 1
StringTranslationTrait::formatPlural protected function Formats a string containing a count of items.
StringTranslationTrait::getNumberOfPlurals protected function Returns the number of plurals supported by a given language.
StringTranslationTrait::getStringTranslation protected function Gets the string translation service.
StringTranslationTrait::setStringTranslation public function Sets the string translation service to use. 2
StringTranslationTrait::t protected function Translates a string to the current language or to a given language.
YamlFormElementBase::$configFactory protected property The configuration factory.
YamlFormElementBase::$currentUser protected property The current user.
YamlFormElementBase::$elementInfo protected property A element info manager.
YamlFormElementBase::$elementManager protected property The form element manager.
YamlFormElementBase::$entityTypeManager protected property The entity type manager.
YamlFormElementBase::$logger protected property A logger instance.
YamlFormElementBase::$tokenManager protected property The token manager.
YamlFormElementBase::build protected function Build an element as text or HTML. 2
YamlFormElementBase::buildConfigurationForm public function Form constructor. Overrides PluginFormInterface::buildConfigurationForm 1
YamlFormElementBase::buildExportHeader public function Build an element's export header. Overrides YamlFormElementInterface::buildExportHeader 3
YamlFormElementBase::buildExportOptionsForm public function Get an element's export options form. Overrides YamlFormElementInterface::buildExportOptionsForm 4
YamlFormElementBase::buildHtml public function Build an element as HTML element. Overrides YamlFormElementInterface::buildHtml 1
YamlFormElementBase::buildText public function Build an element as text element. Overrides YamlFormElementInterface::buildText 1
YamlFormElementBase::checkAccessRules public function Check element access (rules). Overrides YamlFormElementInterface::checkAccessRules
YamlFormElementBase::create public static function Creates an instance of the plugin. Overrides ContainerFactoryPluginInterface::create
YamlFormElementBase::displayDisabledWarning public function Display element disabled warning. Overrides YamlFormElementInterface::displayDisabledWarning 1
YamlFormElementBase::formatHtml public function Format an element's value as HTML. Overrides YamlFormElementInterface::formatHtml 15
YamlFormElementBase::formatTableColumn public function Format an element's table column value. Overrides YamlFormElementInterface::formatTableColumn 2
YamlFormElementBase::getAdminLabel public function Get an element's admin label (#admin_title, #title or #yamlform_key). Overrides YamlFormElementInterface::getAdminLabel
YamlFormElementBase::getConfigurationFormProperty protected function Get configuration property value. 1
YamlFormElementBase::getDefaultBaseProperties protected function Get default base properties used by all elements.
YamlFormElementBase::getElementSelectorOptions public function Get an element's selectors as options. Overrides YamlFormElementInterface::getElementSelectorOptions 11
YamlFormElementBase::getElementStateOptions public function Get an element's supported states as options. Overrides YamlFormElementInterface::getElementStateOptions
YamlFormElementBase::getExportDefaultOptions public function Get an element's default export options. Overrides YamlFormElementInterface::getExportDefaultOptions 4
YamlFormElementBase::getInfo public function Retrieves the default properties for the defined element type. Overrides YamlFormElementInterface::getInfo
YamlFormElementBase::getKey public function Get an element's key/name. Overrides YamlFormElementInterface::getKey
YamlFormElementBase::getLabel public function Get an element's label (#title or #yamlform_key). Overrides YamlFormElementInterface::getLabel
YamlFormElementBase::getPluginApiLink public function Get link to element's API documentation. Overrides YamlFormElementInterface::getPluginApiLink
YamlFormElementBase::getPluginApiUrl public function Get the URL for the element's API documentation. Overrides YamlFormElementInterface::getPluginApiUrl
YamlFormElementBase::getPluginLabel public function Gets the label of the plugin instance. Overrides YamlFormElementInterface::getPluginLabel
YamlFormElementBase::getRelatedTypes public function Get related element types. Overrides YamlFormElementInterface::getRelatedTypes 3
YamlFormElementBase::getTableColumn public function Get element's table column(s) settings. Overrides YamlFormElementInterface::getTableColumn 3
YamlFormElementBase::getTestValue public function Get test value for an element. Overrides YamlFormElementInterface::getTestValue 7
YamlFormElementBase::getTranslatableProperties public function Get translatable properties. Overrides YamlFormElementInterface::getTranslatableProperties 7
YamlFormElementBase::getTypeName public function Gets the type name (aka id) of the plugin instance with the 'yamlform_' prefix. Overrides YamlFormElementInterface::getTypeName
YamlFormElementBase::hasMultipleValues public function Checks if element value has multiple values. Overrides YamlFormElementInterface::hasMultipleValues 3
YamlFormElementBase::hasProperty public function Determine if an element supports a specified property. Overrides YamlFormElementInterface::hasProperty
YamlFormElementBase::hasWrapper public function Checks if the element has a wrapper. Overrides YamlFormElementInterface::hasWrapper
YamlFormElementBase::initialize public function Initialize an element to be displayed, rendered, or exported. Overrides YamlFormElementInterface::initialize 1
YamlFormElementBase::isComposite public function Checks if element is a composite element. Overrides YamlFormElementInterface::isComposite
YamlFormElementBase::isContainer public function Checks if element is a container that can contain elements. Overrides YamlFormElementInterface::isContainer 3
YamlFormElementBase::isDisabled public function Checks if element is disabled. Overrides YamlFormElementInterface::isDisabled
YamlFormElementBase::isEnabled public function Checks if element is enabled. Overrides YamlFormElementInterface::isEnabled 1
YamlFormElementBase::isHidden public function Checks if element is hidden. Overrides YamlFormElementInterface::isHidden
YamlFormElementBase::isInput public function Checks if the element carries a value. Overrides YamlFormElementInterface::isInput 5
YamlFormElementBase::isMultiline public function Checks if element value could contain multiple lines. Overrides YamlFormElementInterface::isMultiline 3
YamlFormElementBase::isRoot public function Checks if element is a root element. Overrides YamlFormElementInterface::isRoot 1
YamlFormElementBase::postCreate public function Acts on a form submission element after it is created. Overrides YamlFormElementInterface::postCreate 1
YamlFormElementBase::postDelete public function Delete any additional value associated with an element. Overrides YamlFormElementInterface::postDelete 2
YamlFormElementBase::postLoad public function Acts on loaded form submission. Overrides YamlFormElementInterface::postLoad 1
YamlFormElementBase::postSave public function Acts on a saved form submission element before the insert or update hook is invoked. Overrides YamlFormElementInterface::postSave 2
YamlFormElementBase::preCreate public function Changes the values of an entity before it is created. Overrides YamlFormElementInterface::preCreate 1
YamlFormElementBase::preDelete public function 1
YamlFormElementBase::prefixExportHeader protected function Prefix an element's export header.
YamlFormElementBase::prepareWrapper protected function Set an elements Flexbox and #states wrapper. 1
YamlFormElementBase::preSave public function Acts on a form submission element before the presave hook is invoked. Overrides YamlFormElementInterface::preSave 2
YamlFormElementBase::setConfigurationFormDefaultValue protected function Set an element's configuration form element default value. 2
YamlFormElementBase::setConfigurationFormDefaultValueRecursive protected function Set configuration form default values recursively.
YamlFormElementBase::submitConfigurationForm public function Form submission handler. Overrides PluginFormInterface::submitConfigurationForm
YamlFormElementBase::validateUnique public static function Form API callback. Validate #unique value.
YamlFormElementBase::__construct public function Constructs a Drupal\Component\Plugin\PluginBase object. Overrides PluginBase::__construct