Kiểm tra loại nội dung của nút trong hook tiền xử lý


12

Tôi có một loạt các biến tôi muốn cung cấp trên các mẫu twig cho các mẫu nội dung cụ thể.

Trong MYTHEME.themetôi có:

function MYTHEME_preprocess_node(&$variables) {

  if (isset($variables['node'])) {

    $mycustomblock = \Drupal::service('plugin.manager.block')
      ->createInstance('myblock', []);

    $variables['mycustomblock'] = $mycustomblock->build();

    $headertext = \Drupal::service('plugin.manager.block')
      ->createInstance('headertext',
        [
          'text-align-submit'  => 'right',
          'uppercase-submit'   => TRUE,
          'header_size'        => 'h4',
          'header-size-submit' => 'h4',
          'grid-size-submit'   => 6,
          'header-title'       => 'This is a test',
        ]
      );

    $variables['headertext'] = $headertext->build();
  }
}

Điều này cho phép tôi sử dụng {{ headertext }}{{ mycustomblock }}trong các mẫu nội dung như node--contenttype1.html.twignode--contenttype2.html.twig. Nhưng tôi không muốn xây dựng các biến 'headertext''mycustomblock'biến cho mỗi loại nút đơn khi tôi chỉ cần mỗi loại cho một loại nội dung. Sẽ tốt hơn nếu có một công tắc hoặc nếu câu lệnh kiểm tra loại nội dung đó trước khi tạo một biến có một khối.

Có cách nào để tôi có thể kiểm tra loại nội dung của nút không?

Tôi đã thử

$type = $variables['node']->type;

Nhưng điều đó đã không làm việc.

Câu trả lời:


15

Để có được kiểu nội dung của một nút, bạn chỉ cần sử dụng $variables['node']->getType()hoặc $variables['node']->bundle(). Phương thức đầu tiên chỉ gọi phương thức thứ hai, vì vậy gọi một hoặc phương thức khác không tạo ra nhiều khác biệt.

public function getType() {
  return $this->bundle();
}

Sự khác biệt duy nhất là bundle()được xác định cho mọi thực thể, vì khái niệm gói là phổ biến cho tất cả các thực thể, trong khi loại nội dung là thuộc tính Drupal sử dụng cho các nút trước khi thay đổi chúng trong một trong các mô đun lõi Drupal thực hiện; việc sử dụng bundle()giúp dễ dàng điều chỉnh mã cho các loại thực thể khác, nhưng tôi không nghĩ đó là trường hợp của mã bạn đang sử dụng.


5

Bạn phải sử dụng $variables['node']->getType(). Ngoài ra nếu bạn chỉ cần nó trên một số chế độ xem, hãy xem xét kiểm tra cả điều này nữa, với$variables['view_mode']


2

Bạn có thể thêm nút (và kiểu xem) vào tên hàm hook của mình:

function MYTHEME/MYMODULE_preprocess_node__nodetype__display(&$variables) {
  // ...
}

Ví dụ: đối với pageloại nút trong fullchế độ:

function MYTHEME/MYMODULE_preprocess_node__page__full(&$variables) {
  // ...
}
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.