Як отримати доступ до значення поля для об'єкта (наприклад, вузла)?


63

node_load((int) $nid)завантажує повнонаселений об'єкт вузла. $node->title->valueотримує заголовок, але як я можу отримати доступ до значень поля в Drupal 8?

Відповіді:


89

Я думаю, вам не потрібно перетворювати $entityв масив, це просто спрацює.

$entity->get('field_name')->getValue();

FYI: Використання kint()з devel_kintмодуля дозволить вам дізнатися всі доступні методи , які можуть бути використані для доступу до елементів об'єкта, тому порівняно var_dump()менш корисно.


14
Насправді це повинно бути: $ entit-> get ('field_name') -> значення;
Ед Холлінгерст

1
Чи знаєте ви, чому це @EdHollinghurst? getValue дійсно помиляється для мене, але (використовуючи dpm) він вказаний у доступних методах, тоді як "value" - ні.
автопоетична

2
getValue()працює для мене (як на 8.1.x, так і на 8.2.x) див. посилання на api
leon.nk

16
->getValue()є загальним і буде працювати незалежно від типу поля. Якщо ви використовуєте ->value, воно працює лише у тому випадку, якщо значення поля зберігається у valueвластивості. Він не працюватиме для більш складних типів (наприклад, дата або посилання на об'єкт).
П’єр Буйле

4
Цей код лише призведе до помилки, якщо у суб'єкта господарювання немає поля з назвою "ім'я поля". Переконайтеся, що цей код запускається лише для осіб, для яких ви знаєте, що поле існує, ви можете використовувати $ testing-> hasField ('ім'я_поля') для тестування, або якщо (! Порожній ($ сутність
oknate

56

в drupal 8, $ node є вузлом класу

 $node->field_machine_name->getValue();

або

$node->get('field_machine_name')->getValue();

поверне масив значень.

Якщо ви очікуєте лише одного, ви також можете зв'язати з ним масив

$node->field_machine_name->getString();

або

 $node->get('field_machine_name')->getString();

Я не "отримую" (рядок і значення) "це". Чи можете ви, будь ласка, додати ще детальну інформацію, щоб пояснити цю відповідь? FYI: якщо цього не зробити, то ваша відповідь загрожує видаленням через модерацію (вибачте ...)
Pierre.Vriens

34

Наприклад, для полів ви повинні мати можливість використовувати $node->body->value. Якщо ви не знаєте, що таке назви полів, я рекомендую встановити модуль Devel для Drupal 8 та перевірити вузол через like dsm($node).


1
як тоді ви виведете це поле?
Алекс

1
це здається застарілим
Алекс

1
@ Алекс Я пропоную вам задати нове запитання щодо проблеми, що виникає. На той час це була нормальна відповідь, але видається неприйнятною редагувати відповідь зараз, це відповідь на цій сторінці, яка має більше балів, ніж ця.
tenken

5
Перегляньте цю статтю для приємного пояснення. Ви можете використовувати значення $ node-> field_name->, щоб отримати єдине значення (або перший ключ поля з багатозначним значенням). Або ви можете використовувати $ node-> field_name-> getValue (), щоб отримати всі значення поля у вигляді масиву.
Mirsoft

2
@tenken: Власне, оновлення існуючої відповіді краще, ніж додавання зайвого запитання з новими відповідями.
П’єр Буйле

17

Ви завжди можете зробити, $entity->toArray()щоб побачити, що є в сутності. Навіть при використанні xdebug (наприклад, з phpstorm) розуміння об'єкта сутності самостійно дуже важко. Я сумніваюся, що dsm($node)в Drupal 8 має сенс. Якщо ви наполягаєте на налагодженні в браузері (але не слід, Drupal 8 занадто складний для налагодження без xdebug) dsm($node->toArray())- це те, що ви хочете.


$ node-> toArray () не працює для мене на Drupal 8.
Axel Briche

Будь ласка, додайте нове запитання із детальним описом цього питання. Drupal\Core\Entity\EntityInterfaceмає toArray.

1
Ця відповідь не забезпечує рішення; пониження.
колан

Хоча ця відповідь не обов'язково є прямою відповіддю на це питання, це чортово чудова функція. Дякую.
Стеф Ван Лоурен

14

Використовуйте наступний фрагмент коду, щоб отримати значення поля вузла

Це використовується для отримання ідентифікатора вузла від URL-адреси

$nid = \Drupal::routeMatch()->getRawParameter($node_id);

Для завантаження даних вузла за допомогою nid

$node = \Drupal::entityTypeManager()->getStorage('node')->load($nid);

Це використовується для отримання значення поля.

$terms = $node->get('field_Name')->getValue();  

Це використовується для отримання заголовка вузла.

$product_name = $node->getTitle();

2
Завантажте вузол так: $ nid = \ Drupal :: routeMatch () -> getRawParameter ('вузол'); $ node = \ Drupal :: entitTypeManager () -> getStorage ('вузол') -> завантаження ($ nid);
rémy

8

Для мене, маючи $entity(вузол), це спрацювало:

$entity->field_name->getValue();

з використанням 8.1.


2
Це отримує всі значення багатозначного поля в масив. Звичайно, він може бути використаний і для отримання значення однозначного поля, проте вихід буде містити масив з одним значенням. Щоб отримати єдине значення поля (або перше значення багатозначного поля), використовуйте $ entit-> field_name-> value
Mirsoft

7

Під час використання (фактично правильний спосіб):

$node = \Drupal\node\Entity\Node::load($nid);
$node->get('nid')->value; // returns a raw value - Node ID

// Following both returns array structure containing value/target id nested value.
$node->get('nid')->value(); 
$node->nid->getValue();


4

Це просто:

$node->get('field_name')->getValue()

Якщо поле є посилальним полем сутності, існують деякі спеціальні способи отримання посилаються сутностей.

Щоб отримати цільовий ідентифікатор (перший елемент):

$entity->get('field_entity_reference')->target_id

Щоб отримати завантажену сутність (перший елемент):

$entity->get('field_entity_reference')->entity

При використанні ->entityв полі він автоматично завантажує сутність.

Якщо поле може містити кілька посилань, ви можете отримати їх усі так:

$entities = $entity->get('field_entity_reference')->referencedEntities();

Це дасть вам масив сутностей.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.