Передать переменную в файл шаблона Custom Block


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>

Но Результатом является только «Мой Пользовательский Блок-». Проблема в том, что переменные не передаются в файл шаблона, где моя ошибка?

ценю любую помощь

Ответы:


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. То, что вы пытаетесь сделать с помощью метода во второй ссылке, относится к блоку - 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>
Юсеф

Ваши переменные не читаются block--sliderblock.html.twig. Этот шаблон работает с собственным набором переменных. (Если вы хотите использовать эту ветку, вам нужно будет скопировать ее из основной или базовой темы, а затем вы увидите, какие переменные находятся внутри). Ваши переменные, установленные в массиве рендеринга функции сборки, будут в итоге 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 custom block (module) создает файл шаблона ветки


1
Как насчет переменных, которые запрашивал OP?
Leymannx

1

Я тоже дошел до этого. Кажется, переменные не передаются в шаблон блока. У меня почти такой же код, как и у вас, в моем случае я включил отладку веток и отключил кеш в services.yml. Даже при очистке кэша у меня возникла эта проблема, но она была решена, когда я активировал этот конфиг в моей среде разработки.

twig.config:    
# Not recommended in production environments
# @default false
debug: true
# Not recommended in production environments
# @default null
auto_reload: true
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.