タイプとIDからエンティティのバンドルを取得するにはどうすればよいですか?


11

bundleからエンティティを識別する必要がtypeありidます。

たとえば、typeが「ノード」でid7の場合、「ページ」はと表示されbundleます。

ありがとう

回答:


11

entity_load@Nikhilで言及されているようにエンティティをロードするために使用します。

次に、entity_extract_idsを使用して、バンドルを抽出します。例:

$entity = entity_load('node', array('7'));

list(, , $bundle) = entity_extract_ids('node', $entity);

echo "Bundle name is : " . $bundle;

関数entity_extract_idsは、要素を含む数値でインデックス付けされた配列(ハッシュテーブルではない)を返します。

  • 0:エンティティのプライマリID。
  • 1:エンティティのリビジョンID。$ entity_typeがバージョン管理されていない場合はNULL。
  • 2:エンティティのバンドル名。$ entity_typeにバンドルがない場合はNULL。

ここで、01、および2配列インデックスです。ただし、coreおよびcontribモジュールで使用されるアプローチは、list()関数を使用することです。


配列の数値インデックスに依存するのは良くないと思います。
Junaid 2013年

3
@Junaidそのインデックスは予測可能であるため、問題ありません。これが、Drupalコアがこのタスクを処理する方法です。「マジックナンバー」気になる場合は、あなただけの言語機能を使用する:list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
クライヴ

@Junaid変更されないことが確実な場合は、数値インデックスに依存できます。数値インデックスを使用した理由の説明については、編集を参照してください。これは、API関数がそのように設計されているためです。また、ソリューションはエンティティモジュールに依存しません;-)
AjitS 2013年

7

ここで最もクリーンな私はオーガニックグループモジュールコードから得たことを一つ。

$wrapper = entity_metadata_wrapper($entity_type, $entity_id);
$bundle = $wrapper->getBundle();

たとえば、次のように呼び出すことができます。

$wrapper = entity_metadata_wrapper('node', 1);
$bundle = $wrapper->getBundle();

編集:@Cliveが指摘したように、上記の方法はエンティティモジュールに依存します。

追加モジュールに依存しない別の方法を次に示します。それはここで説明されていますhttps://forrst.com/posts/Get_the_bundle_of_a_Drupal_7_entity-0xW

そのメソッドをコピーして貼り付けます:

function _entity_get_bundle($entity, $entity_type) {
  $info = entity_get_info($entity_type);
  if (empty($info['entity keys']['bundle'])) {
    return $entity_type;
  } else {
    return $entity->{$info['entity keys']['bundle']};
  }
}

なに$group_type, $gid?そして、値は$bundle どうですか?
niksmac 2013年

適切なパラメータ名を使用するのを忘れていました。現在は修正されています。
Junaid 2013年

あなたは同じentity_loadように、いかにその最もクリーンなことをすることができますか?
niksmac 2013年

1
個人的にはentity_metadata_wrapper()entity_extract_ids()メソッドよりもきれいだとは思いません。さらに、インストールされているエンティティモジュールに依存しています...
Clive

必ずしもクリーンであるとは限りませんが、特にメタデータラッパーを使用している場合は特に有効です。たぶん@develkarまたはJunaidは両方の選択肢を含めるように回答を編集できますか?(Junaid、Entityモジュールへのリンクとentity_metadata_wrappersに関するページへのリンクを追加することもできますか?)
アリスヒートン

3

トライentity_load

データベースからエンティティをロードします。

エンティティは静的メモリキャッシュに保存され、同じページリクエスト中に再度読み込まれた場合、データベースアクセスを必要としません。

パラメーター

$ entity_type:ロードするエンティティタイプ(ノードやユーザーなど)。

$ ids:エンティティIDの配列、またはすべてのエンティティをロードする場合はFALSE。

$ conditions:(非推奨)ベーステーブルの条件の連想配列。キーはデータベースフィールドで、値はフィールドに必要な値です。代わりに、EntityFieldQueryを使用して、この関数でロード可能なエンティティIDのリストを取得することをお勧めします。

$ reset:リクエストされたエンティティタイプの内部キャッシュをリセットするかどうか。

戻り値

IDでインデックス付けされたエンティティオブジェクトの配列。結果が見つからない場合は、空の配列が返されます。


3

ノードIDからノードタイプを取得する非常に軽量な方法が必要な場合は、ノードテーブルで単一の選択クエリを使用できます。

$type = db_query("SELECT type FROM {node} WHERE nid = :nid", 
                  array(':nid' => $nid))->fetchField();

そうすれば、entity_loadなどを使用してエンティティフックシステム全体を呼び出す必要がなくなります。

これは、インデックス付きノードIDを使用した単一の選択クエリです。


ここではノードだけで遊んではいません。
Junaid 2014年

OPは、「たとえば、タイプが「ノード」で、IDが7の場合、「ページ」をバンドルとして取得する場合があります。」したがって、ノードベースの例の答え。
David Thomas
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.