web-dev-qa-db-ja.com

変数をカスタムブロックテンプレートファイルに渡す

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-」のみです。 問題は、変数がテンプレートファイルに渡されないことです。私の障害はどこですか?

助けてくれてありがとう

11
Yusef

戻り配列に_#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>
_

あなたはそれについていくつかのチュートリアルを見たと書いた。おそらくこれは2つの異なるトピックでしたが、同時にそれらを適用しようとしています。

最初のリンクのカスタムテンプレートはtcdev.html.twigです。 2番目のリンクのメソッドで実行しようとしているのは、block-sliderblock.html.twigです。

15
4k4

私が見つけたように、デフォルトのブロックテンプレートをカスタムブロック(モジュール)テンプレートで上書きし、それに変数を渡したいと思います。まず、現在のブロックテンプレートがテーマディレクトリ(モジュールではない):

_<!-- 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'
    )
  );
}
_

最後に、twigファイルの配置場所とその名前に注意してください。モジュールディレクトリにテンプレートディレクトリを作成し、テーマ関数名の___を_-_:
_mymodule-block.html.twig_

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


この投稿でNicensinが書いた回答を利用して:
Drupal 8カスタムブロック(モジュール)作成twigテンプレートファイル

3
Mojtaba Reyhani

私もここまで来ました。変数がブロックテンプレートに渡されていないようです。私はあなたとほとんど同じコードを持っています、私の場合はtwig debug and disable cache in caches.ymlです。キャッシュをクリアしてもこの問題が発生していましたが、この設定をアクティブにすると解決しました私の開発環境。

twig.config:    
# Not recommended in production environments
# @default false
debug: true
# Not recommended in production environments
# @default null
auto_reload: true
1
Julian Mancera