web-dev-qa-db-ja.com

Drupal 8カスタムブロック(モジュール)作成twigテンプレートファイル

フィールド要素を持つカスタムブロックを作成するカスタムモジュールがあります。

これはすべて正常に機能しますが、このブロックにテーマを設定する必要があります。私はここで他の投稿をチェックし、運が悪かったので試しました。

twigデバッグを有効にして、テーマの提案を受け取りました。それでも運がありません。

誰かが私を正しい方向に向けてくれませんか。

これは私がこれまでに持っているものです:

my_module/my_module.module

// nothing related in here

my_module/src/Plugin/Block/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 // twig debugが提案するように

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

また、my_theme.themeにはこれがありますが、関連性があるとは思わないことにも注意してください。

// 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());
  }
}

私が試したことはこれです:

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

しかし、それでも行きません。

ここでの助けは大歓迎です。

更新:それで私はそれを機能させましたが、それでも助けが必要です。テンプレートを移動しましたblock--my-module.html.twig私のテーマディレクトリに移動すると、機能しました。

モジュールディレクトリで機能させるにはどうすればよいですか?

7
Cybercampbell

更新:それで私はそれを機能させましたが、それでも助けが必要です。テンプレートブロック--my-module.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'
    )
  );
}

これはテストされていません。それは私のカスタムブロックで機能した方法です。

キャッシュをクリアすることを忘れないでください。

11
Nicensin

モジュールにtwigファイルを追加できるようにするには、モジュールがテーマではなく参照を定義していることを確認する必要があります。

次のように、モジュールの.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
      ],
    ],
  ];
}

次に、ブロックのbuild()実装で、新しいテーマ関数への参照を追加できます。

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;
}

最後に、twigファイルの配置場所と名前に注意してください。モジュールディレクトリにtemplatesディレクトリを作成し、テーマの_を置き換えます。 -の関数名:mymodule-block.html.twig

6
acrosman