custom_field-1.0.x-dev/src/Plugin/CustomField/FieldType/TimeType.php

src/Plugin/CustomField/FieldType/TimeType.php
<?php

declare(strict_types=1);

namespace Drupal\custom_field\Plugin\CustomField\FieldType;

use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\StringTranslation\TranslatableMarkup;
use Drupal\Core\TypedData\DataDefinition;
use Drupal\Core\TypedData\TypedDataTrait;
use Drupal\custom_field\Attribute\CustomFieldType;
use Drupal\custom_field\Plugin\CustomFieldTypeBase;
use Drupal\custom_field\Plugin\CustomFieldTypeInterface;
use Drupal\custom_field\Time;

/**
 * Plugin implementation of the 'time' custom field type.
 */
#[CustomFieldType(
  id: 'time',
  label: new TranslatableMarkup('Time'),
  description: new TranslatableMarkup('A field containing a Time.'),
  category: new TranslatableMarkup('Date/Time'),
  default_widget: 'time_widget',
  default_formatter: 'time',
  constraints: [
    'CustomFieldTime' => [],
  ]
)]
class TimeType extends CustomFieldTypeBase {

  use TypedDataTrait;

  /**
   * {@inheritdoc}
   */
  public static function schema(array $settings): array {
    return [
      $settings['name'] => [
        'type' => 'int',
        'unsigned' => TRUE,
      ],
    ];
  }

  /**
   * {@inheritdoc}
   */
  public static function propertyDefinitions(array $settings): array {

    $properties = [];
    $properties[$settings['name']] = DataDefinition::create('integer')
      ->setLabel(new TranslatableMarkup('@name', ['@name' => $settings['name']]))
      ->setDescription(new TranslatableMarkup('Seconds passed through midnight'))
      ->setSetting('unsigned', TRUE);

    return $properties;
  }

  /**
   * {@inheritdoc}
   */
  public static function defaultFieldSettings(): array {
    return [
      'seconds_enabled' => FALSE,
      'seconds_step' => 5,
    ] + parent::defaultFieldSettings();
  }

  /**
   * {@inheritdoc}
   */
  public function fieldSettingsForm(array &$form, FormStateInterface $form_state): array {
    $element = parent::fieldSettingsForm($form, $form_state);
    $settings = $this->getFieldSettings();
    $field_name = $this->getName();

    $element['seconds_enabled'] = [
      '#type' => 'checkbox',
      '#title' => $this->t('Add seconds parameter to input widget'),
      '#default_value' => $settings['seconds_enabled'],
    ];
    $element['seconds_step'] = [
      '#type' => 'number',
      '#title' => $this->t('Step to change seconds'),
      '#open' => TRUE,
      '#default_value' => $settings['seconds_step'],
      '#states' => [
        'visible' => [
          ':input[name="settings[field_settings][' . $field_name . '][seconds_enabled]"]' => ['checked' => TRUE],
        ],
      ],
    ];

    return $element;
  }

  /**
   * {@inheritdoc}
   */
  public function getConstraints(): array {
    /** @var array<string, mixed> $definition */
    $definition = $this->pluginDefinition;
    return $definition['constraints'];
  }

  /**
   * {@inheritdoc}
   */
  public static function generateSampleValue(CustomFieldTypeInterface $field, string $target_entity_type): string|array {
    // Generate random hours (1–12), minutes (0–59).
    $hours = rand(0, 23);
    $minutes = rand(0, 59);

    // Format with leading zeros.
    $time = sprintf('%02d:%02d:00', $hours, $minutes);

    return (string) Time::createFromHtml5Format($time)->getTimestamp();
  }

}

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

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