it-swarm-vi.com

Cách lập trình lấy NID của nút hiện tại

Tôi đã chán nản chủ đề cũ này trên drupal.org và nó chỉ khiến tôi quay cuồng. Kéo xuống con đường và cố gắng phân tích NID từ bên trong nó? Có phải là một cách tốt hơn.

Và giải pháp như

global $node;
$nid = $node->nid;

không hoạt động trong mô-đun tùy chỉnh của tôi (mặc dù tôi được bảo là chúng hoạt động trong các mẫu?). Không có lỗi hay bất cứ điều gì, nó chỉ bắt đầu $node với giá trị NULL.

Cảm giác như phải có một cái gì đó thực sự rõ ràng mà tôi đang thiếu.

Vì vậy, làm thế nào để bạn có được NID của nút hiện tại mà không có mẫu, trong khi thực hiện theo các thực tiễn tốt nhất và xây dựng một mô-đun hợp lý mạnh mẽ?

26
beth

Giả sử mã của bạn đang chạy cho một trang nút, các phương thức tôi thấy được sử dụng thường xuyên nhất trong các mô-đun lõi/contrib đang sử dụng menu_get_object() hoặc arg() :

if ($node = menu_get_object()) {
  // Get the nid
  $nid = $node->nid;
}

hoặc là

if (arg(0) == 'node' && is_numeric(arg(1))) {
  // Get the nid
  $nid = arg(1);

  // Load the node if you need to
  $node = node_load($nid);
}

Cá nhân tôi thích phương pháp đầu tiên (mặc dù việc chuyển nhượng trong điều kiện không được coi là ý tưởng tốt của một số người), nhưng cả hai đều hoàn toàn hợp lệ.

50
Clive

Cách dễ nhất để làm điều này trong Drupal 8 vì arg () không còn hoạt động:

$path_args = explode('/', current_path());
print $path_args[1];

Thay đổi hồ sơ

5
Pouya Sanooei

arg(0) trả về 'nút' và arg(1) trả về nút nid.

if (arg(0) == 'node' && is_numeric(arg(1))) {
  $nid = arg(1);
}
4
Sébastien Gicquel

Liên kết này đã giúp tôi: http://www.webomelette.com/node-id-nid-url-path-alias - Chuyển đến Nội dung và lọc xuống để tìm nội dung bạn muốn xem = Node ID cho và di chuột qua liên kết Chỉnh sửa. Nhìn xuống để xem siêu liên kết mà trình duyệt của bạn cho bạn biết nó sẽ theo nếu bạn nhấp vào Chỉnh sửa.

1
Ana

Phương thức thứ hai trong hiện tại câu trả lời được chấp nhận là phương pháp sạch nhất trong D7. Câu trả lời đầu tiên:

if ($node = menu_get_object()) {
  // Get the nid
  $nid = $node->nid;
}

chỉ sạch hơn về mặt thị giác. Trong thực tế, menu_get_object() đang gọi khá nhiều mã và có thể dẫn đến các lỗi không lường trước được. Tôi đã sử dụng nó bên trong hàm hook_node_grants() và gặp phải một PHP Lỗi nghiêm trọng:

Mức lồng tối đa của hàm '256' đạt được, hủy bỏ!

Lời giải thích, được tìm thấy tại https://drupal.stackexchange.com/a/69232/9158

Vòng lặp vô hạn mà bạn nhận thấy được gây ra từ thực tế là menu_get_object() gây ra Drupal để xác minh người dùng hiện đang đăng nhập có quyền truy cập vào nút, điều này khiến bạn thực hiện hook_node_grants() được gọi lại, nó gọi menu_get_object(), điều này khiến cho việc thực hiện hook_node_grants() của bạn được gọi lại, mà ...

Điều này đã được giải quyết bằng cách sử dụng phương pháp thứ hai:

if (arg(0) == 'node' && is_numeric(arg(1))) {
  // Get the nid
  $nid = arg(1);

  // Load the node if you need to
  $node = node_load($nid);
}
1
Jan Ehrhardt

Trong D8:

$node = \Drupal::routeMatch()->getParameter('node');
1
phuang07