Я создаю пользовательский тип объекта контента.
Я хочу одно поле для времени события.
Поскольку нет поля времени, но есть тип dataTime_type, я создаю плагин для настраиваемого поля:
FieldType: TimeItem.php
/**
* Plugin implementation of the 'time' field type.
*
* @FieldType(
* id = "time",
* label = @Translation("Time Field"),
* description = @Translation("Permet la creation d'un champ de type time"),
* default_widget = "time_widget",
* default_formatter = "time_formatter"
* )
*/
/**
* {@inheritdoc}
*/
public static function schema(FieldStorageDefinitionInterface $field_definition) {
return array(
'columns' => array(
'value' => array(
'description' => 'The time value.',
'type' => 'int',
'length' => 6,
),
),
);
}
Я пытаюсь изменить тип на время (для mysql), но ошибка mysql возвращает мне ноль для типа. Поэтому я использую int для хранения времени в secondde.
FieldWidget: TimeWIdget.php
/**
* {@inheritdoc}
*/
public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) {
$value = isset($items[$delta]->value) ? $items[$delta]->value : '';
$element += array(
'#type' => 'time', //HTML5 input
'#default_value' => $value,
'#size' => 4,
'#element_validate' => array(
array($this, 'validate'),
),
);
return $element;
}
Моя сущность:
$fields['heure_evenement'] = BaseFieldDefinition::create('time')
->setLabel(t('test'))
->setDescription(t('test'))
->setRequired(TRUE)
->setDefaultValue('')
->setDisplayOptions('view', array(
'label' => 'above',
'type' => 'string',
'weight' => 3,
))
->setDisplayOptions('form', array(
'weight' => 3,
))
->setDisplayConfigurable('form', TRUE)
->setDisplayConfigurable('view', TRUE);
Все работает , кроме одного, HTML5 , типа ввода времени
Drupal знает некоторые входные данные в html5, но не все ... введите tel, email, number, range, color, date, datetime, но не только время типа.
Так что я надеялся получить его с пользовательским плагином, но нет ...
Редактировать 1
Единственный способ, который я нашел, - создать 2 select для этого типа:
public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) {
$value = isset($items[$delta]->value) ? $items[$delta]->value : '';
//heure
for($i=0;$i<=24;$i++){
$hour[]=$i;
}
//minutes
for($i=0;$i<=59;$i++){
$minutes[]=$i;
}
$element += array('hour'=>array(
'#title'=>t('Hour'),
'#type' => 'select',
'#options'=>$hour,
'#default_value' => $value,
'#element_validate' => array(
array($this, 'validate'),
),
)
);
$element += array('minutes'=>array(
'#title'=>t('Minutes'),
'#type' => 'select',
'#options'=>$minutes,
'#default_value' => $value,
'#element_validate' => array(
array($this, 'validate'),
),
)
);
return $element;
}
Есть идеи по этому поводу?
Ответы:
Свойство элемента формы
#type
относится к типу элемента, а не к элементу HTML. Можно определить свои собственные типы элементов (или типы тем), и вы можете предоставить свою собственную разметку для него. Это может быть сделано путем реализации плагина RenderElement .Обновить:
Вы также можете использовать
datetime
элемент рендеринга и отключить часть даты.$element['#date_date_element'] = 'none';
Обновление 2:
Форма комментария имеет пример массива рендеринга, который использует
datetime
тип. Итак, учитывая, что в качестве ориентира,источник
none
для части даты и получить обратно только часть времени.