Làm cách nào để có được ID nút từ URL?


47

Cho đến nay, tôi đã bắt gặp 3 chức năng này trong Drupal 7, nhưng tôi không thực sự chắc chắn sự khác biệt giữa chúng là gì và được sử dụng nhiều hơn để có được ID nút trong chức năng tiền xử lý khối.

Bạn có thể cho tôi cái nhìn sâu sắc?


Bạn đang làm điều này trong node.tpl.php hoặc một cái gì đó tương tự? Nếu có, bạn có thể sử dụng $ node-> nid.
Bart

Không, tôi đang làm điều này trong một chức năng tiền xử lý khối, mặc dù khối được in trên trang nút.
lụaAdmin

Câu trả lời:


63

Tôi không thực sự chắc chắn sự khác biệt giữa chúng là gì

  • menu_get_object () trả về đối tượng được liên kết với trang hiện được hiển thị. Nếu mã được thực thi khi Drupal hiển thị trang example.com/node/1, thì menu_get_object()sẽ trả về đối tượng nút cho nút có ID là 1; nếu trang đang được hiển thị là example.com/user/1, thì menu_get_object('user')sẽ trả về đối tượng người dùng cho người dùng có ID là 1.
  • menu_get_item () trả về một mảng chứa chỉ mục cho từng trường có trong bảng "menu_router". Điêu nay bao gôm:
    • đường dẫn: đường dẫn hiện tại của menu gọi lại
    • load_fifts: một mảng các tên hàm (như node_load) được gọi để tải một đối tượng tương ứng với một phần của đường dẫn hiện tại
    • access_callback: cuộc gọi lại kiểm tra xem người dùng hiện đang đăng nhập có quyền truy cập vào mục menu không
    • page_callback: tên của hàm hiển thị trang
    • title: tiêu đề cho trang được liên kết với mục menu
  • drupal_lookup_path () là hàm trả về cho bạn đường dẫn nội bộ được liên kết với bí danh được truyền dưới dạng đối số. Nếu "trang chủ" là bí danh được liên kết với example.com/node/1, thì drupal_lookup_path("homepage")sẽ trả về "node/1". Các bí danh đường dẫn có thể được liên kết với bất kỳ đường dẫn nội bộ nào, không chỉ với các đường dẫn nút.

và được sử dụng nhiều hơn để có được ID nút trong chức năng tiền xử lý khối.

Nếu tất cả những gì bạn muốn nhận là ID nút của nút hiện được hiển thị, thì bạn chỉ cần sử dụng mã sau đây:

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

Nếu bạn cần lấy đối tượng nút, thì bạn có thể sử dụng đoạn mã sau:

if ($node = menu_get_object()) {
  // Use the node object.
}

Trong số các đoạn mã đó, đoạn thứ hai là tốt hơn, vì nó trả về đúng đối tượng nút cho các đường dẫn bên trong như nút / 1 / phiên bản / 3 / lượt xem.

Hãy nhớ rằng một số chức năng tiền xử lý, chẳng hạn như các chức năng cho trang hoặc nút, đã có a $variables['node']. Điều này có nghĩa là trong những trường hợp đó, bạn chỉ cần sử dụng đoạn mã sau trong chức năng tiền xử lý của mình mà không cần lo lắng về việc sử dụng chức năng nào.

if (isset($variables['node'])) {
  // Check the node ID or other properties.
}

Đối với các hàm tiền xử lý khác, hãy kiểm tra tài liệu để xem liệu có bất kỳ biến nào chứa đối tượng nút không. Ví dụ, đó là trường hợp cho template_preprocess_comment()mà làm cho $variables['node']có sẵn cho các chức năng xử lý trước để lấy ý kiến.


7

Cách thức thực hiện trong template_pre process_page của Drupal Core :

Dòng 2267 của theme.inc trở đi:

if ($node = menu_get_object()) {
    $variables['node'] = $node;
}

template_pre process_page sử dụng menu_get_object . Sau đó, vấn đề chỉ là kiểm tra xem nút có được xác định hay không và nhận $ node-> nid.


4

Một điều bạn phải cẩn thận là bí danh đường dẫn.

drupal_get_normal_path($path)

để có được đường dẫn hiện tại sử dụng biến hệ thống $_SERVER["REQUEST_URI"]

(Nếu bạn đang ở trang nút bạn có thể gọi $node->uri['path'], điều này sẽ trả về một đường dẫn không bí danh. Sau đó, một lần nữa nếu bạn ở trang nút, bạn chỉ có thể sử dụng $node->nid.)

điều này sẽ trả về nút / XXXX

vậy hãy thử một cái gì đó như

  $node_path = explode('/', drupal_get_normal_path($path));
  $nid = $node_path[1];

3
arg(1);

Đó không phải là một cách làm xấu. arg () hoạt động trên đường dẫn nội bộ, vì vậy nó sẽ không bị ảnh hưởng bởi các bí danh đường dẫn.


Đây là sự thật, nó sẽ không bị ảnh hưởng bởi các bí danh đường dẫn. Nhưng nếu bạn đang ở trên nút / XXXXX, thì bạn chỉ có thể sử dụng $ node-> nid. @Fbler, nơi nào khác bạn sẽ sử dụng arg (1) và nó sẽ trả về những gì bạn muốn?
iStryker

nếu bạn đang ở trong một hook hook, bạn sẽ không có quyền truy cập vào nút. Đối số lượt xem có thể là một ví dụ là tốt.
Jeremy Pháp

cảm ơn jeremy và istryker, tôi đã cập nhật câu hỏi của mình, nó có thể rõ ràng hơn .. Mặc dù tôi sẽ thử cả hai giải pháp của bạn, cảm ơn
lụaAdmin

1
Đó là một ý tưởng rất tồi khi sử dụng arg (), bạn đang tự ràng buộc mình vào một con đường, sử dụng menu_get_object(chỉ bao bọc xung quanh menu_get_itemđể điều đó tốt như nhau).

if (arg(0) == 'node' && is_numeric(arg(1)))sau đó arg(1)sẽ trả lại gần 99% cho bạn một ID nút. Nhưng chỉ arg(1)có thể trả lại cho bạn rất nhiều ID khác.
leymannx

2

Trong Drupal 8, bạn có thể nhận được các đối số url dựa trên những gì trong định tuyến.

Để lấy id một mình:

$nid = \Drupal::routeMatch()->getRawParameter('node');

Nếu bạn có kế hoạch tải đối tượng nút, bạn có thể chỉ cần lấy nó theo cách này:

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

Để tìm tên tham số, bạn có thể sử dụng:

$possible_parameters = \Drupal::routeMatch()->getParameters();
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.