Truyền tệp biến mẫu cho khối tùy chỉnh


11

Tôi muốn tạo khối tùy chỉnh của mình với nội dung tùy chỉnh trong Drupal 8, ban đầu tôi tạo Khối chỉ với văn bản đơn giản trên đó và hoạt động chính xác, Vấn đề của tôi là làm cách nào để chuyển biến tùy chỉnh của mình cho nó? Tôi đã thấy một số hướng dẫn về nó, tên Mô-đun của tôi tcdevvà đây là nội dung của .moduletệp.

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

và của tôi 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'
        );
}
}

và cuối cùng là tập tin mẫu của tôi block--sliderblock.html.twig

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

Nhưng Kết quả chỉ là "Khối tùy chỉnh của tôi-". Vấn đề là các biến không được truyền vào tệp mẫu, lỗi của tôi ở đâu?

đánh giá cao sự giúp đỡ

Câu trả lời:


15

Mảng trả về của bạn không chứa #themekhóa. Vì vậy, tại thời điểm này bạn hoàn toàn không sử dụng tệp mẫu.

Và bạn có thể có một sự pha trộn giữa khối bên ngoài và theo chủ đề nội dung bên trong khối. Mẫu bên trong của bạn có tên tcdev, vì đó là tên bạn đã xác định ở đầu mảng *_theme()và tcdev.html.twig là nơi các biến của bạn sẽ kết thúc.

Mã của bạn sẽ trông giống như sau.

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>

Bạn đã viết rằng bạn đã thấy một số hướng dẫn về nó. Có lẽ đây là về hai chủ đề khác nhau và bạn đang cố gắng áp dụng chúng cùng một lúc.

Mẫu tùy chỉnh trong liên kết đầu tiên là tcdev.html.twig. Những gì bạn đang cố gắng thực hiện với phương thức trong liên kết thứ hai là dành cho khối - slideblock.html.twig.


Nhưng block--sliderblock.html.twigkết xuất lại, vấn đề là làm thế nào để biến biến của tôi cho nó !!!? những gì bạn đề nghị với tôi theo mã của tôi. ? tnx cho sự chú ý của bạn
Yusef

Bạn muốn nội dung của các biến trong một khối? Sau đó, điều này không được kết nối với một mẫu khối, bởi vì điều này là cho bên ngoài của khối. ( block--sliderblock.html.twigTrả lại, bởi vì bạn đã sử dụng tên của một gợi ý chủ đề, điều này sẽ làm cho ngay cả khi khối sẽ hoàn toàn trống rỗng, bạn có thể thử loại này)
4k4

Tôi đã cố gắng thay đổi mã của bạn để làm cho mọi thứ rõ ràng hơn, hy vọng điều này hoạt động, đã không gỡ lỗi nó.
4k4

Tôi áp dụng mã của bạn, xây dựng lại bộ đệm, nhưng vẫn đọc từ đó block--sliderblock.html.twigvà không có gì được chuyển cho nó. Tôi kích hoạt thông tin gỡ lỗi và thông tin gỡ lỗi là<!-- 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

Biến của bạn không được đọc bởi block--sliderblock.html.twig. Mẫu này hoạt động với tập hợp các biến của riêng nó. (Nếu bạn muốn sử dụng twig này, bạn sẽ phải sao chép nó từ chủ đề cốt lõi hoặc cơ sở và sau đó bạn thấy những biến nào bên trong). Các biến của bạn được đặt trong mảng kết xuất của hàm xây dựng sẽ kết thúc bằng tcdev.html.twig. Bạn đã tạo tập tin twig này?
4k4

3

Vì vậy, tôi đã tìm thấy, bạn muốn ghi đè lên mẫu khối mặc định bằng mẫu khối (mô-đun) tùy chỉnh và sau đó chuyển các biến của bạn cho nó, trước hết bạn phải đảm bảo ghi đè chính xác mẫu của mình vì dường như mẫu khối hiện tại của bạn được xuất ra từ Thư mục chủ đề (không phải mô-đun):

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

Để làm điều này trước tiên, bạn nên tạo một thư mục có tên templates/trong mô-đun gốc của bạn và sau đó đặt mẫu của bạn ở đó.

Bây giờ hãy cho Drupal biết bạn lưu mẫu trong mô-đun của bạn. trong your_module.modulethêm chức năng này:

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

Cuối cùng hãy cẩn thận về nơi bạn đặt tập tin twig của bạn và những gì bạn đặt tên nó. Tạo một thư mục mẫu trong thư mục mô-đun của bạn và thay thế _tên hàm trong chủ đề bằng -:
mymodule-block.html.twig

Đừng xóa bỏ bộ nhớ cache.


Với sự giúp đỡ của câu trả lời được viết Nicensintrong bài này:
Khối tùy chỉnh (mô-đun) Drupal 8 tạo tệp mẫu twig


1
Điều gì về các biến OP yêu cầu?
leymannx

1

Tôi đã đến điểm này quá. Các biến dường như không được chuyển đến mẫu khối. Tôi có mã gần giống như bạn, trong trường hợp của tôi, tôi đã bật gỡ lỗi twig và tắt bộ đệm trong services.yml. Ngay cả khi xóa bộ nhớ cache tôi cũng gặp vấn đề này nhưng đã được giải quyết khi tôi kích hoạt cấu hình này trong môi trường dev của mình.

twig.config:    
# Not recommended in production environments
# @default false
debug: true
# Not recommended in production environments
# @default null
auto_reload: true
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.