Có cách nào để chặn danh sách NID được tạo bởi một chế độ xem và sử dụng chúng làm bộ lọc cho chế độ xem khác không?


8

Tôi đang ở điểm kinh nghiệm của Drupal nơi tôi đang cố gắng giải quyết các thách thức thiết kế trang web ở cấp mã tùy chỉnh bằng cách sử dụng API Drupal và Lượt xem. Như thường lệ, nỗ lực giải quyết vấn đề rõ ràng đơn giản của tôi đã cho tôi thấy tôi chưa biết bao nhiêu!

Tôi có một trường tham chiếu nút chỉ đến nội dung 'các sự kiện liên quan' được sử dụng bởi nhiều loại nội dung và danh mục con khác nhau cho mỗi loại này. Trong khi tôi có thể tạo mối quan hệ và hiển thị 'sự kiện liên quan' để xem, có vấn đề. Đối với một, tôi muốn các sự kiện liên quan được đặt trong một khối riêng biệt và hiển thị một danh sách các sự kiện liên quan cho toàn bộ danh sách các bài báo được cung cấp bởi chế độ xem. Lượt xem không xử lý bất kỳ sự trùng lặp nào cho nhiều mục đích có cùng tham chiếu 'các sự kiện liên quan'. Ngoài ra, tôi sẽ phải tạo các chế độ xem 'sự kiện liên quan' riêng biệt cho từng loại nội dung và danh mục con sẽ có số lượng khá lớn.

Nếu tôi có thể tạo một chế độ xem sự kiện liên quan riêng biệt có thể chấp nhận danh sách các số liệu dưới dạng đối số, thì chế độ xem sự kiện có liên quan có thể được đơn giản hóa. Vì vậy, câu hỏi của tôi là làm thế nào để đi về điều này. Mặc dù có thể có thể từ bên trong các khung nhìn, tôi đang tìm kiếm một giải pháp php mô-đun tùy chỉnh , vì vậy tôi cần phải đạt được những điều sau:

  1. Trích xuất kết quả của bất kỳ chế độ xem 'loại nội dung' nào dưới dạng danh sách các đối số. Ngoài việc hiển thị kết quả xem, tôi cần tải danh sách NID đang được hiển thị.

  2. Gọi chế độ xem thực tế có liên quan và chuyển danh sách các giá trị cho nó để sử dụng làm bộ lọc hoặc bộ lọc theo ngữ cảnh trong chế độ xem 'sự kiện liên quan'.

Thông tin thêm:

Sử dụng chiến lược này, tôi bắt đầu bằng cách xác định chế độ xem và cố gắng trích xuất kết quả từ nó. Nỗ lực này đã dẫn đến một vấn đề tìm kiếm kết quả trong đối tượng xem ( xem câu hỏi này ). Khi tôi nhận được kết quả, tôi sẽ cần tạo một chế độ xem khác có các kết quả đó dưới dạng bộ lọc. Tôi đã thấy các khung nhìn được triển khai từ mã bao gồm các tệp trong đó tất cả các tham số được mã hóa, nhưng không tìm thấy các ví dụ xác định và tạo chế độ xem và thao tác các kết quả bằng hàm php. Bất kỳ ví dụ hoặc liên kết sẽ được đánh giá cao.

Vì vậy, xa:

Hai câu trả lời đã giải quyết quá trình áp dụng kết quả của một khung nhìn và đặt nó vào một khung nhìn khác như một bộ lọc theo ngữ cảnh. Nhưng tôi vẫn phải đối mặt với vấn đề có hàng tá loại nội dung với ít nhất một tá các biến thể của khung nội dung trong mỗi loại. Thay vì liên kết trực tiếp từng chế độ xem với các sự kiện có liên quan, tôi sẽ cần có bất kỳ chế độ xem nội dung view1 nào của tôi chuyển kết quả của nó sang một chế độ xem 'thực tế liên quan' riêng biệt.

CONTENT TYPE    SUB-CATEGORY       RELATED FACT (nid)
    Type 1 --------- General Info       101, 105 
                     Specifications     103, 105
                     Inspections        102 
                     Quality  
                     etc...   
   Type 2 ----------General Info       101, 106
                    Specifications     102, 103 
                    Cost factors       107
                    etc... 

View1 tìm thấy một loại nội dung cụ thể và chứa các bài viết thể loại phụ khác nhau được sắp xếp theo giá trị trong trường danh mục con. Ngoài ra, nó chứa một trường tham chiếu nút cho các sự kiện liên quan. Xem một bộ lọc cho loại nội dung và danh mục con và có các trường được hiển thị để hiển thị và trường được ẩn với các nút tham chiếu thực tế liên quan đến thte.

Bộ lọc View2 cho các bài viết 'thực tế liên quan' và chứa bộ lọc theo ngữ cảnh được đặt cho nid (mặc dù cài đặt áp dụng cho URL)

Sử dụng mã trong câu trả lời của Letharion, vòng lặp foreach trong dòng 6 đang tổng hợp danh sách ID bài viết, không phải id thực tế liên quan (các bài viết giữ tham chiếu đến các sự kiện liên quan, nhưng các sự kiện liên quan không có tham chiếu nút cho các bài viết) . Tôi cần trích xuất id thực tế liên quan từ trường thực tế trong mỗi nút. Tôi đã bao gồm trường sự kiện trong định nghĩa View1, nhưng không thể tìm thấy kết quả vì lệnh dpm (nút $); đã bị sập và tôi không biết nơi các giá trị được lưu trữ trong mảng.

Vì sẽ có nhiều hơn một View1 được nhân bản cho các loại nội dung khác nhau, tôi nghĩ rằng có thể có ý nghĩa khi sử dụng hook_view_post_execute và đã mã hóa nó như sau:

function mymodule_views_post_execute (&$sourceview) {

  $nids = '';
  foreach($sourceview->result as $node) {
    $nids += $node->nid . ',';  //I need field name for $node->facts

  }

  $nids = rtrim($nids, ',');
  $view = views_get_view('get_related');

  //dpm($nids);  // Fatal error: Cannot unset string offsets...

  $view->execute_display('panel_pane_1', array($nids));
  }

Cuối cùng, tôi không chắc chắn liệu tôi có phải điều hướng màn hình của màn hình đến vị trí thích hợp hay không, điều này được thực hiện đơn giản bằng cách đặt ngăn nội dung sự kiện liên quan vào vị trí bảng thông qua Giao diện người dùng và để bảng điều khiển xử lý phần còn lại.


2
Đây có phải là Drupal 7 không? Nếu vậy tôi sẽ khuyên bạn nên sử dụng EntityFieldQuery để lấy danh sách các nút đáp ứng tiêu chí của bạn.
beth

Bạn có thể chỉ ra một số mã ví dụ nơi API này được sử dụng. Tôi chưa quen với thế giới mã hóa Drupal và cần theo dõi một ví dụ về thế giới thực để tìm ra mọi thứ.
Ashlar

drupal.org/node/1343708 là một trang có tên "Cách sử dụng EntityFieldQueries".
beth

Câu trả lời:


3

Chỉ cần ra khỏi đầu của tôi

Với các khung nhìn 'get_nids' và 'get_related', get_related lấy một nidđối số, được đặt để chấp nhận nhiều giá trị. Tùy chọn này được ẩn dưới "thêm", ở dưới cùng của cửa sổ cấu hình.

Lựa chọn 1:

$view = views_get_view('get_nids');
// Repeating query, ensure the View is set to cache the results.
$view->preview('display_machine_name', array($arg1, $arg2));

$nids = '';
foreach($view->result as $node) {
  $nids += $node->nid . ',';
}
$nids = rtrim($nids, ',');
$view = views_get_view('get_related');
$view->execute_display('display_machine_name', array($nids));
print $view->render();

Lựa chọn 2:

Thêm loại hiển thị "bối cảnh" vào get_nids và chuyển bối cảnh đó làm đối số cho hiển thị khung nội dung của get_related. Thật không may, tôi sẽ phải đoán rằng bối cảnh Lượt xem thiếu hỗ trợ để nén nhiều kết quả vào một ngữ cảnh duy nhất, do đó có thể yêu cầu một yêu cầu tính năng trong Ctools.

Tùy chọn 3:

Beth có một đề xuất tuyệt vời trong một nhận xét, đó là sử dụng EntityFieldQuery , khi bạn muốn một giải pháp mã thuần túy, nó cũng sẽ hoạt động với MongoDB . Lượt xem mặc dù có lợi thế là hầu hết các công việc có thể được thực hiện trong giao diện người dùng, điều này thường thuận tiện.


Theo mã trong lượt xem_db_object cho phương thức -> thực thi (dòng Views.inc 1060). Tôi không thấy bất cứ điều gì trong mã của phương thức đọc đối số (mảng ($ nid)). Ngoài ra, làm cách nào để định cấu hình chế độ xem 'get_related' để chấp nhận các giá trị bộ lọc trong đối số mảng ($ nids)? Tôi có đặt bộ lọc thành 'nội dung liên quan' và bộ lọc theo ngữ cảnh để chấp nhận NID không?
Ashlar

Xin lỗi, bạn hoàn toàn đúng, điều đó đáng lẽ phải được thực hiện , đã thêm thông tin về bộ lọc theo ngữ cảnh để trả lời. :)
Letharion

Tôi đã thêm thông tin để hoàn thành vấn đề hiển thị nội dung cho các sự kiện liên quan trong câu hỏi. Vui lòng xem "Cho đến nay".
Ashlar

Xin lỗi, tôi không hiểu vấn đề ở đâu. Theo bài đăng của bạn, trường tham chiếu nút được chia sẻ giữa các loại nội dung của bạn và như vậy, chế độ xem 'get_nids' sẽ tập hợp tất cả các thực thể được giới thiệu. Nếu không, tuy nhiên, người ta sẽ cần một vòng lặp trên chế độ xem đầu tiên.
Letharion

1
Hừm! Tôi nghĩ rằng tôi đã nhầm lẫn và có thể làm cho điều này phức tạp hơn mức cần thiết. Cảm ơn
Ashlar

2

Tìm kiếm các trường trong một nút và trả về danh sách NID là điều chính xác mà EntityFieldQueries được sinh ra để làm. (Xem thêm: câu hỏi của riêng tôi về chủ đề này ).

Một ví dụ từ mã của tôi, chạy khi gửi biểu mẫu web và trong đó tôi tìm kiếm các nút loại "Khóa Anzwer" để tìm (các) trường có "Tham chiếu câu đố" được điền vào NID của biểu mẫu web hiện đang xác thực :

    $arg = arg();
    $nid = $arg[1]; //this finds us the NID of the current page
    $query = new EntityFieldQuery;  // this EntityFieldQuery searches through Entities for Nodes that point to the current Webform.
    $result = $query
        ->entityCondition('entity_type', 'node') // find nodes
        ->propertyCondition('status', 1) // that are published
        ->propertyCondition('type', 'quiz_answer_key')  // of type Quiz Answer Key
        ->fieldCondition('field_answer_quiz', 'nid', $nid, '=') // that point to the current node in their Quiz reference field
        ->execute(); // do the query
    $results        = $query->ordered_results; //grab the results

Sau đó, nếu bạn thực sự muốn tải các giá trị từ các trường trong các nút, bạn sẽ sử dụng node_loadđể lấy thêm thông tin từ các nút bạn muốn, như vậy:

    $ans_key_id     = $results[0]->entity_id;
    $ans_node       = node_load($ans_key_id);       //once the correct node has been identified, load the contents of that node and suss out the answers 

Bây giờ $ans_nodelà một mảng (hoặc đối tượng, tôi quên) có chứa tất cả thông tin trong tất cả các trường trong nút. Voilá!


0

Ok một giải pháp được mã hóa (có một vài khu vực) nhưng đây là một:

  1. Tạo chế độ xem lấy tất cả đầu ra của nid dưới dạng danh sách giới hạn dấu phẩy, bạn có thể thực hiện việc này bằng cách sử dụng các trường làm đầu ra của mình và đặt cài đặt kiểu của bạn thành Kiểu không định dạng, trường kiểu hàng -> đặt trường nid thành dòng và sử dụng dấu phẩy làm dấu phân cách.
  2. Trong mô-đun của bạn tạo một hàm gọi chế độ xem này và nhận đầu ra
  3. Tạo chế độ xem thứ hai (hoặc hiển thị) của bạn sử dụng chức năng này làm đối số trong chế độ xem thứ hai thực sự là đầu ra hiển thị, do đó, trong đối số, đối số phải là nút: nid, Hành động cần thực hiện phải được đặt thành "cung cấp mặc định" và bạn sau đó sử dụng cài đặt mã PHP để gọi hàm của bạn: return mymodule_get_nids (); đảm bảo hộp kiểm "cho phép nhiều thuật ngữ cho mỗi đối số" được chọn

Mã bước 2

function mymodule_get_nids() {
    $view = views_get_view('getmynids')) // View name
        $view->set_display('mynids'); // Display name
        $view->execute();
        if ($view->result) {
         return $view->preview(); // Can't remember if this needs to be echo or return try both.
        }
    }
}

Đây có nên là một câu trả lời riêng biệt ?? hoặc chỉnh sửa ??


Tôi đang tìm kiếm các giải pháp mã hóa. Tôi sẽ làm rõ câu hỏi.
Ashlar

Vui lòng sửa lỗi cho tôi nếu tôi sai, nhưng theo như tôi có thể nói, điều này thậm chí sẽ không giải quyết được vấn đề, vì Ashlar đang tìm cách lấy dữ liệu từ nhiều mối quan hệ cùng một lúc, trong khi các tệp đính kèm sẽ chỉ là "hiện tại" một? (Đã được một thời gian kể từ khi tôi sử dụng các tệp đính kèm, vì vậy tôi có thể sai)
Letharion

Cảm ơn nỗ lực của bạn. Tôi đã thêm thông tin để hoàn thành vấn đề hiển thị nội dung cho các sự kiện liên quan trong câu hỏi. Vui lòng xem "Cho đến nay".
Ashlar
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.