プログラムで時間型フィールドを設定するにはどうすればよいですか?


8

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

イベント時間に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入力タイプの時間を除いてすべてが機能しています

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

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

編集1

私が見つけた唯一の方法は、このタイプの2つの選択を作成することです。

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

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


このようなフィールドタイプが必要です。githubまたは他の場所でコードを共有できますか?
エイドリアンCid Almaguer、2017

回答:


12

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

更新:

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

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

2
また、datetime要素についても思い出しました。none日付部分を設定して、時間部分のみを取得できるはずです。
mradcliffe

@mradcliffeこの初心者向けの詳細な手順を教えてもらえますか?私がそれを機能させることができれば、私はあなたに賞金を与えることをためらわないでしょう!ありがとう!
Chris Happy

行き詰まっていることはありますか?コメントにコードを投稿するのはおそらく難しいでしょうが、フォーム配列に適切な要素のプロパティ( '#'が付いたキー)が設定されていることを確認します。api.drupal.orgの例を使用して回答を少し更新します。
mradcliffe 2017年

1
彼はここで別の質問を作成しました:drupal.stackexchange.com/questions/227029/…、彼の質問はAPI要素を形成するのではなく、フィールドウィジェットに固有でした。
mradcliffe 2017

1
@AdrianCidAlmaguerはい、ここでコードを共有しました。それをGithubに変換することを検討します。それが役に立てば幸い!
クリスハッピー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.