Как установить поле типа времени программно?

8

Я создаю пользовательский тип объекта контента.

Я хочу одно поле для времени события.

Поскольку нет поля времени, но есть тип 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;
}

Есть идеи по этому поводу?

Kevin
источник
Мне нужен такой тип поля, можете ли вы поделиться своим кодом в github или в другом месте?
Адриан Сид
Вы можете использовать модуль drupal.org/project/time_field .
Потерянный кодер

Ответы:

12

Свойство элемента формы #typeотносится к типу элемента, а не к элементу HTML. Можно определить свои собственные типы элементов (или типы тем), и вы можете предоставить свою собственную разметку для него. Это может быть сделано путем реализации плагина RenderElement .

Обновить:

Вы также можете использовать datetimeэлемент рендеринга и отключить часть даты.

$element['#date_date_element'] = 'none';

Обновление 2:

Форма комментария имеет пример массива рендеринга, который использует datetimeтип. Итак, учитывая, что в качестве ориентира,

  $form['time_without_date'] = array(
    '#type' => 'datetime',
    '#title' => $this->t('Time without date'),
    // HTML 5 time element format can be H:i
    '#default_value' => DrupalDateTime::createFromFormat('Y-m-d H:i:s', '1970-01-01 20:00', 'UTC'),
    '#size' => 20,
    '#date_date_element' => 'none',
    // This sets html 5 time element use explicitly, probably not necessary.
    '#date_time_element' => 'time',
  );
mradcliffe
источник
2
Я также вспомнил кое-что об элементе datetime. Вы должны быть в состоянии установить noneдля части даты и получить обратно только часть времени.
Мрадклифф
@mradcliffe Не могли бы вы предоставить подробные инструкции для этого новичка? Если я смогу заставить его работать, я бы без колебаний дал вам награду! Спасибо!
Крис Хэппи
Есть что-то конкретное, на чем вы застряли? Возможно, сложно написать код в комментарии, но я бы позаботился о том, чтобы в вашем массиве форм были установлены соответствующие свойства элемента (ключи с '#'). Я обновлю ответ несколькими примерами из api.drupal.org чуть позже.
Мрадклифф
1
Здесь он создал еще один вопрос: drupal.stackexchange.com/questions/227029/… , поскольку его вопрос был более специфичным для виджета поля, а не для элементов API формы.
Мрадклифф
1
@AdrianCidAlmaguer Да, я поделился кодом здесь . Я рассмотрю вопрос о преобразовании его в Github. Надеюсь, поможет!
Крис Хэппи