Có cách nào để biết trang hiện tại có phải là nút không?


7

Không cần kiểm tra URL tôi muốn biết trang hiện tại có phải là trang nút không. Chúng tôi dự định sử dụng các bí danh URL để chúng tôi không muốn dựa vào cấu trúc '/ nút / *'.

Có một số biến trang hoặc một cái gì đó sẽ chỉ ra một trang nút?

Câu trả lời:


14
\Drupal::request()->attributes->get('node');

Lấy từ đây: https://api.drupal.org/api/drupal/core!lib!Drupal.php/feft/Drupal%3A%3Arequest/8

Bây giờ các tài liệu nói không bao giờ sử dụng chức năng này, nhưng tôi đã sử dụng điều này để xác định loại trang nào tôi đang truy cập.

Có một chức năng khác, nhưng tôi không chắc nó áp dụng trong trường hợp của bạn:

https://api.drupal.org/api/drupal/core%21modules%21node%21node.module/feft/node_is_page/8

Ít nhất, nếu bạn không có thực thể, bạn có thể bắt chước điều đó trong mã của bạn:

  $route_match = \Drupal::routeMatch();

  if ($route_match->getRouteName() == 'entity.node.canonical') {
    return true;
  }

1
Kiểm tra tên tuyến là tốt, nhưng không sử dụng thuộc tính nút. Điều đó cũng có mặt trên nhiều trang khác, như biểu mẫu chỉnh sửa nút, sửa đổi tổng quan, v.v. Ai đó thậm chí có thể gây rối với đầu của bạn và tạo lộ trình / bị lừa / bạn / {nút} thực sự là người dùng;)
Berdir

Tôi cần điều này cộng với $route_match->getRouteName() == 'entity.node.revision'để làm việc trên phiên bản là tốt.
leymannx

6

Trong mô-đun của riêng bạn, tôi nghĩ rằng cách được đề xuất là

$node = \Drupal::routeMatch()->getParameter('node');
if ($node instanceof \Drupal\node\NodeInterface) {
  // It's a node!
}

5

Trong mẫu trang, một biến cho nút đã có sẵn, bạn có thể sử dụng theo twig.

Để biết, nếu trang hiện tại là một nút, bạn có thể kiểm tra, nếu nodetồn tại:

trang.html.twig

{% if node %}
  <h1>This is a node</h1>
{% endif %}

Điều này là có thể, bởi vì mã này là cốt lõi:

core/includes/theme.inc:
function template_preprocess_page(&$variables) {
  ...
  if ($node = \Drupal::routeMatch()->getParameter('node')) {
    $variables['node'] = $node;
  }
}

Điều này sẽ hoạt động trên / node / [id] và bí danh url.


Chủ đề nào bạn tìm thấy điều này bởi vì tôi chưa thấy điều đó ở Bartik?
BrandenB171

Đây không phải là một cái móc trong một chủ đề, đây là một phần của tiền xử lý trong lõi, xem core/includes/theme.inc.
4k4

0

Các câu trả lời hiện tại không hoạt động để xem trước hoặc sửa đổi. Nhưng thông thường, bạn cũng muốn đoạn logic đó được đưa vào xem trước hoặc sửa đổi. Đặc biệt ở cấp độ theo chủ đề mà bạn tốt nhất sẽ thấy nút sẽ trông như thế nào sau khi nó được lưu và / hoặc xuất bản.

Vì vậy, đây là một đoạn mã nhận được nút hiện tại bất kể bạn xem nút đầy đủ hay bản xem trước hoặc sửa đổi của nó. Điều này có thể được đặt bên trong một chức năng của trình trợ giúp MYMODULE/src/Utilsđể được truy cập theo nguyên trạng hoặc để làm cho nó trở thành một dịch vụ.

$node = FALSE;
$route_match = \Drupal::routeMatch();

if ($route_match->getRouteName() == 'entity.node.canonical') {
  $node = $route_match->getParameter('node');
}
elseif ($route_match->getRouteName() == 'entity.node.revision') {
  $revision_id = $route_match->getParameter('node_revision');
  $node = node_revision_load($revision_id);
}
elseif ($route_match->getRouteName() == 'entity.node.preview') {
  $node = $route_match->getParameter('node_preview');
}

return $node;

BTW tương tự áp dụng cho node_is_page()chức năng hiện không hoạt động trên các bản sửa đổi hoặc xem trước. Tôi đã mở một vấn đề và cung cấp một bản vá trên https://www.drupal.org/project/drupal/issues/3005029 .

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.