변수를 사용자 정의 블록 템플릿 파일로 전달


11

Drupal 8에서 사용자 정의 컨텐츠로 사용자 정의 블록을 만들고 싶습니다. 처음에 간단한 텍스트로 블록을 만들고 올바르게 작동하면 문제는 어떻게 사용자 정의 변수를 전달할 수 있습니까? 모듈에 대한 튜토리얼을 보았습니다. 모듈 이름은 파일의 tcdev내용입니다 .module.

function tcdev_theme($existing, $type, $theme, $path) {
    return array('tcdev' =>
        array(
            'variables' => array(
                'title' => 'Default title',
                'description' => null
            ),
            'template' => 'block--sliderblock'
        )
    );
}

그리고 내 SliderBlock.php

    namespace  Drupal\tcdev\Plugin\Block;
use Drupal\Core\block\BlockBase;


/**
 * Provides a 'SliderBlock' block.
 *
 * @Block(
 * id = "slider_block",
 * admin_label = @Translation("Slider Block"),
 * )
 */

class SliderBlock extends BlockBase{
    /**
     * {@inheritdoc}
     */
    public function build(){
        return array(
            '#title' => 'my title ',
            '#description' => 'my custom desc'
        );
}
}

마지막으로 템플릿 파일 block--sliderblock.html.twig

  <h2>My Custom Block{{ title }}-{{ description }}</h2>

그러나 결과는 "My Custom Block-"입니다. 문제는 변수가 템플릿 파일에 전달되지 않는 것입니다. 내 결함은 어디에 있습니까?

도움을 주셔서 감사합니다

답변:


15

반환 배열에 #theme키 가 없습니다 . 따라서 현재 템플릿 파일을 전혀 사용하지 않습니다.

그리고 아마도 외부 블록과 블록 내부의 내용을 테마로 혼합했을 것입니다. 내부 템플릿은 tcdev라는 이름을 갖습니다. 왜냐하면 그것은 배열의 맨 위에 정의한 이름이기 때문입니다. *_theme()tcdev.html.twig는 변수가 끝나는 곳입니다.

코드는 다음과 같습니다.

function tcdev_theme($existing, $type, $theme, $path) {
  return array('tcdev' =>                  // this is the name of the template
           array(
            'variables' => array(
                'title' => 'Default title',
                'description' => null
            ),
        )
    );
}

SliderBlock.php

namespace  Drupal\tcdev\Plugin\Block;
use Drupal\Core\block\BlockBase;


/**
 * Provides a 'SliderBlock' block.
 *
 * @Block(
 * id = "slider_block",
 * admin_label = @Translation("Slider Block"),
 * )
 */

class SliderBlock extends BlockBase{
    /**
     * {@inheritdoc}
     */
    public function build() {
        return array(
            '#theme' => 'tcdev',
            '#title' => 'my title ',
            '#description' => 'my custom desc'
        );
   }
}

tcdev.html.twig

  <h2>My Custom Block{{ title }}-{{ description }}</h2>

당신은 그것에 대한 몇 가지 자습서를 보았다고 썼습니다. 아마 이것은 두 가지 주제에 관한 것이며, 당신은 동시에 적용하려고합니다.

첫 번째 링크의 사용자 정의 템플리트는 tcdev.html.twig입니다. 두 번째 링크의 방법으로 수행하려는 것은 block--sliderblock.html.twig입니다.


그러나 block--sliderblock.html.twig렌더링 된 문제는 내 변수를 전달하는 방법입니다 !!!? 내 코드에 따라 나에게 제안하는 것은 무엇입니까? ? 관심을 끌기위한 tnx
Yusef

블록 안의 변수 내용을 원하십니까? 그런 다음 블록 외부에 대한 것이므로 블록 템플릿에 연결되지 않습니다. ( block--sliderblock.html.twig렌더링, 테마 제안의 이름을 사용했기 때문에 블록이 완전히 비어 있어도 렌더링됩니다.)
4k4

일을 더 명확하게하기 위해 코드를 변경하려고 시도했지만 이것이 효과가 있기를 바랍니다.
4k4

코드를 적용하고 캐시를 다시 작성했지만 여전히 읽었 block--sliderblock.html.twig으며 아무것도 전달하지 않았습니다. 디버그 정보를 활성화하고 디버그 정보는<!-- END OUTPUT from 'themes/bootstrap/templates/block/block--system-branding-block.html.twig' <!-- FILE NAME SUGGESTIONS: x block--sliderblock.html.twig * block--slider-block.html.twig * block--tcdev.html.twig * block.html.twig --> <!-- BEGIN OUTPUT from 'themes/gttc_2016/templates/block--sliderblock.html.twig' --> <h2>Block-</h2>
Yusef

변수를 읽을 수 없습니다 block--sliderblock.html.twig. 이 템플릿은 자체 변수 세트와 함께 작동합니다. (이 나뭇 가지를 사용하려면 핵심 또는 기본 테마에서 복사해야하고 어떤 변수가 내부에 있는지 볼 수 있습니다). 빌드 함수의 렌더 배열에 설정된 변수는로 끝납니다 tcdev.html.twig. 이 나뭇 가지 파일을 만들었습니까?
4k4

3

내가 찾은 것처럼 사용자 정의 블록 (모듈) 템플릿으로 기본 블록 템플릿을 덮어 쓰고 변수를 전달하려고합니다. 먼저 현재 블록 템플릿이 출력 된 것으로 보이므로 템플릿을 올바르게 덮어 써야합니다 테마 디렉토리 (모듈 아님) :

<!-- BEGIN OUTPUT from 'themes/gttc_2016/templates/block--sliderblock.html.twig' -->

이렇게하려면 먼저 templates/모듈 루트에 디렉토리를 만든 다음 템플릿을 거기에 배치해야합니다.

이제 Drupal에 템플릿에 템플릿을 저장했음을 알리십시오. your_module.module이 기능 을 추가하십시오.

function YOUR_MODULE_theme($existing, $type, $theme, $path) {
  return array(
    'block__my_module' => array(
      'render element' => 'elements',
      'template' => 'block--my-module',
      'base hook' => 'block'
    )
  );
}

마지막으로 나뭇 가지 파일을 배치 할 위치와 파일 이름에주의하십시오. 모듈 디렉토리에 템플리트 디렉토리를 작성 _하고 테마 함수 이름에서를 다음으로 바꾸십시오 -.
mymodule-block.html.twig

캐시를 지우는 것을 잊지 마십시오.


Nicensin이 게시물 의 답변을 통해
Drupal 8 사용자 정의 블록 (모듈)은 잔가지 템플릿 파일을 만듭니다.


1
OP가 요청한 변수는 어떻습니까?
leymannx

1

나도이 지점에 도착했다. 변수가 블록 템플릿으로 전달되지 않는 것 같습니다. 나는 당신과 거의 같은 코드를 가지고 있으며, 내 경우에는 나뭇 가지 디버그를 활성화하고 services.yml에서 캐시를 비활성화합니다. 캐시를 지우 더라도이 문제가 있었지만 개발 환경 에서이 구성을 활성화하면 해결되었습니다.

twig.config:    
# Not recommended in production environments
# @default false
debug: true
# Not recommended in production environments
# @default null
auto_reload: true
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.