Làm thế nào để có được nodeid?


7

Làm cách nào để có được nodeid trong Drupal cho trang hiện tại mà không sử dụng thông tin từ url trang? I E:

if(arg(0)=='node' && is_numeric(arg(1))){
  $nid = arg(1);
}

Tôi không muốn sử dụng cách tiếp cận trên.

Câu trả lời:


16

Vẫn thông qua URL một cách gián tiếp, nhưng đây là cách dễ nhất để có được nó: menu_get_object .

<?
if ($node = menu_get_object()) {
 $nid = $node->nid;
}
?>

Lưu ý rằng nếu có một nút, dù sao thì nó cũng đã được hệ thống menu tải và nó được tải từ bộ đệm tĩnh.


2
Lưu ý cách tiếp cận này đảm bảo ID nút hợp lệ và người dùng có quyền truy cập vào nó.

tôi đã thử menu_get_object, tuy nhiên, nó không nhận được bất kỳ thuộc tính nút nào

2
định nghĩa "thuộc tính nút". menu_get_object () trả về đối tượng nút $ đầy đủ nếu bạn đang xem một nút. Nếu bạn đang cố gắng để có được nút $ ở nơi khác thì hãy xác định điều đó;)
Berdir

2
Cách tiếp cận này đảm bảo id hợp lệ và có thể truy cập được, như @chx chỉ ra. Nhưng cũng có thể rất nặng nề: nó thường dẫn đến nhiều cuộc gọi DB. Mới tuần trước tôi đã thay thế một $node = menu_get_object()câu hỏi tương tự như mã câu hỏi ban đầu, lưu hơn 500 yêu cầu cơ sở dữ liệu trên mỗi trang . Sử dụng cẩn thận!
cập bến

1
berkes, menu_get_object chỉ kích hoạt một node_load được lưu trữ tĩnh và trên một trang nút nên nó đã ở đó. Ngoài ra, hơn 500 yêu cầu db cho một nút tải? Tôi thấy điều này thật khó tin ... có gì đó không đúng.

1

Trừ khi có một số lý do kỹ thuật tại sao phương thức arg () không khả dụng (hoặc bạn CẦN kiểm tra quyền truy cập như trong các bài đăng khác), phương thức arg () là cách đơn giản và nhanh nhất.

Nếu sau đó bạn cần các thuộc tính bổ sung, bạn có thể chạy node_load () để lấy ID. Giả sử bạn đang cố gắng để có được nút hiện tại, điều này có khá nhiều hiệu năng không đạt được.


0

Bạn có thể lấy ID của nút bằng cách gọi $node->nid. Thật vậy, lấy ID từ URL không phải là giải pháp tốt nhất vì một ngày nào đó bạn có thể chuyển sang các URL thân thiện với SEO hơn.

Từ tài liệu này , có vẻ như $nodeđược định nghĩa trong page.tpl.php, vì vậy nó sẽ có sẵn cho bạn.

<?php
  // In a template file...

  if ($node) {
    echo $node->nid;
  }
  else {
    // you are viewing taxonomy, view, etc
  }
?>

Tôi cần truy cập nó bên ngoài tập tin mẫu.

Bạn đang cố gắng truy cập nó từ đâu, một mô-đun? Trong bối cảnh nào chúng ta đang nói về "trang hiện tại"?
zourtney

Cần lưu ý rằng nếu url 'nội bộ' là nút / 12 và bạn sử dụng đường dẫn để tạo url sạch thì mã gốc vẫn hoạt động được bởi vì nút drupal / đường dẫn 12 vẫn là url theo như hệ thống có liên quan.
mirzu

0

Cách dễ nhất để làm điều này trong Drupal 8:

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

0

Một cách tiếp cận đáng tin cậy và thẳng tiến khác trong D7 sẽ là

<?php
if (isset($node->nid) && count($node->nid) > 0){
  $nodeid = $node->nid;
}
?>

Đề xuất của Zourtney gây ra lỗi chỉ mục không xác định trong trường hợp của tôi.


0

Vâng, điều đó làm tôi bối rối từ lâu, nhưng sử dụng mảng arg sẽ hoạt động trong hầu hết mọi trường hợp và Drupal đảm nhiệm việc chuyển đổi từ url thực tế được tạo bởi path hoặc pathauto .

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.