Làm thế nào để tôi có được ID nút hiện tại?


51

Trong Drupal 7, nếu tôi muốn lấy id nút của nút hiện đang hiển thị (ví dụ node/145) tôi có thể lấy nó với arg()hàm. Trong trường hợp này, arg(1)sẽ trả lại 145.

Làm thế nào tôi có thể đạt được điều tương tự trong Drupal 8?

Câu trả lời:


103

Tham số sẽ được truyền lên từ nid đến đối tượng nút đầy đủ vào thời điểm bạn có quyền truy cập vào nó, vì vậy:

$node = \Drupal::routeMatch()->getParameter('node');
if ($node instanceof \Drupal\node\NodeInterface) {
  // You can get nid and anything else you need from the node object.
  $nid = $node->id();
}

Xem hồ sơ thay đổi để biết thêm thông tin.


4
Tôi chỉ muốn thêm bạn phải cẩn thận với điều này - Tôi vừa mới sử dụng \ Drupal :: routeMatch () -> getParameter ('node'); sẽ trả về một mảng gồm 1 mục (id nút) trên các trang xóa sửa đổi nút, vì vậy nếu bạn gọi một phương thức trên cái mà bạn cho là đối tượng, bạn sẽ gặp lỗi nghiêm trọng như "Lỗi nghiêm trọng: Gọi đến hàm thành viên getType ( ) trên chuỗi ".
Jeff Burnz

Làm thế nào tôi có thể nhận được tham số, nếu tôi truy cập /taxonomy/term/{tid}?
AshwinP

Đây có phải là một sự thay thế chức năng cho menu_get_object?
Frank Robert Anderson

Có khá nhiều có @Frank. Tất nhiên nó hơi khác một chút, nhưng nếu bạn rơi vào một bối cảnh không biết trang thực thể nào (nếu có) thì đây là cách được đề xuất để tìm hiểu
Clive

1
@AshwinP Tham số là bất cứ điều gì bạn viết bên {}trong tuyến đường của mình. Đối với thuật ngữ phân loại, tham số tuyến được gọi taxonomy_term, định nghĩa tuyến /taxonomy/term/{taxonomy_term}. Ở đây bạn có thể có được nó như thế này , \Drupal::routeMatch()->getParameter('taxonomy_term').
Jdrupal

17

Nó là chính xác để sử dụng \Drupal::routeMatch()->getParameter('node'). Nếu bạn chỉ cần ID nút, bạn có thể sử dụng \Drupal::routeMatch()->getRawParameter('node').


4

nếu bạn đang sử dụng hoặc tạo khối tùy chỉnh thì bạn phải theo mã này để lấy id nút url hiện tại.

// add libraries
use Drupal\Core\Cache\Cache;  

// code to get nid

$node = \Drupal::routeMatch()->getParameter('node');
  $node->id()  // get current node id (current url node id)


// for cache

public function getCacheTags() {
  //With this when your node change your block will rebuild
  if ($node = \Drupal::routeMatch()->getParameter('node')) {
  //if there is node add its cachetag
    return Cache::mergeTags(parent::getCacheTags(), array('node:' . $node->id()));
  } else {
    //Return default tags instead.
    return parent::getCacheTags();
  }
}

public function getCacheContexts() {
  //if you depends on \Drupal::routeMatch()
  //you must set context of this block with 'route' context tag.
  //Every new route this block will rebuild
  return Cache::mergeContexts(parent::getCacheContexts(), array('route'));
}

Bài đăng này không có ý nghĩa. Không có cách nào để bất cứ ai biết mã này đi đâu.
Lester Peabody

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.