Як я можу отримати пакет об’єкта від типу та ідентифікатора?


11

Мені потрібно ідентифікувати bundleпідприємство з його typeта id.

Наприклад, якщо type"вузол" і idдорівнює 7, я можу отримати "сторінку" як bundle.

Дякую

Відповіді:


11

Використовуйте entity_loadдля завантаження об'єкта, як згадував @Nikhil.

Потім використовуйте entit_extract_ids , щоб отримати пакет. Приклад:

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

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

echo "Bundle name is : " . $bundle;

Функція entity_extract_idsповертає числовий індексований масив (не хеш-таблицю), що містить елементи:

  • 0: Первинний ідентифікатор особи.
  • 1: Ідентифікатор редакції сутності або NULL, якщо $ entit_type не є версією.
  • 2: Назва об'єкта сукупності, або NULL, якщо у $ entit_type немає пакетів.

де, 0, 1, і 2є індекси масиву. Однак підхід, який застосовують основні модулі та допоміжні модулі, полягає у використанні list()функції.


Я думаю, що недобре залежати від числового індексу масиву.
Джунайд

3
@Junaid Цей індекс передбачуваний, тому це добре. Ось як ядро ​​Drupal справляється з цим завданням. Якщо «магічне число» турбує, ви просто використовуєте мовні функції:list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
Клайв

@Junaid Ви можете залежати від числового індексу, коли ви впевнені, що вони не зміниться. Див редагування для пояснення того, чому я використовував числовий індекс. Це тому, що функція API створена саме так. Також рішення не залежить від модуля сутності ;-)
AjitS

7

Ось найчистіший, який я отримав з коду модуля Organic groups.

$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

Вибачте, я забув використовувати належні імена параметрів. Це зараз виправлено.
Джунайд

Ви можете зробити те ж саме entity_load, до речі, як це найчистіше?
niksmac

1
Особисто я не вважаю entity_metadata_wrapper()більш чистим, ніж entity_extract_ids()метод. Плюс ви покладаєтесь на встановлений модуль сутності ...
Clive

Це не обов'язково чистіше, але це дійсна альтернатива, особливо якщо ви все одно використовуєте обгортки метаданих. Може, @develkar чи Junaid могли змінити свою відповідь, щоб включити обидві альтернативи? (Джунайд, можливо, ви могли б додати посилання на модуль Entity та на сторінку про entit_metadata_wrappers?)
Аліса Хітон

3

Спробуйте object_load

Завантажте об'єкти з бази даних.

Суб'єкти зберігаються в статичному кеші пам'яті і не потребуватимуть доступу до бази даних, якщо вони знову завантажуються під час того ж запиту сторінки.

Параметри

$ entit_type : тип сутності для завантаження, наприклад, вузол або користувач.

$ ids : масив ідентифікаторів сутності або FALSE для завантаження всіх сутностей.

$ умови : (застарілий) Асоціативний масив умов у базовій таблиці, де ключовими є поля бази даних, а значення - значення, які мають мати поля. Натомість бажано використовувати EntityFieldQuery для отримання списку ідентифікаторів об'єктів, завантажених за допомогою цієї функції.

$ reset : чи потрібно скинути внутрішній кеш для запитуваного типу сутності.

Повернене значення

Масив об'єктів сутності, індексований їх ідентифікаторами. Коли результатів не знайдено, повертається порожній масив.


3

Якщо ви хочете дуже легким та ефективним способом отримати тип вузла з ідентифікатора вузла - ви можете використовувати один запит на вибір у таблиці вузлів.

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

Таким чином, вам не потрібно викликати всю систему підключення сутності, з ent_load тощо.

Це один запит вибору з використанням індексованого ідентифікатора вузла.


ми тут не граємо лише з вузлами.
Джунаїд

OP написав: "Наприклад, якщо тип" вузол ", а id - 7, я можу отримати" сторінку "як пакет". отже, відповідь на прикладі відповіді.
Девід Томас
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.