Jak mogę uzyskać pakiet jednostki na podstawie typu i identyfikatora?

11

Muszę zidentyfikować bundlebyt na podstawie jego typei id.

Na przykład, jeśli typejest to „węzeł” i idwynosi 7, mogę otrzymać „page” jako bundle.

Dzięki

Junaid
źródło

Odpowiedzi:

11

Służy entity_loaddo ładowania jednostki, jak wspomniano w @Nikhil.

Następnie użyj encji_wyodrębniania_id , aby wyodrębnić pakiet. Przykład:

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

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

echo "Bundle name is : " . $bundle;

Funkcja entity_extract_idszwraca tablicę indeksowaną numerycznie (nie tablicę skrótu) zawierającą elementy:

  • 0: Podstawowy identyfikator encji.
  • 1: Identyfikator zmiany encji lub NULL, jeśli $ entity_type nie jest wersjonowany.
  • 2: Nazwa pakietu encji lub NULL, jeśli typ $ entity_type nie ma pakietów.

gdzie 0, 1i 2są indeksami macierzy. Jednak podejście zastosowane w modułach core i contrib polega na użyciu tej list()funkcji.

AjitS
źródło
Myślę, że nie jest dobrze polegać na indeksie numerycznym tablicy.
Junaid
3
@Junaid Ten indeks jest przewidywalny, więc jest w porządku. W ten sposób rdzeń Drupala radzi sobie z tym zadaniem. Jeśli przeszkadza ci „magiczna liczba”, po prostu skorzystaj z funkcji językowych:list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
Clive
@Junaid Możesz polegać na indeksie numerycznym, jeśli masz pewność, że się nie zmienią. Zobacz wyjaśnienie, dlaczego użyłem indeksu numerycznego. Jest tak, ponieważ funkcja API została zaprojektowana w ten sposób. Ponadto rozwiązanie nie jest zależne od modułu encji ;-)
AjitS
7

Oto najczystszy kod z modułu Organicznych grup.

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

Na przykład mogę to nazwać:

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

Edycja: Jak wskazał @Clive, powyższa metoda zależy od modułu encji.

Oto kolejna metoda, która nie zależy od żadnego dodatkowego modułu. Wyjaśniono to tutaj https://forrst.com/posts/Get_the_bundle_of_a_Drupal_7_entity-0xW

Skopiuj wklejanie tej metody:

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']};
  }
}
Junaid
źródło
Co to jest $group_type, $gid? i jaka jest wartość $bundle ?
niksmac,
Przepraszam, zapomniałem użyć poprawnych nazw parametrów. Zostało to teraz poprawione.
Junaid
Możesz zrobić to samo entity_load, przy okazji, jak to jest najczystsze?
niksmac,
1
Osobiście uważam, że nie entity_metadata_wrapper()jest czystszy niż entity_extract_ids()metoda. Dodatkowo polegasz na zainstalowaniu modułu encji ...
Clive
Niekoniecznie jest czystszy, ale jest to ważna alternatywa, zwłaszcza jeśli i tak używasz opakowań metadanych. Może @develkar lub Junaid mogliby edytować swoją odpowiedź, aby uwzględnić obie alternatywy? (Junaid, może mógłbyś także dodać linki do modułu Entity i do strony o encji_metadata_wrappers?)
Alice Heaton,
3

Wypróbuj entity_load

Załaduj jednostki z bazy danych.

Jednostki są przechowywane w statycznej pamięci podręcznej i nie będą wymagać dostępu do bazy danych, jeśli zostaną ponownie załadowane podczas tego samego żądania strony.

Parametry

$ entity_type : typ jednostki do załadowania, np. węzeł lub użytkownik.

$ ids : tablica identyfikatorów encji lub FALSE, aby załadować wszystkie encje.

$ warunki : (przestarzałe) Tablica asocjacyjna warunków w tabeli podstawowej, gdzie kluczami są pola bazy danych, a wartości są wartościami, które pola te muszą mieć. Zamiast tego lepiej jest użyć EntityFieldQuery do pobrania listy identyfikatorów encji ładowanych przez tę funkcję.

$ reset : czy zresetować wewnętrzną pamięć podręczną dla żądanego typu encji.

Zwracana wartość

Tablica obiektów encji indeksowana według ich identyfikatorów. Gdy nie zostaną znalezione żadne wyniki, zwracana jest pusta tablica.

niksmac
źródło
3

Jeśli chcesz uzyskać bardzo lekki sposób pod względem wydajności, aby uzyskać typ węzła z identyfikatora węzła - możesz użyć pojedynczego zapytania wyboru w tabeli węzłów.

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

W ten sposób nie musisz wywoływać całego systemu zaczepienia encji, z encją_obciążenie itp.

Jest to jedno zapytanie typu select, wykorzystujące indeksowany identyfikator węzła.

David Thomas
źródło
nie bawimy się tutaj tylko węzłami.
Junaid
OP napisał: „Na przykład, jeśli typ to„ node ”, a id to 7, mogę otrzymać„ page ”jako pakiet.” stąd przykładowa odpowiedź oparta na węźle.
David Thomas