Я обращаюсь, потому что просто не могу понять, почему мое пользовательское поле даты и времени не сохраняет свое значение после отправки.
Контекст:
Я создал поле, содержащее два поля даты и времени. Я буду использовать его для добавления или удаления событий из списка событий, в зависимости от того, прошли они или нет (например, если фестиваль запланирован с 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 все еще ограничен, не стесняйтесь, если вам нужна дополнительная информация о моем коде, если это поможет решить проблему!