cbr-1.0.0/src/Plugin/Field/FieldType/CBRDateTime.php

src/Plugin/Field/FieldType/CBRDateTime.php
<?

namespace Drupal\cbr\Plugin\Field\FieldType;

use Drupal\Core\Datetime\DrupalDateTime;
use Drupal\Core\Form\FormStateInterface;
use Drupal\datetime\Plugin\Field\FieldType\DateTimeItem;
use Drupal\field\Entity\FieldConfig;

/**
 * Plugin implementation of the 'datetime' field type.
 *
 * @FieldType(
 *   id = "cbr_datetime",
 *   label = @Translation("CBR DateTime"),
 *   description = @Translation("Create and store date values."),
 *   category = @Translation("Case Based Reasoning"),
 *   default_widget = "cbr_datetime_default",
 *   default_formatter = "cbr_datetime_default",
 *   list_class = "\Drupal\datetime\Plugin\Field\FieldType\DateTimeFieldItemList",
 *   constraints = {"DateTimeFormat" = {}},
 *   cardinality = 1
 * )
 */
class CBRDateTime extends DateTimeItem implements CBRFieldInterface
{
    /**
     * {@inheritdoc}
     */
    public function fieldSettingsForm(array $form, FormStateInterface $form_state): array
    {
        $form = CBRFieldHelper::cbrFieldSettingsForm($form, $form_state) + parent::fieldSettingsForm($form, $form_state);

        /** @var FieldConfig $field_config */
        $field_config = $form_state->getFormObject()->getEntity();
        $form['cbr_settings']['date_granularity'] = [
            '#type' => 'select',
            '#title' => t('Date granularity'),
            '#description' => t('Select the granularity of the date. This will affect the similarity. <br>If the field contains already data, a manual recalculation will be required.'),
            '#options' => [
                'day' => t('Day'),
                'month' => t('Month'),
                'year' => t('Year'),
            ],
            '#default_value' => $field_config->getThirdPartySetting('cbr', 'date_granularity', 'month'),
            '#required' => true
        ];
        $form['#entity_builders'][] = [$this, 'saveCBRFieldDateSettings'];
        return $form;
    }

    /**
     * Save the selected date granularity to the field config.
     * @param $entity_type The entity type.
     * @param FieldConfig $field_config The field config.
     * @param $form The form array.
     * @param FormStateInterface $form_state The form state.
     */
    public function saveCBRFieldDateSettings($entity_type, FieldConfig $fieldConfig, &$form, FormStateInterface $form_state)
    {
        $granularity = $form_state->getValue(['settings', 'cbr_settings', 'date_granularity']);
        $fieldConfig->setThirdPartySetting('cbr', 'date_granularity', $granularity);
    }

    /**
     * {@inheritdoc}
     */
    public function calculateSimilarity($value1, $value2, FieldConfig $field_config): float
    {
        return CBRFieldHelper::calculateSimilarityBetweenNumericValues($value1, $value2, null, null);
    }

    /**
     * {@inheritdoc}
     */
    public function summerize(array $values): float
    {
        return CBRFieldHelper::summerizeNumericValues($values);
    }

    /**
     * {@inheritdoc}
     */
    public function getValueForSimilarityCalculation(FieldConfig $field_config): float
    {
        $granularity = $field_config->getThirdPartySetting('cbr', 'date_granularity', 'month');
        return $this->date_granularity($this->date, $granularity);
    }

    private function date_granularity(DrupalDateTime $date, string $granularity): float
    {
        switch ($granularity) {
            case 'day':
                return $date->getTimestamp() / (60 * 60 * 24);
            case 'month':
                return $date->getTimestamp() / (60 * 60 * 24 * 30);
            case 'year':
                return $date->getTimestamp() / (60 * 60 * 24 * 365);
            default:
                return $date->getTimestamp();
        }
    }
}

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

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