특정 노드에 뷰를 포함시키는 방법은 무엇입니까?


13

특정 노드에 뷰를 포함하려고합니다. Drupal 7 및 PHP-Templates에서이 작업을 수행하기위한 자습서를 찾았습니다.

<?php print views_embed_view('view_name'); ?>

그러나 나는 나뭇 가지 템플릿이있는 Drupal 8에서 길을 찾습니다. 에서 views_embed_view()함수 를 호출하고 hook_node_view()노드에 할당하여 twig-Template에서 인쇄 할 수 있도록했습니다. 그러나이 후크는 결코 호출되지 않는 것 같습니다.

Drupal 8 방식으로이 작업을 수행하는 방법에 대한 힌트 / 해결 방법이 있습니까?

답변:


19

나뭇 가지 뷰 내장

이 모듈은 나뭇 가지 기능으로 뷰를 포함 할 수 있습니다.

{{ views_embed_view('view_name', 'view_id') }}

위의 모듈은 유리하게 감가 상각되었습니다

나뭇 가지 조정

Twig Tweak 모듈은 개발자의 경험을 향상시킬 수있는 유용한 기능과 필터가 포함 된 Twig 확장 기능을 제공합니다.

전의: <dd>{{ drupal_view('view_name', 'view_machine_name') }}</dd>

여기에서 찾을 수 있습니다view_machine_name


@TiMESPLiNTER는 당신에게 머리를주는 것입니다.
No Sssweat

언제부터? 버전?
Vishal Kumar Sahu

1
내 답변이 게시 된 후 @VishalKumarSahu, 3 월 18 일 '16. 모듈이 여전히 작동한다고 생각합니다. 더 이상 유지 관리되거나 더 이상 개발되지 않고 있습니다.
No Sssweat

완벽하게 완벽합니다. 그것은 잘 작동하고 그것에 대한 좋은 경험이 있습니다. 감사합니다
Vishal Kumar Sahu

나뭇 가지 조정! 좋은 모듈
해소 ST

5

이것이 Classy의 Drupal 8 베타 12 하위 테마에서 나를 위해 일한 방식입니다.

your_theme.info.theme 파일에서

function stjameskidsclub_preprocess_node(&$variables){
  $stuff  = views_embed_view('policy_documents', 'embed_1', 28);
  $variables["my_view"] = \Drupal::service('renderer')->renderRoot($stuff);
}  

node.html.twig를 복사하고 기사 태그 (또는 교체하려는 영역)를 나뭇 가지 블록으로 묶었습니다. 이것을 / template / content 폴더에 넣었습니다.

{% block replace_area %}
  <article{{ attributes.addClass(classes) }}>

    ...

  </article>  
{% endblock replace_area %}

그런 다음 다음 코드를 사용하여 / template / content 폴더에 node--2.html.twig (2를 원하는 노드로 바꿉니다)를 만들었습니다.

{% extends "node.html.twig" %}

{% block replace_page %}
  {{ my_view }}
{% endblock %}

4

당신이 싸우고있는 첫 번째 문제는 노드와 같은 렌더링 된 엔티티가 기본적으로 캐시되므로, 캐시를 지우거나 저장 한 후 hook_node_view ()가 한 번만 호출된다는 것입니다.

그러나 이것은 비활성화하기가 쉽습니다. settings.local.php를 참조하십시오.

그런 다음 뷰의 출력을 $ build에 넣는 것은 7.x에서와 같이 상당히 쉽고 덜 작동합니다. embed 함수를 사용하는 대신 $ views = Views :: getView ()$ views-> buildRenderable () 사용을 고려하십시오.

두 가지 팁 :

  • $ build에 사용하는 키를 hook_entity_extra_field_info () 에서 추가 필드로 사용 가능하게 한 다음 구성 요소가 활성화되어 있는지 디스플레이를 확인하십시오 ( user_user_view () 가 수행하는 방법 참조 ) . UI를 사용하고 특정보기 모드에서 숨길 수도 있습니다.
  • 뷰에 페이지가 있으면 노드 출력이 캐시되므로 조금 더 복잡합니다. 캐시 키가 호출기를 인식하도록해야합니다 .보기 (보기는 아니지만 코어가 가진 가장 가까운 예제 ) 에 대해서는 comment_entity_build_defaults_alter () 를 참조하십시오 .

우선이 위대한 대답에 대한 thx. 글쎄, 나는 "활성화"하고 settings.local.php모든 캐시를 지웠다. 그러나 내 후크 themename_node_view()themename.theme여전히 호출되지 않습니다. 이것이 왜 그런지 아십니까?
TiMESPLiNTER

1
settings.php에는 주석 처리를 해제해야하는 스 니펫이 있습니다 (끝 부분). settings.local.php가로드되도록하려면 잘못된 PHP를 추가하면 치명적인 오류가 발생합니다. 사이트가 실패하지 않으면 파일이로드되지 않습니다.
Berdir

2

BerdirView-> buildRenderable에 대해 언급했듯이 찾고있는 것이지만 모듈에서 더 많은 컨텍스트를 제공하려면 다음을 수행해야합니다.

//use core libraries
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Entity\Display\EntityViewDisplayInterface;

//use views class
use \Drupal\views\Views;

function hook_node_view(&$build, $node, $display, $view_mode){

 $thisView = Views::getView('view_name');

 $build['arbitrary_render_array_key_here'] = $thisView->buildRenderable('block_1',array($your_arguments));

}

그런 다음 페이지 템플릿에서

{{ page.content.theme_name_content }}

1
이 모든 것이 Drupal 7의 단일 라이너였습니다. 흥미 롭습니다.
WM

0

뷰 내에서 관련 데이터로 블록을 생성 할 수 있습니다.

블록 생성 후 원하는 컨텐츠 영역 (바닥 글 / 헤더 / 콘텐츠 / 등)에 블록이 표시되도록 지정할 수 있습니다. 할당 한 다음 "구성"을 클릭하십시오. "특정 페이지에 블록 표시"가 가능해야합니다. "목록에있는 페이지 만"을 선택하고 / node / your-node-number를 페이지 스펙에 추가하면 해당보기 / 차단이 원하는 노드에만 표시되도록 제한해야합니다.

건배!


귀하의 답변에 대한 Thx :-). 그런 다음 각 사례마다 콘텐츠 영역을 만들어야합니다. 따라서 첫 번째 텍스트를 원한다면보기를 한 다음 다시 텍스트를 작성하십시오. 또는 첫 번째 텍스트를보고 싶다면보기 또는 첫 번째보기를 한 다음 텍스트를 사용하십시오. 그런 다음 특정 노드 temapltes에서 렌더링하는 3 개의 다른 컨텐츠 영역을 작성해야합니다. 그러나 views_embed_view()접근 방식은 훨씬 쉽고 깨끗합니다.
TiMESPLiNTER

0

나뭇 가지 템플릿을 사용하고 싶다고 언급했지만 템플릿 참조 를 피하기 위해 뷰 참조 필드 모듈을 사용할 수 있습니다 . 또한 컨텐츠 편집자가보기 / 출력을 구성 할 수 있도록 필드 가능한 엔티티에 추가 할 수 있다는 장점도 있습니다.

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