node_view ()가 더 이상 사용되지 않으므로 노드를 어떻게 렌더링합니까?


22

Drupal 7에서는 node_view()다음과 같이 블록 또는 페이지에서 노드를 렌더링하는 데 (보기 모드 사용) 자주 사용 합니다.

$nids = array(123,456,789);
$nodes = node_load_multiple($nids);
foreach ($nodes as $node) {
  $node_view = node_view($node, 'teaser');
  $output .= drupal_render($node_view);
}
$build['nodes']['#markup'] = $output;
return $build;

node_view()/ entity_view()변경 레코드에 설명 된대로 사용되지 않고보기 작성기로 대체되었습니다. 이제 엔티티는보기 작성기에서 렌더링됩니다 . 이 정보는 동일한 결과를 얻는 방법을 알아낼 수있을 정도로 상세하지 않습니다.

블록 또는 페이지의 렌더 배열에서 출력을 사용할 수 있도록 Drupal 8에서 노드를 어떻게 렌더 할 수 있습니까?

답변:


31

Berdir에 의해 주어진 답 용도 entityManager, 사용되지 않습니다 더 구체적인 서비스에 찬성. 이것은 현재 사용중인 코드입니다.

$nid = 1;
$entity_type = 'node';
$view_mode = 'teaser';

$view_builder = \Drupal::entityTypeManager()->getViewBuilder($entity_type);
$storage = \Drupal::entityTypeManager()->getStorage($entity_type);
$node = $storage->load($nid);
$build = $view_builder->view($node, $view_mode);
$output = render($build);

이 코드는 어떤 것보다 조금 더 장황하다. 몇 가지 방법을 함께 연결하여 더 간결성을 원한다면 몇 줄로 줄일 수 있습니다.

$nid = 1;
$entity_type = 'node';
$view_mode = 'teaser';

$node = \Drupal::entityTypeManager()->getStorage($entity_type)->load($nid);
$output = render(\Drupal::entityTypeManager()->getViewBuilder($entity_type)->view($node, $view_mode));

그냥 사용할 수 $node = Node::load($nid)없습니까?
Nic

3
render()마지막 줄에서 왜 사용 합니까? 나뭇 가지보기로 전달 될 렌더 배열getViewBuilder($entity_type)->view반환합니다 .
Tim

1
@Tim 필자는 이것을 사용하는 컨텍스트에 따라 다르며, 이것은 위키이므로 입력을 추가 할 수 있습니다. 일부 유스 케이스의 경우 렌더 배열로 직접 나뭇 가지 템플릿에 이것을 전달하는 사치가 없었습니다. 렌더링을 직접 수행해야했습니다. 행운을 빌어 요.
nicholas.alipaz

수행하는 경우는 어떤 경우에, 당신은 또한 같은 렌더링 서비스를 고려할 수 있으며, 수동으로 렌더링 renderRoot하거나 renderPlain, 또는 통해 drupal_render_root($build);
데이비드 토마스

15

가장 중요한 부분은 자신의 렌더링을 중지하는 것입니다. 거의 모든 곳에서 렌더 배열을 반환 할 수 있으며 그렇게해야합니다. 그런 식으로 문자열을 결합하면 더 이상 작동하지 않습니다.

필요한 것은 이것입니다 :

$nodes = \Drupal::entityManager()->getStorage('node')->loadMultiple($nids);
// Or a use the static loadMultiple method on the entity class:
$nodes = \Drupal\node\Entity\Node::loadMultiple($nids);

// And then you can view/build them all together:
$build = \Drupal::entityTypeManager()->getViewBuilder('node')->viewMultiple($nodes, 'teaser');

나는 이것을 작동시킬 수 없었다. Drupal 코어에 따라갈 수있는 예가 있습니까? (바람직하게는 블록)
batigolix

2
EntityManager는 더 이상 사용되지 않습니다. 대신 EntityTypeManager를 사용하십시오.
Tim

4

entity_view()Drupal 9.0.0 이전에 제거됩니다. Drupal 8에서 사용할 수 있지만 지금부터 Drupal 9에서 변경되지 않는 코드를 작성하려면 대신 다음 코드를 사용할 수 있습니다 entity_view().

$render_controller = \Drupal::entityTypeManager()->getViewBuilder($entity->getEntityTypeId());
$render_output = $render_controller->view($entity, $view_mode, $langcode);

본질적으로 entity_view()함수에서 사용하는 더 이상 사용되지 않는 메소드에 대한 참조를 교체 한 후 에서 사용 된 코드 입니다. 실제로 설명서 Drupal::entityManager()는 다음 과 같이 말합니다.

Drupal 8.0.0에서는 Drupal 9.0.0 이전에 제거됩니다. \Drupal::entityTypeManager()대부분의 경우에 대신 사용하십시오 . 필요한 방법이 켜져 있지 않은 \Drupal\Core\Entity\EntityTypeManagerInterface경우 더 이상 사용되지 않는 \Drupal\Core\Entity\EntityManager인터페이스를 참조 하여 올바른 인터페이스 또는 서비스를 찾으십시오.

entity_view()더 이상 사용되지 않기 전에 변경되는 경우 에도 설명서 페이지를 방문하여 함수가 사용하는 실제 (업데이트 된) 코드를 확인할 수 있습니다.


이 수해야 Drupal::entityTypeManager()이제 Drupal::entityManager()사용되지 않습니다?
Nic

네 맞습니다.
kiamlaluno
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.