Saya membuat tipe entitas konten khusus.
Saya ingin satu bidang untuk waktu acara.
Karena tidak ada bidang waktu, tetapi dataTime_type, saya membuat plugin untuk bidang khusus:
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,
),
),
);
}
Saya mencoba mengubah tipe ke waktu (untuk mysql) tetapi kesalahan mysql mengembalikan saya nol untuk jenisnya. Jadi saya menggunakan int untuk waktu toko di detik.
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;
}
Entitas saya:
$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);
Semua berfungsi kecuali satu hal, yaitu jenis input HTML5 waktu
Drupal tahu beberapa input dalam HTML5 tetapi tidak semua ... ketik tel, email, nomor, rentang, warna, tanggal, datetime ok tapi bukan tipe waktu saja.
Jadi saya berharap mendapatkannya dengan plugin khusus, tapi tidak ...
Edit 1
Satu-satunya cara yang saya temukan adalah membuat 2 pilih untuk jenis ini:
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;
}
Ada ide tentang ini?
Jawaban:
Properti elemen formulir
#type
merujuk ke tipe elemen, bukan elemen HTML. Tidak masalah untuk mendefinisikan jenis elemen Anda sendiri (atau jenis tema), dan Anda dapat memberikan markup sendiri untuk itu. Ini dapat dilakukan dengan menerapkan plugin RenderElement .Memperbarui:
Anda juga dapat menggunakan
datetime
elemen render dan menonaktifkan bagian tanggal.$element['#date_date_element'] = 'none';
Pembaruan 2:
The formulir komentar memiliki contoh membuat array menggunakan
datetime
tipe. Jadi mengingat itu sebagai pedoman,sumber
none
untuk bagian tanggal dan mendapatkan kembali hanya bagian waktu.