You are here

class SmartDateFieldItemList in Smart Date 3.0.x

Same name and namespace in other branches
  1. 8.2 src/Plugin/Field/FieldType/SmartDateFieldItemList.php \Drupal\smart_date\Plugin\Field\FieldType\SmartDateFieldItemList
  2. 8 src/Plugin/Field/FieldType/SmartDateFieldItemList.php \Drupal\smart_date\Plugin\Field\FieldType\SmartDateFieldItemList
  3. 3.x src/Plugin/Field/FieldType/SmartDateFieldItemList.php \Drupal\smart_date\Plugin\Field\FieldType\SmartDateFieldItemList
  4. 3.1.x src/Plugin/Field/FieldType/SmartDateFieldItemList.php \Drupal\smart_date\Plugin\Field\FieldType\SmartDateFieldItemList
  5. 3.2.x src/Plugin/Field/FieldType/SmartDateFieldItemList.php \Drupal\smart_date\Plugin\Field\FieldType\SmartDateFieldItemList
  6. 3.3.x src/Plugin/Field/FieldType/SmartDateFieldItemList.php \Drupal\smart_date\Plugin\Field\FieldType\SmartDateFieldItemList
  7. 3.4.x src/Plugin/Field/FieldType/SmartDateFieldItemList.php \Drupal\smart_date\Plugin\Field\FieldType\SmartDateFieldItemList

Represents a configurable entity smartdate field.

Hierarchy

Expanded class hierarchy of SmartDateFieldItemList

2 files declare their use of SmartDateFieldItemList
SmartDateDefaultWidget.php in src/Plugin/Field/FieldWidget/SmartDateDefaultWidget.php
smart_date.tokens.inc in ./smart_date.tokens.inc
Provides tokens for the smart_date module.

File

src/Plugin/Field/FieldType/SmartDateFieldItemList.php, line 16

Namespace

Drupal\smart_date\Plugin\Field\FieldType
View source
class SmartDateFieldItemList extends DateTimeFieldItemList {

  /**
   * {@inheritdoc}
   */
  public function defaultValuesForm(array &$form, FormStateInterface $form_state) {
    if (empty($this
      ->getFieldDefinition()
      ->getDefaultValueCallback())) {
      if ($this
        ->getFieldDefinition()
        ->getDefaultValueLiteral()) {
        $default_value = $this
          ->getFieldDefinition()
          ->getDefaultValueLiteral()[0];
      }
      else {
        $default_value = [];
      }
      $element = parent::defaultValuesForm($form, $form_state);
      $element['default_date_type']['#options']['next_hour'] = t('Next hour');
      unset($element['default_time_type']);
      $this
        ->addDurationConfig($element, $default_value);
      return $element;
    }
  }

  /**
   * {@inheritdoc}
   */
  public static function addDurationConfig(array &$element, array $default_value) {
    $description = '<p>' . t('The possible durations this field can contain. Enter one value per line, in the format key|label.');
    $description .= '<br/>' . t('The key is the stored value, and must be numeric or "custom" to allow an arbitrary length. The label will be used in edit forms.');
    $description .= '<br/>' . t('The label is optional: if a line contains a single number, it will be used as key and label.') . '</p>';
    $element['default_duration_increments'] = [
      '#type' => 'textarea',
      '#title' => t('Allowed duration increments'),
      '#description' => $description,
      '#default_value' => isset($default_value['default_duration_increments']) ? $default_value['default_duration_increments'] : "30\n60|1 hour\n90\n120|2 hours\ncustom",
      '#required' => TRUE,
    ];
    $element['default_duration'] = [
      '#type' => 'textfield',
      '#title' => t('Default duration'),
      '#description' => t('Set which of the duration increments provided above that should be selected by default.'),
      '#default_value' => isset($default_value['default_duration']) ? $default_value['default_duration'] : '60',
      '#required' => TRUE,
    ];
    return $element;
  }

  /**
   * {@inheritdoc}
   */
  public function defaultValuesFormValidate(array $element, array &$form, FormStateInterface $form_state) {
    if ($duration = $form_state
      ->getValue([
      'default_value_input',
      'default_duration',
    ])) {
      $increments = SmartDateListItemBase::parseValues($form_state
        ->getValue([
        'default_value_input',
        'default_duration_increments',
      ]));

      // Handle a false result: will display the proper error later.
      if (!$increments) {
        $increments = [];
      }
      $increment_min = -1;

      // Iterate through returned array and throw an error for an invalid key.
      foreach ($increments as $key => $label) {
        if (intval($key) == 0 && $key !== '0' && $key !== 0 && $key !== 'custom') {
          $form_state
            ->setErrorByName('default_value_input][default_duration_increments', $this
            ->t('Invalid tokens in the allowed increments specified. Please provide either integers or "custom" as the key for each value.'));
          break;
        }
        else {
          $increment_min = $increment_min < intval($key) ? intval($key) : $increment_min;
        }
      }
      if (!in_array('custom', $increments)) {
        if ($increment_min < 0) {
          $form_state
            ->setErrorByName('default_value_input][default_duration_increments', $this
            ->t('Unable to parse valid durations from the allowed increments specified.'));
        }
        else {
          $messenger = \Drupal::messenger();
          $messenger
            ->addMessage($this
            ->t('No string to allow for custom values, so the provided increments will be strictly enforced.'), 'warning');
        }
      }
      if (!isset($increments[$duration])) {
        $form_state
          ->setErrorByName('default_value_input][default_duration', $this
          ->t('Please specify a default duration that is one of the provided options.'));
      }
    }

    // Use the parent class method to validate relative dates.
    DateTimeFieldItemList::defaultValuesFormValidate($element, $form, $form_state);
  }

  /**
   * {@inheritdoc}
   */
  public function defaultValuesFormSubmit(array $element, array &$form, FormStateInterface $form_state) {
    if (strlen((string) $form_state
      ->getValue([
      'default_value_input',
      'default_duration',
    ])) && strlen((string) $form_state
      ->getValue([
      'default_value_input',
      'default_duration_increments',
    ]))) {
      if ($duration = $form_state
        ->getValue([
        'default_value_input',
        'default_duration',
      ])) {
        $form_state
          ->setValueForElement($element['default_duration'], $duration);
      }
      if ($duration_increments = $form_state
        ->getValue([
        'default_value_input',
        'default_duration_increments',
      ])) {
        $form_state
          ->setValueForElement($element['default_duration_increments'], $duration_increments);
      }
      return [
        $form_state
          ->getValue('default_value_input'),
      ];
    }

    // Use the parent class method to store current date configuration.
    DateTimeFieldItemList::defaultValuesFormSubmit($element, $form, $form_state);
    return [];
  }

  /**
   * {@inheritdoc}
   */
  public static function processDefaultValue($default_value, FieldableEntityInterface $entity, FieldDefinitionInterface $definition) {

    // Explicitly call the base class so that we can get the default value
    // types.
    $default_value = FieldItemList::processDefaultValue($default_value, $entity, $definition);

    // No default set, so nothing to do.
    if (empty($default_value[0]['default_date_type'])) {
      return $default_value;
    }

    // A default date+time value should be in the format and timezone used
    // for date storage.
    $date = new DrupalDateTime($default_value[0]['default_date'], DateTimeItemInterface::STORAGE_TIMEZONE);
    $format = DateTimeItemInterface::DATETIME_STORAGE_FORMAT;

    // If using 'next_hour' for 'default_date_type', do custom processing.
    if ($default_value[0]['default_date_type'] == 'next_hour') {
      $date
        ->modify('+1 hour');

      // After conversion to timestamp, we round up, so offset for this.
      $min = (int) $date
        ->format('i') + 1;
      $date
        ->modify('-' . $min . ' minutes');
    }
    $value = $date
      ->getTimestamp();

    // Round up to the next minute.
    $second = $date
      ->format("s");
    if ($second > 0) {
      $value += 60 - $second;
    }

    // Calculate the end value.
    $duration = (int) $default_value[0]['default_duration'];
    $end_value = $value + $duration * 60;
    $default_value = [
      [
        'value' => $value,
        'end_value' => $end_value,
        'date' => $date,
      ],
    ];
    return $default_value;
  }

}

Members

Namesort descending Modifiers Type Description Overrides
DateTimeFieldItemList::DEFAULT_VALUE_CUSTOM constant Defines the default value as relative.
DateTimeFieldItemList::DEFAULT_VALUE_NOW constant Defines the default value as now.
DependencySerializationTrait::$_entityStorages protected property
DependencySerializationTrait::$_serviceIds protected property
DependencySerializationTrait::__sleep public function 2
DependencySerializationTrait::__wakeup public function 2
FieldItemList::$langcode protected property The langcode of the field values held in the object.
FieldItemList::$list protected property Numerically indexed array of field items. Overrides ItemList::$list 1
FieldItemList::access public function Checks data value access. Overrides AccessibleInterface::access 1
FieldItemList::applyDefaultValue public function Applies the default value. Overrides TypedData::applyDefaultValue
FieldItemList::createItem protected function Helper for creating a list item object. Overrides ItemList::createItem
FieldItemList::defaultAccess public function Contains the default access logic of this field. Overrides FieldItemListInterface::defaultAccess 3
FieldItemList::defaultValueWidget protected function Returns the widget object used in default value form.
FieldItemList::delegateMethod protected function Calls a method on each FieldItem.
FieldItemList::delete public function Defines custom delete behavior for field values. Overrides FieldItemListInterface::delete 2
FieldItemList::deleteRevision public function Defines custom revision delete behavior for field values. Overrides FieldItemListInterface::deleteRevision 1
FieldItemList::equals public function Determines equality to another object implementing FieldItemListInterface. Overrides FieldItemListInterface::equals 2
FieldItemList::filterEmptyItems public function Filters out empty field items and re-numbers the item deltas. Overrides FieldItemListInterface::filterEmptyItems
FieldItemList::generateSampleItems public function Populates a specified number of field items with valid sample data. Overrides FieldItemListInterface::generateSampleItems 1
FieldItemList::getConstraints public function Gets a list of validation constraints. Overrides TypedData::getConstraints 1
FieldItemList::getEntity public function Gets the entity that field belongs to. Overrides FieldItemListInterface::getEntity 1
FieldItemList::getFieldDefinition public function Gets the field definition. Overrides FieldItemListInterface::getFieldDefinition
FieldItemList::getLangcode public function Gets the langcode of the field values held in the object. Overrides FieldItemListInterface::getLangcode
FieldItemList::getSetting public function Returns the value of a given field setting. Overrides FieldItemListInterface::getSetting
FieldItemList::getSettings public function Returns the array of field settings. Overrides FieldItemListInterface::getSettings
FieldItemList::hasAffectingChanges public function Determines whether the field has relevant changes. Overrides FieldItemListInterface::hasAffectingChanges 1
FieldItemList::postSave public function Defines custom post-save behavior for field values. Overrides FieldItemListInterface::postSave 1
FieldItemList::preSave public function Defines custom presave behavior for field values. Overrides FieldItemListInterface::preSave 1
FieldItemList::setLangcode public function Sets the langcode of the field values held in the object. Overrides FieldItemListInterface::setLangcode
FieldItemList::setValue public function Sets the data value. Overrides ItemList::setValue
FieldItemList::view public function Returns a renderable array for the field items. Overrides FieldItemListInterface::view
FieldItemList::__get public function Magic method: Gets a property value of to the first field item. Overrides FieldItemListInterface::__get
FieldItemList::__isset public function Magic method: Determines whether a property of the first field item is set. Overrides FieldItemListInterface::__isset
FieldItemList::__set public function Magic method: Sets a property value of the first field item. Overrides FieldItemListInterface::__set
FieldItemList::__unset public function Magic method: Unsets a property of the first field item. Overrides FieldItemListInterface::__unset
ItemList::appendItem public function Appends a new item to the list. Overrides ListInterface::appendItem
ItemList::count public function
ItemList::filter public function Filters the items in the list using a custom callback. Overrides ListInterface::filter
ItemList::first public function Returns the first item in this list. Overrides ListInterface::first
ItemList::get public function Returns the item at the specified position in this list. Overrides ListInterface::get 2
ItemList::getItemDefinition public function Gets the definition of a contained item. Overrides ListInterface::getItemDefinition
ItemList::getIterator public function
ItemList::getString public function Returns a string representation of the data. Overrides TypedData::getString
ItemList::getValue public function Gets the data value. Overrides TypedData::getValue
ItemList::isEmpty public function Determines whether the list contains any non-empty items. Overrides ListInterface::isEmpty
ItemList::offsetExists public function 1
ItemList::offsetGet public function
ItemList::offsetSet public function
ItemList::offsetUnset public function
ItemList::onChange public function React to changes to a child property or item. Overrides TraversableTypedDataInterface::onChange 1
ItemList::rekey protected function Renumbers the items in the list.
ItemList::removeItem public function Removes the item at the specified position. Overrides ListInterface::removeItem
ItemList::set public function Sets the value of the item at a given position in the list. Overrides ListInterface::set
ItemList::__clone public function Magic method: Implements a deep clone.
SmartDateFieldItemList::addDurationConfig public static function
SmartDateFieldItemList::defaultValuesForm public function Returns a form for the default value input. Overrides DateTimeFieldItemList::defaultValuesForm
SmartDateFieldItemList::defaultValuesFormSubmit public function Processes the submitted default value. Overrides DateTimeFieldItemList::defaultValuesFormSubmit
SmartDateFieldItemList::defaultValuesFormValidate public function Validates the submitted default value. Overrides DateTimeFieldItemList::defaultValuesFormValidate
SmartDateFieldItemList::processDefaultValue public static function Processes the default value before being applied. Overrides DateTimeFieldItemList::processDefaultValue
StringTranslationTrait::$stringTranslation protected property The string translation service. 4
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.
TypedData::$definition protected property The data definition. 1
TypedData::$name protected property The property name.
TypedData::$parent protected property The parent typed data object.
TypedData::createInstance public static function Constructs a TypedData object given its definition and context. Overrides TypedDataInterface::createInstance
TypedData::getDataDefinition public function Gets the data definition. Overrides TypedDataInterface::getDataDefinition
TypedData::getName public function Returns the name of a property or item. Overrides TypedDataInterface::getName
TypedData::getParent public function Returns the parent data structure; i.e. either complex data or a list. Overrides TypedDataInterface::getParent
TypedData::getPluginDefinition public function Gets the definition of the plugin implementation. Overrides PluginInspectionInterface::getPluginDefinition
TypedData::getPluginId public function Gets the plugin_id of the plugin instance. Overrides PluginInspectionInterface::getPluginId
TypedData::getPropertyPath public function Returns the property path of the data. Overrides TypedDataInterface::getPropertyPath
TypedData::getRoot public function Returns the root of the typed data tree. Overrides TypedDataInterface::getRoot
TypedData::setContext public function Sets the context of a property or item via a context aware parent. Overrides TypedDataInterface::setContext
TypedData::validate public function Validates the currently set data value. Overrides TypedDataInterface::validate
TypedData::__construct public function Constructs a TypedData object given its definition and context. 3
TypedDataTrait::$typedDataManager protected property The typed data manager used for creating the data types.
TypedDataTrait::getTypedDataManager public function Gets the typed data manager. 2
TypedDataTrait::setTypedDataManager public function Sets the typed data manager. 2