コードを使用して、モジュール内にエンティティを作成しました。 _drupal console generate:entity:content
_(バンドルなし)でスケルトンを生成し、次にbaseFieldDefinitions()
の日時フィールドをTestFieldEntityItem.phpに追加しました。
_$fields['test_date'] = BaseFieldDefinition::create('datetime')
->setLabel(t('Test date'))
->setDescription(t('Test.'))
->setRevisionable(TRUE)
->setSettings([
'datetime_type' => 'date'
])
->setDefaultValue('')
->setDisplayOptions('view', [
'label' => 'above',
'type' => 'datetime_default',
'settings' => [
'format_type' => 'medium',
],
'weight' => 14,
])
->setDisplayOptions('form', [
'type' => 'datetime_default',
'weight' => 14,
])
->setDisplayConfigurable('form', TRUE)
->setDisplayConfigurable('view', TRUE);
_
モジュールをインストールし、キャッシュをクリアし、calendarおよびcalendar_datetimeモジュールを再インストールしましたが、calendarモジュールが提案するように、テンプレートからビューを追加しようとすると、datetimeフィールドに一致するテンプレートが表示されません。
UIを使用してこのエンティティに日時フィールドを作成すると、ビューテンプレートに表示されます。何が欠けていますか?
カレンダーコードを調べると、日時フィールドを検索する関数が ViewsFieldTemplate.php に見つかりました。この関数はフィールドを検出しますが、argument
プロパティのため、field_infoはisDateField()
と一致しません。
isDateField()は、引数IDとして「datetime」を要求します。
_protected function isDateField($field_info) {
if (!empty($field_info['field']['id']) && $field_info['field']['id'] == 'field') {
if (!empty($field_info['argument']['id']) && $field_info['argument']['id'] == 'date') {
return TRUE;
}
}
return FALSE;
}
_
私のfield_info引数は 'string'です。
_array (size=7)
'title' => ...
'help' => ...
'field' =>
'id' => string 'field' (length=5)
'argument' =>
'id' => string 'string' (length=6)
'filter' =>
'id' => string 'string' (length=6)
'sort' =>
'id' => string 'standard' (length=8)
'entity field' => string 'test_date' (length=4)
_
@ 4k4の回答のおかげで、私は稼働日フィールドと同じことをしようとしました、そして私は自分のEntityViewsDataを作成しました(私は最初にhook_views_data_alter()を試しましたが、フィールドは入力データに存在しませんでした)
_namespace Drupal\kabukis_tests\Entity;
use Drupal\views\EntityViewsData;
class TestEntityViewsData extends EntityViewsData {
public function getViewsData() {
$additionalData = [
'test_date' => [
'title' => new TranslatableMarkup('Birth date'),
'help' => new TranslatableMarkup('Birth date'),
'field' => [ 'id' => 'field' ],
'argument' => [ 'id' => 'date' ],
'filter' => [ 'id' => 'date' ],
'sort' => [ 'id' => 'date' ],
'entity field' => 'test_date',
]
];
$data['test_field_entity_field_data'] = array_merge($data['test_field_entity_field_data'], $additionalData);
return $data;
}
}
_
これで、フィールドがビューテンプレートリストに表示されます。ただし、生成されたビューが機能していないため、次のエラーが発生します。
\ Drupal\calendar\Plugin\views\style\CalendarStyle:カレンダースタイルを使用する場合はカレンダーの日付引数が必要ですが、欠落しているか、デフォルトの日付を使用していません。
EntityViewsData
はエンティティタイプのビューの情報を提供し、ビューに含まれるようにします。日時ベースフィールドの場合、この問題 https://www.drupal.org/node/2489476 のため、現時点では機能していません。したがって、hook_views_data
で、またはEntityViewsData
を拡張してデータを提供する必要があります。ドキュメントから:
- 引数:ビューで引数またはコンテキストフィルターとして使用できるようにするハンドラーを指定します。
UIで構成されたフィールドを使用する場合の実際の例があるので、ビューデータをコピーしてみることができると説明しました。