Làm thế nào để thực hiện một đề xuất móc chủ đề cho các khối theo khu vực?


14

Vì Drupal 8 không thể thực hiện được các quy ước đặt tên mẫu để tải một mẫu khối cụ thể theo khu vực mà nó được đặt trong ( "Đánh dấu khối theo vùng và tính năng tạo khuôn mẫu cho từng khu vực" ). Nhưng tôi cần phải có các html khác nhau cho các khối nếu được đặt trong một khu vực nhất định. Làm thế nào để tôi thực hiện điều này?

Tôi đã nghĩ về việc sử dụng MYMODULE_theme_suggestions_block_alter nhưng tôi không biết làm thế nào để có được khu vực hiện tại.

Câu trả lời:


20

Bạn có thể nhận được khu vực nếu bạn nhận được Thực thể Khối.

tập tin .module hoặc .theme

use Drupal\block\Entity\Block;

function MODULE_theme_suggestions_block_alter(array &$suggestions, array $variables) {
  if (!empty($variables['elements']['#id'])) {
    $block = Block::load($variables['elements']['#id']);
    $suggestions[] = 'block__' . $block->getRegion() . '__' . $variables['elements']['#id'];
  }
  /* Use this 'else if' only if you are using page_manager module and want to know which region is the block */
  else if (isset($variables['elements']['#configuration']['region'])) {
    $suggestions[] = 'block__page_' . $variables['elements']['#configuration']['region'] . '__' . end(explode(':', $variables['elements']['#plugin_id']));
  }
  return $suggestions;
}

Chỉnh sửa 1: Bao gồm trường hợp mô-đun page_manager.


Gân như hoan hảo. Bạn cần thêm mộtetet () để đảm bảo rằng #id thực sự ở đó. Ví dụ: nếu bạn sử dụng page_manager và đặt các khối trong đó, thì bạn sẽ không có #id.
Berdir

@Berdir cảm ơn;). Tôi nghĩ rằng trong trường hợp isset()này là không bắt buộc, bởi vì nếu không có #id, thì nó sẽ chuyển NULLsang ::loadchức năng và chỉ cần trả về NULL. Cuối cùng, $blockNULLvà sẽ không có gì xảy ra. Đã thử nghiệm trên dev env Drupal 8.0.4 - page_manager-1.0-alpha23 (chưa bao giờ sử dụng mô-đun này trước đây).
Vagner

Có, ngay lập tức () là bắt buộc. truy cập khóa mảng không tồn tại dẫn đến thông báo PHP. Kiểm tra nhật ký của bạn và bạn sẽ thấy. Tôi khuyên bạn nên luôn luôn phát triển với hiển thị lỗi trên verbose, đây là mặc định của ví dụ settings.php được cung cấp.
Berdir
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.