Puncte:0

How to use datelist in a custom field widget?

drapel 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?

Puncte:0
drapel um

Ok, mi-am dat seama, formatul datetime are nevoie de a Y-m-dTH:i:s format. Am adăugat un apel invers de validare la elementul meu pentru a modifica datele.

  /**
   * {@inheritdoc}
   */
  funcția publică formElement(FieldItemListInterface $articole, $delta, matrice $element, matrice &$form, FormStateInterface $form_state) {
    $max_an = data('Y') + 1;
    dpm($articole[$delta]->valoare);
    $default_date = nou DrupalDateTime();
    if (isset($articole[$delta]->valoare)) {
      $default_date = new DrupalDateTime($items[$delta]->value);
    }

    $element += [
      '#type' => 'listă de date',
      '#default_value' => $default_date,
      '#date_part_order' => [
        'zi',
        'lună',
        'an',
        'ora',
        'minut',
      ],
      '#date_year_range' => '2000:' . $max_year,
      '#element_validate' => [
        [static::class, 'validate'],
      ],
    ];

    returnează ['value' => $element];
  }

  /**
   * Pregătiți valoarea listei de date.
   */
  validare funcție publică statică($element, FormStateInterface $form_state) {
    $valoare = $element['#valoare'];
    $date = $value['an'] . '-' . $value['lună'] . '-' . $value['zi'] . 'T'. $value['ora'] . ':' . $value['minut'] . ':00';
    $form_state->setValueForElement($element, $data);
  }

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.