web-dev-qa-db-ja.com

プログラムで時間タイプフィールドをどのように設定しますか?

カスタムコンテンツエンティティタイプを作成します。

イベント時間に1つのフィールドが必要です。

時間フィールドはありませんが、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エラーによりタイプのnullが返されます。だから私は秒でストア時間にintを使用しています。

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入力タイプtimeを除いてすべてが機能しています

Drupalはhtml5の一部の入力を知っていますが、すべてではありません...タイプtel、電子メール、数値、範囲、色、日付、日付時刻はOKですが、時刻タイプだけではありません。

だから私はカスタムプラグインでそれを手に入れたいと思っていましたが...

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

これについて何か考えはありますか?

8
Kevin

フォーム要素のプロパティ#typeは、HTML要素ではなく、要素タイプを指します。独自の要素タイプ(またはテーマタイプ)を定義しても問題ありません。独自のマークアップを提供できます。これは RenderElement プラグインを実装することで実行できます。

更新:

datetime render要素を使用して、日付部分を無効にすることもできます。

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