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


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>

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

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


しかし、 block--sliderblock.html.twigレンダリングされた場合、問題はどのように私の変数をそれに渡すかです!!!?私のコードによると、あなたは私に何を提案しますか。?あなたの注意のためのtnx
Yusef

ブロック内の変数の内容が必要ですか?次に、これはブロックの外側にあるため、ブロックテンプレートに接続されていません。(block--sliderblock.html.twigレンダリング、テーマ提案の名前を使用したため、ブロックが完全に空の場合でもレンダリングされます。これを試すことができます)
4k4

私はあなたのコードを変更して物事をより明確にしようとしました、これがうまくいくことを願って、それをデバッグしませんでした。
4k4 2016年

私はあなたのコードを適用し、キャッシュを再構築しますが、それでも読み取り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ます。この小枝ファイルを作成しましたか?
2016年

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

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

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


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


1
OPが要求する変数はどうですか?
leymannx 2016年

1

私もここまで来ました。変数がブロックテンプレートに渡されていないようです。私はあなたとほとんど同じコードを持っています、私の場合、twigデバッグを有効にし、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.