Рейтинг:1

Не удается сохранить значение пользовательского поля даты и времени

флаг in

Я обращаюсь, потому что просто не могу понять, почему мое пользовательское поле даты и времени не сохраняет свое значение после отправки.

Контекст:

Я создал поле, содержащее два поля даты и времени. Я буду использовать его для добавления или удаления событий из списка событий, в зависимости от того, прошли они или нет (например, если фестиваль запланирован с 12 по 14 декабря, событие будет удалено после 14 числа).

События в моем случае генерируются из пользовательского объекта, я могу управлять его полями из своего бэк-офиса. Моя цель - получить даты из моего пользовательского поля даты и времени на ветке, чтобы отфильтровать отображаемые события.

Я знаю, что могу просто добавить два поля даты, но мне не хватает элегантности, которую я ищу.

Мой код:

Поэтому я создал настраиваемое поле, которое само содержит два поля даты и времени. Я следовал многим руководствам, чтобы найти версию, которая работает для меня, и вот код для моего типа поля, виджета и средства форматирования.

  • Тип поля: ScheduleItem.php
класс ScheduleItem расширяет FieldItemBase {

  /**
   * {@inheritdoc}
   */
  публичная функция isEmpty() {
    $ isEmpty =
      пустой($this->get('start')->getValue()) &&
      пустой($this->get('finish')->getValue());

    возврат $isEmpty;
  }

  /**
   * {@inheritdoc}
   */
  общедоступная статическая функция propertyDefinitions (FieldStorageDefinitionInterface $field_definition) {
    $Свойства = [];
    $properties['start'] = DataDefinition::create('datetime_iso8601')
      ->setLabel(t('Дата публикации'));
    $properties['finish'] = DataDefinition::create('datetime_iso8601')
      ->setLabel(t('Дата подавления'));
    вернуть $свойства;
  }

  /**
   * {@inheritdoc}
   */
  схема общедоступной статической функции (FieldStorageDefinitionInterface $field_definition) {

    $ столбцы = [
      'начало' => [
        'тип' => 'varchar',
        'mysql_type' => 'дата и время',
        'не нуль' => ЛОЖЬ,
        'по умолчанию' => NULL,
      ],
      'завершить' => [
        'тип' => 'varchar',
        'mysql_type' => 'дата и время',
        'не нуль' => ЛОЖЬ,
        'по умолчанию' => NULL,
        ],
    ];

    возвращаться [
      'значение' => $ столбцы,
      // @DCG При необходимости добавьте сюда индексы.
    ];

  }

Здесь нечего сказать. Я не знаю, есть ли конфликт между типами, которые я использую, поскольку mysql_type, тип и DataDefinition::создать имеют разные значения...

  • Виджет поля: РасписаниеВиджет
класс ScheduleWidget расширяет DateTimeWidgetBase {

  /**
   * {@inheritdoc}
   */
  публичная функция formElement(
    FieldItemListInterface $items,
                           $ дельта,
    Элемент массива $,
    Массив & $ форма,
    FormStateИнтерфейс $formState
  ) {

    $элемент += массив(
      '#дельта' => $дельта,
    );

    $элемент['начало'] = [
      '#тип' => 'дата и время',
      '#title' => $this->t('Дата публикации'),

      // Установите здесь текущее значение для этого поля или значение по умолчанию (или
      // null), если нет значения
      '#default_value' => isset($items[$delta]->start) ?
        $items[$delta]->start : ноль,
      '#пустое_значение' => '',
    ];

    $элемент['финиш'] = [
      '#тип' => 'дата и время',
      '#title' => $this->t('Дата подавления'),
      '#default_value' => isset($items[$delta]->finish) ?
        $items[$delta]->финиш: ноль,
      '#пустое_значение' => '',
    ];

    вернуть $элемент;
  }

}

В отличие от большинства виджетов настраиваемых полей, которые я расширяю DateTimeWidgetBase и нет виджетбаза, смысл здесь в том, чтобы использовать готовые массажФормаЗначения функция из класса. Предполагается, что мои значения преобразуются в формат, готовый к базе данных, если я правильно понял, но пока это мне не помогло.

  • Форматер поля: ScheduleDefaultFormatter.php
класс ScheduleDefaultFormatter расширяет FormatterBase {

  /**
   * {@inheritdoc}
   */
  публичная функция viewElements (FieldItemListInterface $items, $langcode)
  {

    $элементы = [];
    foreach ($items as $delta => $item) {
      $элементы[$дельта] = [
        '#start' => $item->начать,
        '#finish' => $item->finish
      ];
    }

    вернуть $элементы;
  }

}

Это почти все для моего кода, я думал, что это хорошо, ну, для меня это выглядело так, но...

ПРОБЛЕМА

Когда я добавил свое новое настраиваемое поле в свой объект события в разделе «Управление полями», создал новое событие и добавил к нему даты, я получил...

Это значение должно иметь правильный примитивный тип.

Что я пробовал

я бросил $значения как раз перед массажФормаЗначения вернул и вот как это выглядит:

дамп значения моего пользовательского поля

Мой вопрос к вам, почему он не работает?

Я старался быть максимально ясным, однако мой опыт работы с Drupal все еще ограничен, не стесняйтесь, если вам нужна дополнительная информация о моем коде, если это поможет решить проблему!

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

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