web-dev-qa-db-ja.com

カレンダーのカスタムエンティティ日時フィールド

コードを使用して、モジュール内にエンティティを作成しました。 _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:カレンダースタイルを使用する場合はカレンダーの日付引数が必要ですが、欠落しているか、デフォルトの日付を使用していません。

2
Grubshka

EntityViewsDataはエンティティタイプのビューの情報を提供し、ビューに含まれるようにします。日時ベースフィールドの場合、この問題 https://www.drupal.org/node/2489476 のため、現時点では機能していません。したがって、hook_views_dataで、またはEntityViewsDataを拡張してデータを提供する必要があります。ドキュメントから:

  • 引数:ビューで引数またはコンテキストフィルターとして使用できるようにするハンドラーを指定します。

https://api.drupal.org/api/drupal/core%21modules%21views%21views.api.php/function/hook_views_data/8.3.x

UIで構成されたフィールドを使用する場合の実際の例があるので、ビューデータをコピーしてみることができると説明しました。

3
4k4