Bagaimana cara menetapkan bidang jenis waktu secara terprogram?

8

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?

Kevin
sumber
Saya memerlukan jenis bidang seperti ini, dapatkah Anda membagikan kode Anda di github atau di tempat lain?
Adrian Cid Almaguer
Anda dapat menggunakan modul drupal.org/project/time_field .
Lost Koder

Jawaban:

12

Properti elemen formulir #typemerujuk 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 datetimeelemen render dan menonaktifkan bagian tanggal.

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

Pembaruan 2:

The formulir komentar memiliki contoh membuat array menggunakan datetimetipe. Jadi mengingat itu sebagai pedoman,

  $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
sumber
2
Saya juga ingat sesuatu tentang elemen datetime. Anda harus dapat mengatur noneuntuk bagian tanggal dan mendapatkan kembali hanya bagian waktu.
mradcliffe
@ mradcliffe Bisakah Anda memberikan instruksi terperinci untuk pemula ini? Jika saya bisa membuatnya bekerja, saya tidak akan ragu untuk memberi Anda hadiah! Terima kasih!
Chris Happy
Apakah ada sesuatu yang Anda terjebak? Mungkin sulit untuk memposting kode dalam komentar, tetapi saya akan memastikan bahwa dalam form array Anda, properti elemen yang sesuai (kunci dengan '#') ditetapkan. Saya akan memperbarui jawabannya dengan beberapa contoh dari api.drupal.org dalam sedikit.
mradcliffe
1
Dia membuat pertanyaan lain di sini: drupal.stackexchange.com/questions/227029/… , karena pertanyaannya lebih spesifik untuk widget bidang daripada bentuk elemen API.
mradcliffe
1
@AdrianCidAlmaguer Ya, saya telah membagikan kodenya di sini . Saya akan mempertimbangkan untuk mengubahnya menjadi Github. Semoga ini bisa membantu!
Chris Happy