it-swarm-vi.com

Làm cách nào để lấy ID nút từ URL?

Cho đến nay, tôi đã bắt gặp 3 hàm 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?

47
silkAdmin

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 đang 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, sau đó 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 liên quan đến 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 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ố hàm tiền xử lý, chẳng hạn như các hàm cho trang hoặc nút, đã có $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() , điều này làm cho $variables['node'] Có sẵn cho các hàm tiền xử lý cho các nhận xét.

63
kiamlaluno

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

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.

7
Bart

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, hãy 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 đang ở 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];
4
iStryker
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ộ, do đó nó sẽ không bị ảnh hưởng bởi các bí danh đường dẫn.

3
Jeremy French

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();
2
oknate