Передати змінний файл шаблону користувацького блоку


11

Я хочу створити свій власний блок із спеціальним вмістом у Drupal 8, на початку я створюю Block із просто простим текстом на ньому, і працюю правильно, моя проблема полягає в тому, як я можу передати свою власну змінну до неї? Я бачив якийсь підручник про це, моє ім'я Модуля, 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 для вашої уваги
Yusef

Ви хочете, щоб вміст змінних всередині блоку? Потім це не підключено до шаблону блоку, оскільки це для зовнішньої сторони блоку. ( 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. Цей шаблон працює з власним набором змінних. (Якщо ви хочете скористатися цією гілочкою, вам доведеться скопіювати її з основної або базової теми, і тоді ви побачите, які змінні знаходяться всередині). Ваші змінні, встановлені в масиві візуалізації функції збірки, закінчаться у 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
Що про змінні, про які попросила ОП?
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.