content_entity_builder-8.x-1.x-dev/src/Plugin/BaseFieldConfig/DateTimeItemBaseFieldConfig.php

src/Plugin/BaseFieldConfig/DateTimeItemBaseFieldConfig.php
<?php

namespace Drupal\content_entity_builder\Plugin\BaseFieldConfig;

use Drupal\Component\Render\FormattableMarkup;
use Drupal\content_entity_builder\Annotation\BaseFieldConfig;
use Drupal\content_entity_builder\ConfigurableBaseFieldConfigBase;
use Drupal\Core\Field\BaseFieldDefinition;
use Drupal\Core\Form\FormStateInterface;
use Drupal\datetime\Plugin\Field\FieldType\DateTimeFieldItemList;
use Drupal\datetime\Plugin\Field\FieldType\DateTimeItem;

/**
 * DateTimeItemBaseFieldConfig
 *
 * @BaseFieldConfig(
 *   id = "datetime_base_field_config",
 *   label = @Translation("Date"),
 *   description = @Translation("Create and store date values."),
 *   field_type = "datetime",
 * )
 */
class DateTimeItemBaseFieldConfig extends ConfigurableBaseFieldConfigBase {

  /**
   * {@inheritdoc}
   */
  public function defaultConfiguration() {
    return ['datetime_type' => DateTimeItem::DATETIME_TYPE_DATETIME];
  }

  /**
   * {@inheritdoc}
   */
  public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
    $has_data = $form_state->getValue('has_data');
    $form['datetime_type'] = [
      '#type' => 'select',
      '#title' => t('Date type'),
      '#description' => t('Choose the type of date to create.'),
      '#default_value' => $this->configuration['datetime_type'],
      '#options' => [
        DateTimeItem::DATETIME_TYPE_DATETIME => t('Date and time'),
        DateTimeItem::DATETIME_TYPE_DATE => t('Date only'),
      ],
      '#disabled' => $has_data,
    ];

    return $form;
  }

  /**
   * {@inheritdoc}
   */
  public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {
    parent::submitConfigurationForm($form, $form_state);
    $this->configuration['datetime_type'] = $form_state->getValue('datetime_type');
  }

  /**
   * {@inheritdoc}
   */
  public function buildDefaultValueForm(array $form, FormStateInterface $form_state) {
    $default_value = $this->getDefaultValue();
    $form['value'] = [
      '#type' => 'container',
      '#tree' => TRUE,
    ];
    $form['value']['default_date_type'] = [
      '#type' => 'select',
      '#title' => t('Default date'),
      '#description' => t('Set a default value for this date.'),
      '#default_value' => isset($default_value[0]['default_date_type']) ? $default_value[0]['default_date_type'] : '',
      '#options' => [
        DateTimeFieldItemList::DEFAULT_VALUE_NOW => t('Current date'),
        DateTimeFieldItemList::DEFAULT_VALUE_CUSTOM => t('Relative date'),
      ],
      '#empty_value' => '',
    ];
    $form['value']['default_date'] = [
      '#type' => 'textfield',
      '#title' => t('Relative default value'),
      '#description' => 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($default_value[0]['default_date_type']) && $default_value[0]['default_date_type'] == DateTimeFieldItemList::DEFAULT_VALUE_CUSTOM) ? $default_value[0]['default_date'] : '',
      '#states' => [
        'visible' => [
          ':input[id="edit-default-value-value-default-date-type"]' => ['value' => DateTimeFieldItemList::DEFAULT_VALUE_CUSTOM],
        ],
      ],
    ];
    return $form;
  }

  /**
   * {@inheritdoc}
   */
  public function validateDefaultValueForm(array &$form, FormStateInterface $form_state) {
    if ($form_state->getValue(['value', 'default_date_type']) == DateTimeFieldItemList::DEFAULT_VALUE_CUSTOM) {
      $is_strtotime = @strtotime($form_state->getValue(['value', 'default_date']));
      if (!$is_strtotime) {
        $form_state->setErrorByName('value][default_date', t('The relative date value entered is invalid.'));
      }
    }
  }

  /**
   * {@inheritdoc}
   */
  public function submitDefaultValueForm(array &$form, FormStateInterface $form_state) {
    $default_value = [];
    if ($form_state->getValue(['value', 'default_date_type'])) {
      if ($form_state->getValue(['value', 'default_date_type']) == DateTimeFieldItemList::DEFAULT_VALUE_NOW) {
        $form_state->setValueForElement($form['value']['default_date'], DateTimeFieldItemList::DEFAULT_VALUE_NOW);
      }
      $default_value = [$form_state->getValue('value')];
    }
    $this->setDefaultValue($default_value);
  }

  /**
   * {@inheritdoc}
   */
  public function buildBaseFieldDefinition() {
    $label = $this->getLabel();
    $weight = $this->getWeight();
    $default_value = $this->getDefaultValue() ?? [];
    $default_date = $default_value[0]['default_date'] ?? '';
    $required = $this->isRequired();
    $description = $this->getDescription();

    $base_field_definition = BaseFieldDefinition::create('datetime')
      ->setLabel($label)
      ->setDescription($description)
      ->setRequired($required)
      ->setDefaultValue($default_date)
      ->setSetting('datetime_type', $this->configuration['datetime_type'])
      ->setDisplayOptions('view', [
        'label' => 'above',
        'type' => 'datetime_default',
        'weight' => $weight,
      ])
      ->setDisplayOptions('form', [
        'type' => 'datetime_default',
        'weight' => $weight,
      ])
      ->setDisplayConfigurable('form', TRUE)
      ->setDisplayConfigurable('view', TRUE);

    return $base_field_definition;
  }

  /**
   * {@inheritdoc}
   */
  public function exportCode($translatable="FALSE", $revisionable="FALSE") {
$template = <<<Eof

    \$fields['@field_name'] = BaseFieldDefinition::create('datetime')
      ->setLabel(t('@label'))
      ->setDescription(t('@description'))
      ->setRevisionable(@revisionable)
      ->setTranslatable(@translatable)
      ->setRequired(@required)
      ->setDefaultValue(@default_value)
      ->setSetting('datetime_type', '@datetime_type')
      ->setDisplayOptions('view', [
        'label' => 'above',
        'type' => 'datetime_default',
        'weight' => @weight,
      ])
      ->setDisplayOptions('form', [
        'type' => 'datetime_default',
        'weight' => @weight,
      ])
      ->setDisplayConfigurable('form', TRUE)
      ->setDisplayConfigurable('view', TRUE);

Eof;

    $default_value = $this->getDefaultValue() ?? [];
    $default_date = $default_value[0]['default_date'] ?? '';
    $ret = new FormattableMarkup($template, array(
      "@field_name" => $this->getFieldName(),
      "@label" => $this->getLabel(),
      "@description" => $this->getDescription(),
      "@default_value" => $default_date,
      "@required" => !empty($this->isRequired()) ? "TRUE" : "FALSE",
      "@weight" => $this->getWeight(),
      "@datetime_type" => $this->configuration['datetime_type'],
      "@translatable" => $translatable,
      "@revisionable" => $revisionable,
    ));

    return $ret;
  }

}

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

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