メインコンテンツに移動

メインナビゲーション

  • ホーム
  • サイトマップ
  • ビデオ
  • ご連絡

パンくず

  • ホーム
  • DrupalのEntityAPIを実装したエンティティはViewsでの検索可能になったためhook_views_dataの実装必要はない

DrupalのEntityAPIを実装したエンティティはViewsでの検索可能になったためhook_views_dataの実装必要はない

drupal
entity type
Views

EntityAPIを実装した場合モジュール(Views)でのエンティティ検索ができるようになります

  • モジュール(EntitAPI)をインストールし、Entityをプログラミングで定義します
    • DrupalのEntityを定義する簡単な例
  • EntityAPIがモジュール(Views)の統合機能(Integration)が提供されているため、直ちにViewsでエンティティの検索ができるようになります

うっかりしてEntityAPI実装したエンティティにhook_views_data()を実装したせいでモジュール(Entityreferecen views widget)の使用ができなくなりました

  • hook_views_data() はモジュール(Views)にカスタムテーブルの検索ができるようにする機能があります
    • 任意のカスタムテーブルをViewsで検索することができます
  • hook_views_data()の定義に「entity type」パラメーターの説明がありませんでした(本家の説明をご参考)
  • hook_views_data()実装してエンティティのデータ検索はできましたが、モジュール(Entityreferecen views widget)の使用はできません
    • Viewsの管理画面でディスプレイを追加ボタンを押すと「Entity Reference view widgetの追加」項目がありませんでした

原因:「Entity Reference view widgetの追加」項目を追加するためEntityの定義に「entity type」パラメーターが欠けていました

  • なぜ「Entity Reference view widgetの追加」項目がViewsの管理画面にないか、デバッグで調査しました
  • entityreference_view_widget.views.incの50行あたりに「Entity Reference view widgetの追加」項目の記述がありました
    • エンティティのtable/entity type の定義がなかったため、「Entity Reference view widgetの追加」項目が表示されませんでした
      hook_views_data実装時に”entity type”定義がないためentityreference views widgetsの使用はできない

修正:hook_views_data() の実装をやめたら直りました

  • hook_views_data()の実装部分を作成して、キャッシュをクリアします
  • Viewsの管理画面に「Entity Reference view widgetの追加」項目がありました

 

drupal
video
entity type

Entityを定義する簡単な例:Roomエンティティ(Entityのサンプロモジュール:entity_example)

  • Entityをプログラミングで定義するには、最初簡単なこと、必要最小限のことを定義します
  • ここで、ルーム(Room)エンティティ(Entity)を例として紹介します(サンプルモジュールをダウンロードしてください)
    Roomエンティティ例とします

Roomエンティティ:Entityの定義 + データインポート + Entityの参照

  • Roomのテストデータ(dsvフォーマット): 

    • ルームナンバー: room_number

    • ルームタイプ:: type
      rid,room_number,type
      1,1001,シングル
      2,1002,シングル
      3,1003,シングル
      4,2001,ダブル
      5,3001,ダブル
  • データベース上に「room」テーブルを作成、または、モジュールのinstallファイルでスキーマを定義して、モジュールがインストール時に自動的に作成されます
    /**
     * Implement hook_schema()
     */
    function entity_example_schema(){
        $schema['room']=array(
            'description' => 'Rooms',
            'fields' => array(
                'rid' => array(
                    'type' => 'serial',
                    'description' => 'Room Id'
                ),
                'type' => array(
                    'type' => 'varchar',
                    'length' => '255',
                    'description' => 'Room Type'
                ),
                'room_number' => array(
                    'type' => 'varchar',
                    'length' => '25',
                    'description' => 'Room Number'
                ),
    
            ),
            'primary key' => array('rid'),
    
        );
    
        return $schema;
    }
  • モジュールファイル(.module)にRoomエンティティを定義します
    /**
     * Implements hook_entity_info().
     */
    /**
     * Implements hook_entity_info().
     */
    function entity_example_entity_info()
    {
    
       $services['room'] = array(
            'label' => t('Room'),                       // エンティティ名
            'entity class' => 'Entity',                 // デフォルトクラスの使用
            'controller class' => 'EntityAPIController',// デフォルトクラスの使用
            'base table' => 'room',                     // DB上のテーブル名
            'fieldable' => TRUE,                        // 余分のフィールド追加可能
            'entity keys' => array(                     // ルームIDをエンティティのキー.
                'id' => 'rid',
                'label' => 'room_number',               // コールバック関数が優先
            ),
            'view modes' => array(
                'full' => array(
                    'label' => t('Default'),
                    'custom settings' => FALSE,
                ),
            ),
            'bundles' => array(),                       // bundleはこのエンティティ自身
    //        'label callback' => 'room_label',       // 指定しないとラベルの取得ができない
            'access callback' => 'room_access' ,        // default:'value user_access'動作しない
            'module' => 'entity_example',
            'metadata controller class' => 'EntityExampleMetadataController',
    
        );
    
        return $services;
    }
    
    /**
     * Extend the defaults.
     */
    class EntityExampleMetadataController extends EntityDefaultMetadataController {
        public function entityPropertyInfo() {
            $info = parent::entityPropertyInfo();
            $properties = &$info[$this->type]['properties'];
            $properties['type'] = array(
                'label' => t('Room type'),
                'schema field' => 'type',
                'getter callback' => 'entity_property_getter_method',
                'setter callback' => 'entity_property_verbatim_set',
                'required' => TRUE,
                'description' => t('Room type of the room'),
            );
            $properties['room_number'] = array(
                'label' => t('Room Number'),
                'schema field' => 'room_number',
                'getter callback' => 'entity_property_getter_method',
                'setter callback' => 'entity_property_verbatim_set',
                'required' => TRUE,
                'description' => t('The number of the room'),
            )
            return $info;
        }
    }
    
    function room_access($op, $room = NULL, $account = NULL) {
        // 全員アクセス可能にする
        return TRUE;
    }
    
    
  • これだけで、Entityの定義が完了しました
  • モジュール(Feeds)でRoomサンプルデータをDBにインポートします
    • モジュール(Feeds Entity Processor)のインストール/有効化が必要
  • 実際にRoomエンティティが動作しているかをテストします
    • 任意のコンテンツタイプ(例:記事)Roomフィールドを追加します(Entity参照タイプ)
    • Entity参照タイプのターゲットを「Room」にします
    • 一つの記事を作成して、Roomエンティティの動作を確認します

Enity定義の注意点:アクセス権限、エンティティのラベル定義を正しく定義します

  • 上記例として、Entityの必要な最低限な定義となります
  • ネットでEntity定義例がありますが、アクセス権限、エンティティのラベルなどの権限が間違いやすいです
  • アクセス権限(access callback)で定義しないと、エンティティのラベルがうまく表示されないです
    Entityのアクセスコールバックが定義しないとラベルがうまく表示されない
  • エンティティのラベルを2か所で定義できます
    • entity_keys: DB上にどのフィールドがラベルとして利用するかを指定します
    • label callback : ユーザー必要応じて、ラベルを生成するコールバック関数
    • コールバック関数がentity_keys設定より優先です
      Entityのラベル設定

 

 

 

添付 サイズ
entity_example.zip (1.87 KB) 1.87 KB
Embedded thumbnail for DrupalのEntityを定義する簡単な例
ホーム

古松

検索

Article Category

  • apache(7)
  • css(19)
  • drupal(295)
  • Electron(4)
  • html(34)
  • javascript(27)
  • laravel(4)
  • linux(5)
  • macOS(2)
  • mysql(13)
  • php(19)
  • python(4)
  • SEO(12)
  • video(72)
  • Visual Studio Code(4)
  • windows(13)
  • wordpress(32)