Cách tốt nhất, theo lập trình, để lặp qua kết quả của chế độ xem là gì?


12

Đưa ra một chế độ xem, được đặt tên là 'Trẻ em' (có hai trường: child_node_id và birthday_order_value) cách tốt nhất, theo lập trình, để lặp qua các kết quả lượt xem được đưa ra là display_id của 'default' và một đối số có chứa id nút cha?

Trước đây, tôi đã sử dụng Chế độ xem trong một khối bằng cách sử dụng mã tương tự như sau:

if ( arg(0) == 'node' && is_numeric(arg(1)) && ! arg(2)) {
   $node = node_load(arg(1));
   $args = array($node->nid);
   $view = views_get_view('Children');
   print $view->preview('default', $args);
}

Tuy nhiên, trong một khối khác tôi muốn thực hiện một số logic dựa trên các giá trị được tìm thấy trong chế độ xem. Bạn có thể đoán rằng logic kinh doanh dựa trên yêu cầu cuối cùng của tôi: Tôi muốn khối mã hỗ trợ chế độ xem ('Trẻ em') được gọi nhiều lần. Khi tôi lặp qua các kết quả của tập dữ liệu xem, tôi muốn lặp lại theo cách đệ quy thông qua các nút con truy vấn cho con của họ.


Cách tiếp cận của bạn có vẻ ổn. Nếu bạn đặt nó trong một câu trả lời, mọi người có thể bỏ phiếu và phê duyệt. Một điều bạn có thể thử là thay vì bỏ đặt chế độ xem mỗi lần. Thực hiện $ view-> clone_view () trước khi thực hiện. Xem tải khá nặng và điều này có thể giúp bộ nhớ và hiệu suất.
Jeremy Pháp

Xin lỗi nếu tôi rời khỏi đây, nhưng đây có phải là điều bạn có thể thực hiện bằng cách sử dụng các mối quan hệ và nhóm trên một trường trong bảng cha mẹ. Tôi không chắc bạn cần phải dùng đến mã. Cũng có thể đơn giản hơn để gọi subview và logic từ ghi đè mẫu cha.
Jason Smith

Bạn nên xem xét foreach thay vì cho (.. sizeof ()), nó hoạt động tốt hơn rất nhiều (vì nó là C thay vì PHP).
berkes

Một điều cần lưu ý, thay vì làm if (arg(0) == 'node' && is_numeric(arg(1)) && ! arg(2)), nó có thể tốt hơn để sử dụng if ($node = menu_get_object()).
Chris Pliakas

Tôi đã cắt câu trả lời từ câu hỏi và đăng nó dưới dạng câu trả lời. Bằng cách đó, rõ ràng hơn cho người dùng của trang web rằng câu hỏi này có câu trả lời.
Jeremy Pháp

Câu trả lời:


2

Chơi xung quanh với Lượt xem một chút tôi dường như đã tìm ra cách tiếp cận. Tuy nhiên, tôi muốn để câu hỏi của tôi mở cho các câu trả lời khác và giải pháp tốt hơn.

<?php
if ( arg(0) == 'node' && is_numeric(arg(1)) && ! arg(2) ) {
   $node = node_load(arg(1));
   $args = array($node->nid );
   unset($view);
   $view = views_get_view('Children');
   $view->set_display('default');  
   $view->set_arguments($args);
   $view->set_items_per_page(20);
   $view->execute();
   $newarg = array();
   for ($i=0; $i<sizeof($view->result); $i++) {
      $newarg[$i] = $view->render_field('nid_1', $i);
   }
   for ($i=0; $i<sizeof($newarg); $i++) {
      unset($view);
      $view = views_get_view('Children');
      $view->set_display('default');  
      $view->set_arguments($newarg[$i]);
      $view->set_items_per_page(20);
      $view->execute();
      ....
   }
}
?>

Chìa khóa để thực hiện chế độ xem nhiều lần là để tôi bỏ đặt ($ view) khi tôi hoàn thành với tập kết quả.


1

Tôi đã đạt được số dặm tốt từ chức năng sau. Giá trị trả về là một mảng của tất cả các bản ghi xem. Gọi dsm ($ return_value) sẽ cho bạn ý tưởng tốt về cấu trúc của chế độ xem cụ thể của bạn.

function _get_view_data($view_name, $args, $page = NULL, $page_size = 0 ) {
    $view = views_get_view($view_name);
    $view->pager['items_per_page'] = $page_size;
    $view->set_arguments($args);
    if ($page) {
        $view->build($page);
        $view->execute($page);
    }
    else {
        $view->execute();
    }
    return $view->result;
}

1

Đây là một hàm trợ giúp đã được tích hợp sẵn trong API Drupal. (Tôi đã dành một lúc để loay hoay trong Tài liệu Drupal và cuối cùng đã tìm thấy nó. Có vẻ như nhiều người khác cũng đã tạo ra các giải pháp không sử dụng người trợ giúp này, và người trợ giúp này cũng thực hiện một bước thú vị mà các giải pháp khác không .. . để gọi pre numnder trên đối tượng $ view trước khi thực thi).

Tôi không thể đảm bảo liệu nó có hoạt động tốt hay không, nhưng ít nhất đó là một nơi cụ thể để giải quyết các vấn đề với các phương pháp này.

Dành cho D6 http://api.drupal.org/api/view/view.module/feft/view_get_view_result/6

Và cho D7 http://api.drupal.org/api/view/view.module/feft/view_get_view_result/7

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.