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

63

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

24ma13wg
источник

Ответы:

89

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

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

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

DropDragon
источник
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();
Matoeil
источник
Я не "получаю" (строка и значение) "это". Можете ли вы добавить более подробную информацию, чтобы объяснить этот ответ? К вашему сведению: в
противном случае
34

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

tenken
источник
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.

Alex
источник
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();

Это даст вам массив сущностей.

Jdrupal
источник