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?
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?
Câu trả lời:
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()
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. 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ạidrupal_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.
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.
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];
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.
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.
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();