Apa cara terbaik, secara terprogram, untuk beralih melalui hasil tampilan?

12

Diberikan tampilan, bernama 'Anak-anak' (dengan dua bidang: child_node_id dan nilai birth_order_valu) apa cara terbaik, secara terprogram, untuk beralih melalui tampilan hasil yang ditetapkan diberi display_id dari 'default' dan argumen yang berisi id simpul orangtua?

Sebelumnya, saya telah menggunakan tampilan dalam sebuah blok menggunakan kode yang mirip dengan yang berikut ini:

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);
}

Namun, di blok lain saya ingin melakukan beberapa logika berdasarkan pada nilai-nilai yang ditemukan dalam tampilan. Anda mungkin dapat menebak bahwa logika bisnis berdasarkan pada persyaratan akhir saya: Saya ingin blok kode yang mendukung tampilan ('Anak-anak') dipanggil beberapa kali. Ketika saya mengulangi hasil tampilan dataset, saya ingin mengulang secara berulang melalui node anak-anak yang meminta anak-anak mereka.

clsturgeon
sumber
Pendekatan Anda terlihat oke. Jika Anda memasukkannya ke dalam sebuah jawaban, orang-orang dapat memberikan suaranya dan menyetujui. Satu hal yang dapat Anda coba adalah daripada tidak membuka tampilan setiap kali. Lakukan $ view-> clone_view () sebelum eksekusi. Lihat memuat cukup berat dan ini dapat membantu memori dan kinerja.
Jeremy French
Maaf jika saya tidak berada di sini, tetapi apakah ini hal yang dapat Anda capai menggunakan hubungan dan pengelompokan pada bidang di tabel induk. Saya tidak yakin Anda harus menggunakan kode. Mungkin juga lebih mudah untuk memanggil subview dan logika dari penggantian templat induk.
Jason Smith
Anda harus mempertimbangkan foreach alih-alih untuk (.. sizeof ()), kinerjanya jauh lebih baik (karena C bukan PHP).
berkelanjutan
Satu hal yang perlu diperhatikan, daripada melakukan if (arg(0) == 'node' && is_numeric(arg(1)) && ! arg(2)), mungkin lebih baik digunakan if ($node = menu_get_object()).
Chris Pliakas
Saya telah memangkas jawaban dari pertanyaan dan mempostingnya sebagai jawaban. Dengan begitu lebih jelas bagi pengguna situs bahwa pertanyaan ini memiliki jawaban.
Jeremy French

Jawaban:

2

Bermain-main dengan Tampilan sedikit sepertinya saya telah berhasil pendekatan. Namun, saya ingin membiarkan pertanyaan saya terbuka untuk jawaban lain dan solusi yang lebih baik.

<?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();
      ....
   }
}
?>

Kunci untuk mengeksekusi tampilan beberapa kali adalah bagi saya untuk membatalkan set ($ view) ketika saya selesai dengan set hasil.

Jeremy French
sumber
1

Saya mendapatkan jarak tempuh yang baik dari fungsi berikut. Nilai kembali adalah array dari semua catatan tampilan. Memanggil dsm ($ return_value) akan memberi Anda ide bagus tentang struktur tampilan khusus Anda.

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;
}
ikan theta
sumber
1

Berikut adalah fungsi pembantu yang sudah ada di dalam API Drupal. (Saya menghabiskan beberapa saat di sekitar Drupal Docs, dan akhirnya menemukannya. Tampaknya banyak yang lain juga telah menghasilkan solusi yang tidak menggunakan bantuan ini, dan juga bahwa bantuan ini melakukan satu langkah menarik yang tidak dimiliki solusi lain .. untuk memanggil pre_render pada objek $ view sebelum dijalankan).

Saya tidak bisa memastikan apakah itu bekerja dengan baik atau tidak, tapi setidaknya itu adalah tempat khusus untuk membahas masalah dengan pendekatan ini.

Untuk D6 http://api.drupal.org/api/views/views.module/function/views_get_view_result/6

Dan untuk D7 http://api.drupal.org/api/views/views.module/function/views_get_view_result/7

Christian Nally
sumber