Cách kết xuất mẫu trong Drupal 8


12

Tôi đang cố gắng kết xuất một mẫu trong Drupal 8. Trong Drupal 7, tôi sẽ tạo một chủ đề với hook_theme, tạo một thư mục mẫu trong mô-đun của mình, thả tệp mẫu vào và tôi có thể hiển thị nó với theme (). Làm cách nào để thực hiện hiệu quả với Drupal 8? Tôi đã thử như sau, nhưng nó lỗi:

Trong twitter_pull.module

/ **
 * Triển khai hook_theme ().
 * /
chức năng twitter_pull_theme ($ hiện tại, $ type, $ theme, $ path) {
  trả về mảng (
    'twitter_pull_tweet_listing' => mảng (
      'biến' => mảng (
        'mô tả' => mảng (),
      ),
      'mẫu' => 'mẫu / twitter_pull_tweet_listing',
    ),
  );
}

Bên trong twitter_pull / samples: twitter_pull_tweet_listing.html.twig

Trong khối của tôi:

$ tweet_template = mảng ('# theme' => 'twitter_pull_tweet_listing', '#attribut' => mảng ('params' => $ params));
$ output = drupal numnder ($ tweet_template, mảng ('params' => $ params));
in $ đầu ra;

Tôi nhận được lỗi sau trong nhật ký của mình:

Lỗi người dùng: "nội dung" là khóa mảng kết xuất không hợp lệ trong Drupal \ Core \ Render \ Element :: children () (dòng 89 của C: \ xampp \ htdocs \ drupal \ core \ lib \ Drupal \ Core \ Render \ Element. php).

EDIT: Một lỗi khác:

Twig_Error_Loader: Không thể tìm thấy mẫu "mô-đun / tùy chỉnh / twitter_pull / mẫu / mẫu / twitter_pull_tweet_listing.html.twig" (nhìn vào: C: \ xampp \ htdocs \ drupal). trong Twig_Loader_Filesystem-> findTemplate () (dòng 202 của C: \ xampp \ htdocs \ drupal \ core \ eller \ twig \ twig \ lib \ Twig \ Loader \ Filesystem.php).

Tôi tưởng tượng lỗi này xảy ra vì tôi không sử dụng không gian tên và tự động tải chính xác. Tôi để tập tin mẫu của tôi ở đâu? Dựa trên thông báo lỗi, tôi thậm chí đã cố gắng đặt nó tại C: \ xampp \ htdocs \ drupal \ samples \ nhưng nó vẫn không hoạt động.


Có gì trong twitter_pull_tweet_listing.html.twig?
Clive

chỉ là một trình giữ chỗ: văn bản 'đây là một mẫu twig'
user1015214

Bất kỳ lý do cụ thể nào bạn đang truyền một mảng các tham số làm đối số thứ hai drupal_render()? Nó đang mong đợi một boolean
Clive

Không, đó là một sai lầm. Tôi lấy ra tham số thứ hai của drupal numnder và tôi vẫn gặp vấn đề tương tự. Tôi đang chỉnh sửa câu hỏi của tôi ở trên, để bao gồm một lỗi thứ hai tôi thấy.
1015214

Phần templates/templates/trong thông báo lỗi thứ 2 khiến tôi nghĩ bạn nên thử 'template' => 'twitter_pull_tweet_listing',thay vì 'template' => 'templates/twitter_pull_tweet_listing',tronghook_theme()
Clive

Câu trả lời:


24

Nói chung trong Drupal 8, bạn nên bỏ dòng mẫu và đặt tên mẫu giống như hook của bạn, chuyển đổi dấu gạch dưới thành dấu gạch ngang. Điều này đã được thay đổi vì các mẫu là định dạng đầu ra mặc định cho đầu ra có thể sử dụng trong D8. Vì vậy, trong trường hợp của bạn điều này hook_theme():

/**
 *  Implements hook_theme().
 */
function twitter_pull_theme($existing, $type, $theme, $path) {
  return [
    'twitter_pull_tweet_listing' => [
      'variables' => [
        'description' => [],
      ],
    ],
  ];
}

Khoan sẽ chỉ vào một mẫu tại templates/twitter-pull-tweet-listing.html.twig. (Đó là sử dụng cú pháp mảng ngắn .)

Bản ghi thay đổi có liên quan: https://www.drupal.org/node/2231673

Và ngoài ra, từ một khối hoặc bộ điều khiển, vui lòng trả về một mảng kết xuất thay vì một chuỗi. Bằng cách đó, các kết quả có thể được xử lý sau đó và dữ liệu thô vẫn có thể truy cập được. Nói cách khác, tránh gọi drupal_render()từ mã của bạn bất cứ khi nào có thể. Điều này cũng áp dụng cho Drupal 7: https://www.drupal.org/node/930760#creating

Vì vậy, từ khối của bạn:

return [
  '#theme' => 'twitter_pull_tweet_listing',
  '#description' => 'foo',
  '#attributes' => [],
];

1
Thật tốt khi biết điều đó có chủ ý :)
Clive

Cảm ơn câu trả lời! Nhưng bạn có thể giải thích thêm một chút lý do tại sao tôi chỉ có thể trả về mảng là đầu ra không? Tại một số thời điểm, kết xuất drupal cần được gọi để chạy nó, vì vậy nếu tôi không gọi nó, ai sẽ làm điều đó?
1015214

Bạn cũng có thể làm điều đó trong Drupal 7. Tôi sẽ cố gắng tìm một số tài liệu để thêm vào câu trả lời.
Cottser

1
Một chút chậm trễ nhưng tôi đã thêm một liên kết đến drupal.org/node/930760#creating trong câu trả lời.
Cottser

1
Chính xác những gì tôi cần, cũng giải thích rõ ràng! Cảm ơn bạn.
Johan Haest
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.