2009-11-03 28 views
6

Làm cách nào để tạo một khối trong Drupal có thể hiển thị ID nút của trang xem mà khối hiện đang ngồi?Drupal - Lấy id nút từ dạng xem để tùy chỉnh liên kết trong khối

Tôi đang sử dụng chế độ xem để xây dựng một đoạn lớn trang web của mình, nhưng tôi cần có khả năng tạo khối "thông minh" ở chế độ PHP sẽ có nội dung động tùy thuộc vào chế độ xem đang hiển thị.

Tôi làm cách nào để tìm $ nid mà chế độ xem hiện đang hiển thị?

+0

Tôi hơi bối rối về ý nghĩa của từ 'xem' ở đây - ý của bạn là lượt xem từ mô-đun lượt xem? Nếu vậy, tại sao họ chỉ có một nút ID? (Hầu hết các khung nhìn là các tập hợp các nút, nhưng có thể bạn có một kịch bản sử dụng đặc biệt) –

+0

Hiya - bạn nói đúng - tôi đang sử dụng mô-đun lượt xem để tra cứu các nút và sau đó định dạng chúng một cách chính xác. Tất cả các thông tin về các quan điểm này liên quan đến một nút mặc dù - tôi chỉ cần có được NID đó. – MrFidge

Trả lời

14

Đây là một hơn-mạnh mẽ cách nhận ID nút:

<?php 
    // Check that the current URL is for a specific node: 
    if(arg(0) == 'node' && is_numeric(arg(1))) { 
     return arg(1); // Return the NID 
    } 
    else { // Whatever it is we're looking at, it's not a node 
     return NULL; // Return an invalid NID 
    } 
?> 

Phương thức này hoạt động ngay cả khi bạn có đường dẫn tùy chỉnh cho nút của bạn ith các mô-đun path và/hoặc pathauto.

Chỉ để tham khảo, nếu bạn không bật mô-đun path, URL mặc định mà Drupal tạo được gọi là "đường dẫn hệ thống" trong tài liệu. Nếu bạn làm bật mô-đun path, bạn có thể đặt đường dẫn tùy chỉnh được gọi là "bí danh" trong tài liệu.

Vì tôi luôn bật mô-đun path, một điều khiến tôi nhầm lẫn là liệu chức năng arg có thể trả lại một phần của bí danh thay vì một phần của đường dẫn hệ thống hay không.

Khi nó quay ra, chức năng arg sẽ luôn trả về đường dẫn hệ thống vì the arg function is based on $_GET['q'] ... Sau một chút nghiên cứu, dường như $_GET['q'] sẽ luôn trả về đường dẫn hệ thống.

Nếu bạn muốn nhận đường dẫn từ yêu cầu trang thực tế, bạn cần sử dụng $_REQUEST['q']. Nếu mô-đun path được bật, $_REQUEST['q'] có thể trả lại bí danh hoặc đường dẫn hệ thống.

+2

Trên một lưu ý liên quan, cho phép mô-đun 'đường dẫn' sẽ cho phép bạn truy cập vào một hàm có tên là' drupal_lookup_path', mà bạn có thể sử dụng để tìm đường dẫn hệ thống từ một bí danh và ngược lại. Xem tài liệu 'drupal_lookup_path' để biết thêm thông tin: mparker17

+1

Ngoài ra, khi bạn có ID nút, bạn có thể sử dụng hàm node_load để nhận tất cả thông tin về nút đó: mparker17

+1

Tùy thuộc vào ngữ cảnh bạn đang dán mã của tôi, câu lệnh 'return' có thể không phải lúc nào cũng hợp lý ...bạn có thể muốn thay thế chúng bằng '$ display_node =' nếu bạn cần trả lại một cái gì đó khác; nhưng bạn cần lấy NID cho thứ gì đó. – mparker17

1

Có một vài cách để đi về điều này:

  1. Bạn có thể làm cho các khối của bạn với Quan điểm, vượt qua nid trong thông qua một cuộc tranh cãi.

  2. Bạn có thể tự chuyển vào nid bằng cách truy cập đối tượng $ view bằng cách sử dụng mã bên dưới. Đó là một mảng tại $ view-> result. Mỗi hàng trong khung nhìn là một đối tượng trong mảng đó, và nid nằm trong đối tượng đó cho mỗi đối tượng. Vì vậy, bạn có thể chạy một foreach trên đó và nhận được tất cả các nid của tất cả các hàng trong view khá dễ dàng.

Tùy chọn đầu tiên dễ dàng hơn nhiều, vì vậy nếu phù hợp với nhu cầu của bạn, tôi sẽ thực hiện điều đó. Hy vọng rằng sẽ giúp!

+0

Tùy chọn 1 không hoàn toàn hoạt động Tôi sợ - nó có thể chọn đối số, nhưng đối số đã được định dạng không chính xác cho những gì tôi cần - nó tiếp tục sử dụng bí danh thay vì nodeID – MrFidge

+0

Bạn có thể chọn tùy chọn theo đối số chuyển vào ID nút từ URL nếu không có đối số. Hoặc bạn có thể kiểm tra tùy chọn mã PHP và nhập vào một cái gì đó như: $ url = explode ('/', $ _ GET ['q']); return $ url [1]; – theunraveler

1

Bạn nên xem xét mô-đun bảng. Nó là một mô-đun rất lớn và đòi hỏi một số công việc trước khi bạn thực sự có thể khai thác vào tiềm năng của nó. Vì vậy, hãy cân nhắc điều đó.

Bạn có thể sử dụng nó để thiết lập trang có chứa một số chế độ xem/khối có thể được đặt ở các vùng khác nhau. Nó sử dụng một khái niệm được gọi là bối cảnh có thể là bất cứ điều gì liên quan đến những gì bạn đang xem. Bạn có thể sử dụng ngữ cảnh đó để xác định nút nào đang được xem và không chỉ thay đổi các khối mà còn là bố cục. Nó cũng sạch hơn một chút vì bạn có thể di chuyển mã PHP ra khỏi giao diện quản trị.

Một lưu ý phụ, nó cũng được viết bởi tác giả lượt xem.

+0

Tôi đã nhìn vào bảng trước, không thực sự nhận được vào nó, có lẽ đây có thể là thời gian ^^ – MrFidge

2

Cuối cùng đoạn mã này đã thực hiện công việc - nó chỉ xóa sạch URL và báo cáo lại đối số cuối cùng.

<?php 
    $refer= $_SERVER ['REQUEST_URI']; 
    $nid = explode("/", $refer); 
    $nid = $nid[3]; 
?> 

Với comment trả lời, ở trên có lẽ giảm xuống này, bằng cách sử dụng chức năng Drupal arg() để có được một phần của đường dẫn yêu cầu:

<?php 
    $nid = arg(3); 
?> 
+0

Bạn nên xem hàm arg() để trích xuất đối số từ đường dẫn drupal - xem: http: // api.drupal.org/api/function/arg/6 –

+0

Henrik - thats hoàn hảo! Làm một giấc mơ. – MrFidge

+0

+1 cho đăng bài theo dõi với giải pháp tìm thấy. –

0

Chủ đề này khá cũ tôi thấy. Chỉ cần để làm mới một chút với một cái gì đó mới về Drupal 7 cách chính xác để có được id nút đang sử dụng chức năng menu_get_object();

examp:

$node = menu_get_object(); 
$contentType = node_type_get_name($node); 

Drupal 8 có phương pháp khác. Check this out

arg() is deprecated

Hy vọng nó sẽ giúp!

Các vấn đề liên quan