将变量传递到自定义块模板文件


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-”。 问题是变量没有传递到模板文件,我的错在哪里?

感谢任何帮助

Answers:


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的关注
优素福

您是否希望在块内包含变量的内容?这样就不会连接到块模板,因为这是用于块的外部的。(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。该模板使用其自己的变量集。(如果要使用此树枝,则必须从核心或基础主题复制它,然后查看其中包含哪些变量)。在build函数的render数组中设置的变量将以结尾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 '16

1

我也到了这一点。变量似乎没有传递到块模板。我的代码几乎与您相同,就我而言,我启用了细枝调试并禁用了services.yml中的缓存。即使清除缓存,我也遇到了这个问题,但是一旦我在开发环境中激活了此配置,就解决了。

twig.config:    
# Not recommended in production environments
# @default false
debug: true
# Not recommended in production environments
# @default null
auto_reload: true
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.