Làm thế nào để thiết lập trường loại thời gian theo chương trình?


8

Tôi tạo một loại thực thể nội dung tùy chỉnh.

Tôi muốn một lĩnh vực cho thời gian sự kiện.

Vì không có trường thời gian, nhưng là dataTime_type, tôi tạo một plugin cho trường tùy chỉnh:

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,
            ),
        ),

    );
  }

Tôi cố gắng thay đổi loại thành thời gian (đối với mysql) nhưng lỗi mysql trả lại cho tôi một giá trị null cho loại. Vì vậy, tôi sử dụng int cho thời gian lưu trữ trong seconde.

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;
}

Thực thể của tôi:

 $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);

Tất cả đều hoạt động ngoại trừ một điều, thời gian loại đầu vào HTML5

Drupal biết một số đầu vào trong html5 nhưng không phải tất cả ... gõ tel, email, số, phạm vi, màu sắc, ngày tháng, datetime là ok nhưng không phải là thời gian loại một mình.

Vì vậy, tôi đã hy vọng có được nó với một plugin tùy chỉnh, nhưng không ...

Chỉnh sửa 1

Cách duy nhất tôi đã tìm thấy là tạo 2 select cho loại này:

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;
}

Bất cứ ý tưởng về điều này?


Tôi cần một loại trường như thế này, bạn có thể chia sẻ mã của mình trong github hoặc ở nơi khác không?
Adrian Cid Almaguer

Bạn có thể sử dụng mô-đun drupal.org/project/time_field .
Mất Koder

Câu trả lời:


12

Thuộc tính phần tử biểu mẫu #typeđề cập đến một loại phần tử, không phải là phần tử HTML. Bạn có thể xác định các loại phần tử của riêng mình (hoặc các loại chủ đề) và bạn có thể cung cấp đánh dấu của riêng bạn cho nó. Điều này có thể được thực hiện bằng cách thực hiện một plugin RenderEuity .

Cập nhật:

Bạn cũng có thể sử dụng datetimephần tử kết xuất và vô hiệu hóa phần ngày.

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

Cập nhật 2:

Biểu mẫu nhận xét có một ví dụ về mảng kết xuất sử dụng datetimekiểu. Vì vậy, như là một hướng dẫn,

  $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',
  );

2
Tôi cũng nhớ một cái gì đó về yếu tố datetime. Bạn sẽ có thể đặt nonecho phần ngày và chỉ lấy lại phần thời gian.
mradcliffe

@mradcliffe Bạn có thể cung cấp hướng dẫn chi tiết cho người mới này không? Nếu tôi có thể làm cho nó hoạt động, tôi sẽ không ngần ngại cho bạn tiền thưởng! Cảm ơn!
Chris Chúc mừng

Có điều gì đặc biệt mà bạn đang mắc kẹt? Có thể khó gửi mã trong một nhận xét, nhưng tôi sẽ đảm bảo rằng trong biểu mẫu của bạn, các thuộc tính phần tử thích hợp (các khóa có '#') được đặt. Tôi sẽ cập nhật câu trả lời với một số ví dụ từ api.drupal.org một chút.
mradcliffe

1
Anh ta đã tạo ra một câu hỏi khác ở đây: drupal.stackexchange.com/questions/227029/ , vì câu hỏi của anh ta cụ thể hơn đối với tiện ích trường thay vì các thành phần API.
mradcliffe

1
@AdrianCidAlmaguer Vâng, tôi đã chia sẻ mã ở đây . Tôi sẽ xem xét chuyển đổi nó thành Github. Hy vọng nó giúp!
Chris Chúc mừng
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.