Как мне получить доступ к значению поля для объекта (например, узла)?


63

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

Ответы:


89

Я думаю, вам не нужно преобразовывать $entityв массив, это будет просто работать.

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

К сведению: Использование kint()из devel_kintмодуля позволит вам узнать все доступные методы, которые могут быть использованы для доступа к элементам объекта, поэтому сравнительно var_dump()менее полезен.


14
На самом деле это должно быть: $ entity-> get ('field_name') -> value;
— Эд Холлингхерст

1
Вы знаете, почему это @EdHollinghurst? getValue действительно делает ошибку для меня, но (используя dpm) она указана в доступных методах, тогда как 'value' - нет.
— автопоэтический

2
getValue()работает для меня (как на 8.1.x, так и на 8.2.x), см. ссылку на API
— leon.nk

16
->getValue()является общим и будет работать независимо от типа поля. Если вы используете ->value, это работает, только если значение поля хранится в valueсвойстве. Он не будет работать для более сложных типов (например, дата или ссылка на сущность).
— Пьер Байл

4
Один только этот код выдаст ошибку, если у сущности нет поля с именем «field_name». Убедитесь, что этот код запускается только на объектах, где вы знаете, что поле существует, вы можете использовать $ entity-> hasField ('field_name') для тестирования или, если (! Empty ($ entity-> field_name))
— oknate,

56

в Drupal 8, $ узел является классом узла

 $node->field_machine_name->getValue();

или же

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

вернет массив значений.

Если вы ожидаете только один, вы можете также привести в соответствие массив с

$node->field_machine_name->getString();

или же

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

Я не "получаю" (строка и значение) "это". Можете ли вы добавить более подробную информацию, чтобы объяснить этот ответ? К вашему сведению: в
— противном случае

34

Для полей вы должны быть в состоянии использовать, $node->body->valueнапример. Если вы не знаете, как называются поля, я рекомендую установить модуль Devel для Drupal 8 и проверить узел с помощью лайков dsm($node).


1
как вы тогда визуализируете это поле?
— Алекс

1
это кажется устаревшим
— Алекс

1
@ Алекс, я предлагаю вам задать новый вопрос с проблемой, с которой вы столкнулись. В то время, когда это был правильный ответ, кажется, что сейчас редактировать ответ, который является ответом на этой странице, имеет больше точек, чем этот.
— Tenken

5
Проверьте эту статью для хорошего объяснения. Вы можете использовать $ node-> field_name-> value, чтобы получить одно значение (или первый ключ поля с несколькими значениями). Или вы можете использовать $ node-> field_name-> getValue (), чтобы получить все значения поля в виде массива.
— Мирсофт

2
@tenken: На самом деле обновление существующего ответа предпочтительнее, чем добавление лишнего вопроса с новыми ответами.
— Пьер Байл

17

Вы всегда $entity->toArray()можете посмотреть, что в сущности. Даже при использовании xdebug (например, с phpstorm) разобраться в сущности объекта сущности очень сложно. Я сомневаюсь, что dsm($node)в Drupal 8 есть какой-то смысл. Если вы настаиваете на отладке в браузере (но не должны этого делать, Drupal 8 слишком сложен, чтобы отлаживать без xdebug), то dsm($node->toArray())это то, что вам нужно.


$ node-> toArray () не работает для меня в Drupal 8.
— Аксель Бриш

Пожалуйста, добавьте новый вопрос, детализирующий это. Drupal\Core\Entity\EntityInterfaceесть toArray.

1
Этот ответ не дает решения; downvoting.
— Колан

Хотя этот ответ не обязательно является прямым ответом на этот вопрос, он чертовски полезен. Благодарю.
— Стеф Ван Луверен,

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'); $ node = \ Drupal :: entityTypeManager () -> getStorage ('node') -> load ($ nid);
— Реми

8

Для меня $entity(узел) это сработало:

$entity->field_name->getValue();

используя 8.1.


2
Этот получает все значения многозначного поля в массив. Конечно, он также может быть использован для получения значения поля с одним значением, однако вывод будет содержать массив с одним значением. Чтобы получить одно значение поля (или первое значение поля с несколькими значениями), используйте $ entity-> 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.