web-dev-qa-db-ja.com

タイムスタンプフィールドのデフォルト値を空に設定

Drupal 8ノードにフィールドタイプ「タイムスタンプ」を作成しました。フィールドは必須ではありません。フィールド設定のデフォルト値には、デフォルトの日付/時間を選択できるHTML 5日時ピッカーがあります。または、図のように値を残します。

enter image description here

しかし、Drupalの動作は少し奇妙に思えます-デフォルトの日付を選択すると、この値はノードの保存時に設定されます(これは正しいです)。フィールドを空白のままにすると(図の値)フォームの送信時にフィールドを保存します(フィールドのコメントに記載されているため、バグではありません)...しかし、他のすべてのフィールドで可能なため、フィールドを空白のままにしたい場合にデフォルト値を無効にする方法(たとえば、text、number、...)?このフィールド構成にはこれに関する設定はありません。また、これは論理的ではなく、他のフィールドを空白のままにすると、実際には空白になります。このフィールドタイプを空白のままにすると、それでも値は保存されますか(追加のチェックボックスの方が論理的です)?

ありがとう

6
Juraj Nemec

これには少し複雑な裏話があります。

Timestampフィールドタイプが追加されました Drupal 8.2.0コアに戻る として「 UIフィールド」。フィールドタイプは常に舞台裏フィールドとして存在し、CreatedItemおよびChangedItemのベースフィールドとしてエンティティタイムスタンプ(両方とも非-UIフィールドタイプ)。

このフィールドが編集ページの適切なウィジェットでレンダリングされる場合( bug を参照)、最終的にはTimestampDatetimeWidgetを使用することになります。このウィジェットには ::massageFormValues() メソッドがあり、要素が空の場合、フィールド値として(保存時に)現在使用されている時間が適用されます。

したがって、表示されている動作は仕様によるものです。ウィジェットは 当初は意図されていました エンティティ編集ページ用で、エンティティの保存後に、作成および変更されたタイムスタンプが空の値になることはありません。このフィールドがUIフィールドとして追加されたとき、ウィジェットとその動作を継承しました。

本当にタイムスタンプが必要で、この動作を望まない場合は、カスタムモジュールを作成して独自のウィジェットを作成する必要があります。 TimestampDatetimeWidgetをモジュールにコピーし、名前を変更し、注釈を更新し、::massageFormValues()メソッドを更新するだけです。

  • $date = new DrupalDateTime();を含むelseブランチを削除します-これはデフォルトの日時を設定しません
  • 未設定の_$date_変数の処理、例:$item['value'] = !empty($date) ? $date->getTimestamp() : NULL;

これにより、タイムスタンプを空にすることができます。

個人的には、Timestampフィールドは使用しません。私はDateフィールドを使用します。これは空の値またはデフォルト値を持つことができ、一般的にはより優れたウィジェットとフォーマッターです。

7
mpdonadio