Bagaimana saya bisa mendapatkan bundel entitas dari tipe dan id?


11

Saya perlu mengidentifikasi bundleentitas dari typedan id.

Misalnya, jika typeis 'node' dan id7, saya mungkin mendapatkan 'page' sebagai bundle.

Terima kasih

Jawaban:


11

Gunakan entity_loaduntuk memuat entitas seperti yang disebutkan oleh @Nikhil.

Kemudian gunakan entitas_extract_ids , untuk mengekstrak bundel. Contoh:

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

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

echo "Bundle name is : " . $bundle;

Fungsi entity_extract_idsmengembalikan array yang diindeks secara numerik (bukan tabel hash) yang mengandung elemen:

  • 0: ID primer entitas.
  • 1: ID Revisi entitas, atau NULL jika $ entity_type tidak diversi.
  • 2: Nama bundel entitas, atau NULL jika $ entity_type tidak memiliki bundel.

di mana, 0, 1, dan 2adalah indeks array. Namun, pendekatan yang digunakan oleh modul inti dan kontrib adalah dengan menggunakan list()fungsi tersebut.


Saya pikir itu tidak baik untuk bergantung pada indeks numerik array.
Junaid

3
@ Junaid Indeks itu bisa ditebak jadi tidak masalah. Beginilah inti Drupal menangani tugas ini. Jika 'angka ajaib' mengganggu Anda hanya menggunakan fitur bahasa:list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
Clive

@ Junaid Anda dapat bergantung pada indeks numerik, ketika Anda yakin mereka tidak akan berubah. Lihat hasil edit untuk penjelasan mengapa saya menggunakan indeks numerik. Itu karena fungsi API dirancang seperti itu. Juga, solusinya tidak tergantung pada modul entitas ;-)
AjitS

7

Ini adalah yang terbersih yang saya dapatkan dari kode modul kelompok organik.

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

Misalnya saya bisa menyebutnya seperti:

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

Sunting: Seperti yang ditunjukkan oleh @Clive, metode di atas tergantung pada modul entitas.

Berikut adalah metode lain yang tidak bergantung pada modul tambahan apa pun. Dijelaskan di sini https://forrst.com/posts/Get_the_bundle_of_a_Drupal_7_entity-0xW

Salin menempelkan metode itu:

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']};
  }
}

Apa $group_type, $gid? dan apa nilainya $bundle ?
niksmac

Maaf, saya lupa menggunakan nama parameter yang tepat. Itu diperbaiki sekarang.
Junaid

Anda dapat melakukan hal yang sama untuk entity_load, dengan cara bagaimana itu terbersih?
niksmac

1
Secara pribadi saya tidak berpikir entity_metadata_wrapper()lebih bersih dari entity_extract_ids()metodenya. Ditambah lagi, Anda mengandalkan modul entitas yang sedang diinstal ...
Clive

Ini tidak selalu lebih bersih, tetapi ini merupakan alternatif yang valid, terutama jika Anda menggunakan pembungkus metadata. Mungkin @develkar atau Junaid dapat mengedit jawaban mereka untuk menyertakan kedua alternatif? (Junaid, mungkin Anda bisa menambahkan tautan ke modul Entity dan ke halaman tentang entitas_metadata_wrappers juga?)
Alice Heaton

3

Coba entitas_load

Memuat entitas dari database.

Entitas disimpan dalam cache memori statis, dan tidak akan memerlukan akses database jika dimuat lagi selama permintaan halaman yang sama.

Parameter

$ entity_type : Jenis entitas yang akan dimuat, misal simpul atau pengguna.

$ Id : Array ID entitas, atau FALSE untuk memuat semua entitas.

$ conditions : (usang) Array asosiatif dari kondisi pada tabel dasar, di mana kuncinya adalah bidang basis data dan nilai adalah nilai yang harus dimiliki bidang tersebut. Sebagai gantinya, lebih disukai menggunakan EntityFieldQuery untuk mengambil daftar ID entitas yang dapat dimuat oleh fungsi ini.

$ reset : Apakah akan mereset cache internal untuk jenis entitas yang diminta.

Nilai pengembalian

Array objek entitas yang diindeks oleh id mereka. Ketika tidak ada hasil yang ditemukan, array kosong dikembalikan.


3

Jika Anda menginginkan cara yang sangat ringan, berdasarkan kinerja, untuk mendapatkan jenis simpul dari id simpul - Anda dapat menggunakan kueri pemilihan tunggal pada tabel simpul.

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

Dengan begitu, Anda tidak perlu memanggil seluruh sistem kait entitas, dengan entity_load dll.

Ini adalah kueri pemilihan tunggal menggunakan id simpul yang diindeks.


kami tidak bermain hanya dengan simpul di sini.
Junaid

OP menulis "Misalnya, jika jenisnya adalah 'simpul' dan id adalah 7, saya mungkin mendapatkan 'laman' sebagai bundel." maka jawaban contoh berdasarkan simpul.
David Thomas
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.