Berikan Variabel ke file templat Blokir Kustom

11

Saya ingin membuat blok khusus saya dengan konten khusus di Drupal 8, pada awalnya saya membuat Blok hanya dengan teks sederhana di atasnya, dan berfungsi dengan benar, Masalah saya adalah bagaimana saya bisa mengirimkan variabel kustom saya ke sana? Saya melihat beberapa tutorial tentang hal itu, nama Modul saya tcdevdan ini adalah isi .modulefile.

function tcdev_theme($existing, $type, $theme, $path) {
    return array('tcdev' =>
        array(
            'variables' => array(
                'title' => 'Default title',
                'description' => null
            ),
            'template' => 'block--sliderblock'
        )
    );
}

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

dan akhirnya file template saya block--sliderblock.html.twig

  <h2>My Custom Block{{ title }}-{{ description }}</h2>

Tetapi Hasil hanya "Blok Adatku-". Masalahnya adalah variabel tidak diteruskan ke file template, di mana kesalahan saya?

menghargai bantuan apa pun

Yusef
sumber

Jawaban:

15

Array pengembalian Anda tidak mengandung #themekunci. Jadi saat ini Anda tidak menggunakan file template sama sekali.

Dan Anda mungkin memiliki campuran antara blok luar dan bertema konten di dalam blok. Templat Anda di dalam memiliki nama tcdev, karena itulah nama yang Anda tentukan di bagian atas array *_theme(), dan tcdev.html.twig adalah tempat variabel Anda berakhir.

Kode Anda akan terlihat seperti yang berikut.

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>

Anda menulis bahwa Anda melihat beberapa tutorial tentang itu. Mungkin ini tentang dua topik yang berbeda, dan Anda mencoba menerapkannya pada saat yang bersamaan.

Template khusus di tautan pertama adalah tcdev.html.twig. Apa yang Anda coba lakukan dengan metode di tautan kedua adalah untuk blok - sliderblock.html.twig.

4k4
sumber
Tapi yang block--sliderblock.html.twigdiberikan, masalahnya adalah bagaimana meneruskan variabel saya ke sana !!!? apa yang Anda sarankan kepada saya sesuai dengan kode saya. ? tnx atas perhatian Anda
Yusef
Anda ingin konten variabel di dalam blok? Maka ini tidak terhubung ke templat blok, karena ini untuk bagian luar blok. ( block--sliderblock.html.twigditerjemahkan, karena Anda menggunakan nama saran tema, ini akan membuat bahkan jika blok benar-benar kosong, Anda dapat mencoba ini)
4k4
Saya mencoba mengubah kode Anda untuk membuatnya lebih jelas, semoga ini berhasil, tidak men-debug-nya.
4k4
Saya menerapkan kode Anda, membangun kembali cache, tetapi masih membaca dari block--sliderblock.html.twigdan tidak ada yang lolos. Saya mengaktifkan info debug dan info debug adalah<!-- 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
Variabel Anda tidak dibaca oleh block--sliderblock.html.twig. Template ini berfungsi dengan set variabelnya sendiri. (Jika Anda ingin menggunakan ranting ini, Anda harus menyalinnya dari tema inti atau basis dan kemudian Anda melihat variabel apa yang ada di dalamnya). Variabel Anda yang diatur dalam array render dari fungsi build akan berakhir di tcdev.html.twig. Apakah Anda membuat file ranting ini?
4k4
3

Jadi yang saya temukan, Anda ingin menimpa template blok default dengan template blok (modul) kustom, dan kemudian meneruskan variabel Anda ke sana, pertama-tama Anda harus memastikan menimpa template Anda dengan benar karena tampaknya template blok Anda saat ini dihasilkan dari Anda Direktori tema (bukan modul):

<!-- BEGIN OUTPUT from 'themes/gttc_2016/templates/block--sliderblock.html.twig' -->

Untuk melakukan ini pertama-tama Anda harus membuat direktori bernama templates/di root modul Anda dan kemudian tempatkan template Anda di sana.

Sekarang beri tahu Drupal bahwa Anda menyimpan template di modul Anda. di your_module.moduletambahkan fungsi ini:

function YOUR_MODULE_theme($existing, $type, $theme, $path) {
  return array(
    'block__my_module' => array(
      'render element' => 'elements',
      'template' => 'block--my-module',
      'base hook' => 'block'
    )
  );
}

Akhirnya berhati-hatilah di mana Anda menempatkan file ranting Anda dan apa nama Anda. Buat direktori template di direktori modul Anda, dan ganti _di dalam nama fungsi tema dengan -:
mymodule-block.html.twig

Jangan lupa untuk membersihkan cache.


Dengan bantuan jawaban yang ditulis oleh Nicensindalam posting ini:
Drupal 8 blok kustom (modul) membuat file template ranting

Mojtaba Reyhani
sumber
1
Bagaimana dengan variabel yang diminta OP?
leymannx
1

Saya sampai pada titik ini juga. Variabel tampaknya tidak diteruskan ke template blok. Saya memiliki kode yang hampir sama dengan Anda, dalam kasus saya, saya mengaktifkan ranting debug dan menonaktifkan cache di services.yml. Bahkan membersihkan cache saya mengalami masalah ini tetapi diselesaikan setelah saya mengaktifkan konfigurasi ini di lingkungan dev saya.

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