Рейтинг:0

How to use datelist in a custom field widget?

флаг um

Since an administrator of the website I am building is visually impaired, I need to create a custom date field widget rather than use the one provided by Drupal.

I am trying to implement a datelist element.

<?php

namespace Drupal\my_module\Plugin\Field\FieldWidget;

use Drupal\Core\Datetime\DrupalDateTime;
use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Field\WidgetBase;
use Drupal\Core\Form\FormStateInterface;

/**
 * Accessible date field widget.
 *
 * @FieldWidget(
 *   id = "accessible_date",
 *   label = @Translation("Accessible date widget"),
 *   field_types = {
 *     "datetime"
 *   }
 * )
 */
class AccessibleDate extends WidgetBase {

  /**
   * {@inheritdoc}
   */
  public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) {
    $max_year = date('Y') + 1;
    $default_date = new DrupalDateTime();
    if (isset($items[$delta]->value)) {
      $default_date = new DrupalDateTime($items[$delta]->value);
    }

    $element += [
      '#type' => 'datelist',
      '#default_value' => $default_date,
      '#date_part_order' => [
        'day',
        'month',
        'year',
        'hour',
        'minute',
      ],
      '#date_year_range' => '2000:' . $max_year,
    ];

    return ['value' => $element];
  }

}

The widget is displayed correctly but when I submit the form to add or edit a node, I have the following error on each of the datelist fields: "The datetime value must be a string."

enter image description here

Do you know how to fix this?

Рейтинг:0
флаг um

Хорошо, я понял, формат даты и времени нуждается в Y-m-dTH:i:s формат. Я добавил обратный вызов проверки в свой элемент, чтобы изменить данные.

  /**
   * {@inheritdoc}
   */
  публичная функция formElement(FieldItemListInterface $items, $delta, элемент массива $, массив &$form, FormStateInterface $form_state) {
    $max_year = дата('Г') + 1;
    dpm($items[$delta]->значение);
    $default_date = новый DrupalDateTime();
    если (isset($items[$delta]->значение)) {
      $default_date = новое DrupalDateTime($items[$delta]->значение);
    }

    $элемент += [
      '#type' => 'список дат',
      '#default_value' => $default_date,
      '#date_part_order' => [
        'день',
        'месяц',
        'год',
        'час',
        'минута',
      ],
      '#date_year_range' => '2000:' . $макс_год,
      '#element_validate' => [
        [статические::класс, 'проверить'],
      ],
    ];

    вернуть ['значение' => $элемент];
  }

  /**
   * Подготовьте значение списка дат.
   */
  общедоступная статическая функция проверки ($ элемент, FormStateInterface $ form_state) {
    $значение = $элемент['#значение'];
    $дата = $значение['год'] . '-' . $значение['месяц'] . '-' . $значение['день'] . «Т». $значение['час'] . ':' . $значение['минута'] . ':00';
    $form_state->setValueForElement($element, $date);
  }

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.