datafield-1.x-dev/src/Plugin/DataField/FieldType/DatetimeIso8601Item.php

src/Plugin/DataField/FieldType/DatetimeIso8601Item.php
<?php

namespace Drupal\datafield\Plugin\DataField\FieldType;

use Drupal\Core\StringTranslation\StringTranslationTrait;
use Drupal\Core\StringTranslation\TranslatableMarkup;
use Drupal\Core\TypedData\DataDefinition;
use Drupal\datafield\Attribute\DataFieldType;
use Drupal\datafield\Plugin\DataFieldTypeInterface;
use Drupal\datafield\Plugin\Field\FieldType\DataFieldItem;

/**
 * Defines the 'timestamp' entity field type.
 */
#[DataFieldType(
  id: 'datetime_iso8601',
  label: new TranslatableMarkup('Date ISO'),
  description: new TranslatableMarkup('An entity field containing a UNIX timestamp value.'),
  default_widget: 'datetime',
  default_formatter: 'timestamp',
)]
class DatetimeIso8601Item implements DataFieldTypeInterface {
  use StringTranslationTrait;

  /**
   * Defines the default value as now.
   */
  const DEFAULT_VALUE_NOW = 'now';

  /**
   * Defines the default value as relative.
   */
  const DEFAULT_VALUE_CUSTOM = 'relative';

  /**
   * Defines max length stock string format date.
   */
  const MAX_LENGTH = 30;

  /**
   * {@inheritdoc}
   */
  public static function defaultStorageSettings() {
    return [
      'type' => 'varchar',
      'length' => self::MAX_LENGTH,
      'not null' => FALSE,
    ];
  }

  /**
   * {@inheritdoc}
   */
  public static function schema(array $settings) {
    $default = self::defaultStorageSettings();
    if ($settings['datetime_type'] == 'timestamp') {
      $default = [
        'type' => 'int',
        'length' => 10,
        'unsigned' => TRUE,
      ];
    }
    return [
      'columns' => [
        'value' => $default,
      ],
    ];
  }

  /**
   * {@inheritdoc}
   */
  public static function generateSampleValue($settings = []) {
    $date_type = $settings['datetime_type'];
    $timestamp = \Drupal::time()->getRequestTime() - mt_rand(0, 86400 * 365);
    $storage_format = $date_type == 'date' ? DataFieldItem::DATETIME_DATE_STORAGE_FORMAT : DataFieldItem::DATETIME_DATETIME_STORAGE_FORMAT;
    return gmdate($storage_format, $timestamp);
  }

  /**
   * {@inheritdoc}
   */
  public function getPluginId() {
    return '';
  }

  /**
   * {@inheritdoc}
   */
  public function getPluginDefinition() {
    return [];
  }

  /**
   * {@inheritdoc}
   */
  public static function propertyDefinitions(array $settings) {
    $name = $settings['name'];
    $data_type = 'string';
    switch ($settings['datetime_type']) {
      case 'datetime':
        $data_type = 'datetime_iso8601';
        break;

      case 'timestamp':
        $data_type = 'timestamp';
        break;
    }
    return DataDefinition::create($data_type)
      ->setLabel(new TranslatableMarkup('%name value', ['%name' => $name]))
      ->setRequired(FALSE);
  }

  /**
   * {@inheritdoc}
   */
  public function getLabel() {
    return $this->t('Date iso');
  }

  /**
   * {@inheritdoc}
   */
  public function fieldSettingsForm(array $field_settings, array $settings) {
    $visible = ':input[id="edit-settings-field-settings-' .
      str_replace('_', '-', $field_settings["machine_name"]) .
      '-default-date-type"]';
    $field_form = [
      'label' => [
        '#type' => 'textfield',
        '#title' => $this->t('Label'),
        '#default_value' => $field_settings['label'] ?? ucfirst($settings["name"]),
      ],
      'required' => [
        '#type' => 'checkbox',
        '#title' => $this->t('Required'),
        '#default_value' => $field_settings['required'] ?? FALSE,
      ],
      'min' => [
        '#type' => 'number',
        '#title' => $this->t('Minimum'),
        '#description' => $this->t('The minimum value that should be allowed in this field. Leave blank for no minimum.'),
        '#default_value' => $field_settings['min'] ?? NULL,
      ],
      'max' => [
        '#type' => 'number',
        '#title' => $this->t('Maximum'),
        '#description' => $this->t('The maximum value that should be allowed in this field. Leave blank for no maximum.'),
        '#default_value' => $field_settings['max'] ?? NULL,
      ],
      'default_date_type' => [
        '#type' => 'select',
        '#title' => $this->t('Default date'),
        '#description' => $this->t('Set a default value for this date.'),
        '#default_value' => $field_settings['default_date_type'] ?? '',
        '#options' => [
          static::DEFAULT_VALUE_NOW => $this->t('Current date'),
          static::DEFAULT_VALUE_CUSTOM => $this->t('Relative date'),
        ],
        '#empty_value' => '',
      ],
      'default_date' => [
        '#type' => 'textfield',
        '#title' => $this->t('Relative default value'),
        '#description' => $this->t("Describe a time by reference to the current day, like '+90 days' (90 days from the day the field is created) or '+1 Saturday' (the next Saturday). See <a href=\"http://php.net/manual/function.strtotime.php\">strtotime</a> for more details."),
        '#default_value' => (isset($field_settings['default_date_type']) && $field_settings['default_date_type'] == static::DEFAULT_VALUE_CUSTOM) ? $field_settings['default_date'] : '',
        '#states' => [
          'visible' => [
            $visible => ['value' => static::DEFAULT_VALUE_CUSTOM],
          ],
        ],
      ],
    ];
    if (in_array($settings["datetime_type"], ['date', 'datetime', 'timestamp'])) {
      $field_form['min']['#type'] = 'date';
      $field_form['max']['#type'] = 'date';
    }
    if (in_array($settings["datetime_type"], ['time'])) {
      $field_form['min']['#type'] = 'date';
      $field_form['min']['#attributes']['type'] = 'time';
      $field_form['max']['#type'] = 'date';
      $field_form['max']['#attributes']['type'] = 'time';
    }
    if (in_array($settings["datetime_type"], ['week'])) {
      $field_form['min']['#type'] = 'date';
      $field_form['min']['#attributes']['type'] = 'week';
      $field_form['max']['#type'] = 'date';
      $field_form['max']['#attributes']['type'] = 'week';
    }
    if (in_array($settings["datetime_type"], ['month'])) {
      $field_form['min']['#type'] = 'date';
      $field_form['min']['#attributes']['type'] = 'month';
      $field_form['max']['#type'] = 'date';
      $field_form['max']['#attributes']['type'] = 'month';
    }
    return $field_form;
  }

  /**
   * Get constraints.
   *
   * {@inheritdoc}
   */
  public function getConstraints(array $settings) {
    $constraints = [];
    if ($settings['required']) {
      $constraints['NotBlank'] = [];
    }
    return $constraints;
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc