2016-06-05 6 views
5

필드 요소가있는 사용자 지정 블록을 만드는 사용자 지정 모듈이 있습니다.Drupal 8 맞춤 블록 (모듈) 나뭇 가지 템플릿 파일을 만듭니다

이 모든 것은 정상적으로 작동하지만이 블록을 테마로해야합니다. 나는 여기의 다른 지위를 점검했고, 행운으로 시험해 보았다.

나뭇 가지 디버그를 사용하도록 설정하고 테마 제안을 받았습니다. 아직도 운이 없다.

누구나 올바른 방향으로 나를 가리킬 수 있습니까?

내가 지금까지 무엇을 가지고 :

my_module/my_module.module을

// nothing related in here

my_module/SRC/플러그인/차단/myModuleBlock.php

<?php 

namespace Drupal\my_module\Plugin\Block; 

use Drupal\Core\Block\BlockBase; 
use Drupal\Core\Form\FormStateInterface; 

/** 
* Provides a 'ModuleBlock' block. 
* 
* @Block(
* id = "module_block", 
* admin_label = @Translation("My Module"), 
*) 
*/ 
class ModuleBlock extends BlockBase { 

    public function blockForm($form, FormStateInterface $form_state) { 
    $form['test'] = array(
     '#type' => 'select', 
     '#title' => $this->t('test'), 
     '#description' => $this->t('test list'), 
     '#options' => array(
     'Test' => $this->t('Test'), 
    ), 
     '#default_value' => isset($this->configuration['test']) ? $this->configuration['test'] : 'Test', 
     '#size' => 0, 
     '#weight' => '10', 
     '#required' => TRUE, 
    );  
    return $form; 
    } 

    /** 
    * {@inheritdoc} 
    */ 
    public function blockSubmit($form, FormStateInterface $form_state) { 
    $this->configuration['test'] = $form_state->getValue('test'); 
    } 

    /** 
    * {@inheritdoc} 
    */ 
    public function build() { 
    $build = []; 
    $build['module_block_test']['#markup'] = '<p>' . $this->configuration['test'] . '</p>'; 
    return $build; 
    } 


} 

my_module/templates/block - my-module.html.twig // 나뭇 가지가 제안하는대로 디버그

<h1>This is a test</h1> 
<div id="test-widget">{{ content }}</div> 

나는 또한 내 my_theme.theme에 내가 이것을 가지고 있지만 내가 돈주의해야한다 t이 생각하는 그 관련 :

public function build() { 
    return array(
     '#theme' => 'block--my-module' 
    ); 
} 
:

에 관해서는
// Add content type suggestions. 
function my_theme_theme_suggestions_page_alter(array &$suggestions, array $variables) { 
    if ($node = \Drupal::request()->attributes->get('node')) { 
    array_splice($suggestions, 1, 0, 'page__node__' . $node->getType()); 
    } 
} 

는 내가 해봤 것은 이것이다

하지만 여전히가 없습니다.

여기에 도움을 주시면 매우 감사하겠습니다.

업데이트 : 그래서 방금 작동했지만 아직 도움이 필요합니다. block--my-module.html.twig 템플릿을 내 테마 디렉토리로 옮겼습니다.

모듈 디렉토리에서 어떻게 작동합니까?

+0

파일이'myModuleBlock.php'이지만 의도적으로 클래스는'my'없이'ModuleBlock'입니까? 비표준 것 같습니다. –

답변

5

UPDATE를 : 그래서 난 그냥 일을 가지고 있지만 여전히 도움이 필요합니다. 템플릿 블록 - my-module.html.twig를 테마 디렉토리로 이동하고 이 작동했습니다.

모듈 디렉토리에서 어떻게 작동합니까?

모듈 루트에 templates/ 디렉토리를 만들 수 있습니다. 여기에 템플릿을 배치하십시오.

이제 Drupal이 모듈에 템플릿을 저장하게하십시오. 이 테스트되지

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

: your_module.module에서 이 기능을 추가 할 수 있습니다. 내 맞춤 블록에서 작동하는 방식입니다.

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

+0

Thanks @Nicensin - 답변을 수락했으나 다음 사항을 수정하십시오. 1)'$ pat'를'$ path'로 대체하십시오. 2) 템플릿 변수에서'.html.twig'를 제거하십시오. 그렇게하면 다른 사람들이 당신의 답을 얻을 수 있습니다. – Cybercampbell

+1

내가 당신을 도울 수있어서 기쁩니다. 통보 해줘서 고마워. 나는 내 대답을 편집했다. – Nicensin

4

모듈에 나뭇 가지 파일을 추가하려면 모듈이 테마가 아닌 참조를 정의해야합니다. 다음과 같이

당신은 여전히 ​​모듈의 .module 파일에 hook_theme()를 구현할 수 있습니다

function mymodule_theme($existing, $type, $theme, $path) { 
    return [ 
    'mymodule_block'  => [ 
     'variables' => [ 
     // define defaults for any variables you want in the twig file 
     'attributes' => [ 
      'class' => ['my-module-class'], 
     ], //etc 
     ], 
    ], 
    ]; 
} 

이 그런 다음 블록의 빌드() 구현에 새 테마 기능에 대한 참조를 추가 할 수 있습니다

public function build() { 
    // Load the configuration from the form 
    $config = $this->getConfiguration(); 
    $test_value = isset($config['test']) ? $config['test'] : ''; 

    $build = []; 
    $build['#theme'] = 'mymodule_block'; 

    // You would not do both of these things... 
    $build['#test_value'] = $test_value; 
    $build['module_block_test']['#markup'] = '<p>' . $test_value . '</p>'; 

    return $build; 
} 

마지막으로 나뭇 가지 파일을 배치 할 위치와 이름을 지정하는 데주의하십시오. 모듈 디렉토리에 templates 디렉토리를 만들고 -과 테마 기능 이름에 _ 교체 : mymodule-block.html.twig

+0

굉장한 감사합니다. 이것은 다소 효과가 있습니다. _theme 함수에서 변수를 정의하는 방법은 무엇입니까? – Cybercampbell

+0

테마 함수를 사용하면 기본값을 설정할 수 있습니다 (나는 나뭇 가지 파일에 전달되지 않을 가능성이 있으므로 결코 NULL을 제공하지 않았습니다. 아마도 나뭇 가지 파일에 전달되지 않을 수 있습니다. . 블록의 build() 메소드에서 렌더링 중에 원하는 변수를 설정합니다. 같은 이름의 devel 서브 모듈에서 kint() 함수가 실제로 템플릿에 도착하는지 확인하는 데 도움이 될 수 있습니다. – acrosman

+0

고마워요 @acrosman - 변수는 블록 양식을 통해 설정된 DB에서 가져와야합니다. 아니면 내가 잘못 했니? – Cybercampbell

관련 문제