ส่งไฟล์เทมเพลตตัวแปรเป็นบล็อกแบบกำหนดเอง


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>

คุณเขียนว่าคุณเห็นบทเรียนบางอย่างเกี่ยวกับเรื่องนี้ อาจเป็นเรื่องเกี่ยวกับสองหัวข้อที่แตกต่างกันและคุณพยายามที่จะนำไปใช้ในเวลาเดียวกัน

เทมเพลตที่กำหนดเองในลิงค์แรกคือ 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
สิ่งที่เกี่ยวกับตัวแปร OP ถาม?
leymannx

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.