Apakah mungkin untuk secara dinamis mengatur pengaturan pager Views?


13

Katakan misalnya, Anda memiliki tampilan yang ditampilkan saat melihat jenis simpul tertentu, tetapi Anda ingin pengaturan pager berbeda untuk setiap node individu. Saya sedang berpikir untuk membuat bidang CCK seperti "pengaturan pager" dan kemudian memberinya opsi integer xy. Tapi saya tidak tahu apakah mungkin untuk secara dinamis menghubungkan bidang itu ke pengaturan Tampilan. Atau mungkin ada cara lain untuk melakukan ini?

Jawaban:


18

Kait pandangan yang ingin Anda gunakan adalah hook_views_pre_buildyang dipanggil sebelum kueri dibuat. Sekarang ini dengan asumsi Anda memiliki beberapa pengalaman pengembangan modul dasar dan bahwa Anda terbiasa dengan pandangan api.

Anda harus dapat melakukan:

/*
 * Implementation of hook_views_pre_build().
 */
function hook_views_pre_build(&$view) {

  // Make sure this is only for the specific view you want to modified
  if ($view->name == "foo_bar") {

    // Get the x-y value from where you're storing it (in your example the node object).
    $pager_count = get_count_for_this_node();

    // Lets also make sure that this is a number so we won't destroy our view.
    if (is_numeric($pager_count)) {

      // Now lets set the pager item to what ever out count is.
      $view->pager['items_per_page'] = $pager_count;
    }
  }
}

Di atas kami menggunakan hook pandangan yang dipanggil sebelum permintaan tampilan dibuat seperti itu pager dan segala sesuatu yang lain akan mencerminkan perubahan.

Peringatan: kait pandangan hanya boleh digunakan jika Anda mengerti apa yang sedang terjadi. Kode di atas ditulis untuk views-2.x.

Semoga ini membantu.


Luarbiasa, terimakasih. Saya belum memiliki pengalaman pengembangan modul, tetapi saya memulainya untuk beberapa hal yang ingin saya capai. Saya memiliki pemahaman yang baik tentang PHP, jadi saya bisa mengikuti apa yang terjadi pada kode yang Anda tempel di atas. Saya pikir ini sangat membantu saya. Terima kasih.
Jay

1
Untuk Views 3.x kode yang relevan harus diubah ke$view->items_per_page = $pager_count;
stevenw00

apakah mungkin untuk mengatur offset setiap halaman secara dinamis juga?
shekoufeh

2

Untuk Drupal 7, Hanya harus menulis yang berikut ini:

$view->items_per_page = $pager_count;

Dalam contoh:

/**
 * Implements hook_views_pre_build().
 */
function module_name_views_pre_build(&$view) {
  if ($view->name == "foo_bar" && $view->current_display == 'foo_display') {
    $pager_count = get_count_for_this_node();
    if (is_numeric($pager_count)) {
      $view->items_per_page = $pager_count;
    }
  }
}

Saya menggunakan contoh kode oleh @ericduran.


1

Anda harus menggunakan fungsi preproses tampilan

/*
 * Implementation of hook_views_pre_render().
 */
function MYMODULE_views_pre_render(&$view){
  // $view->name
  // $view->current_display
  // ...
  // look for other variables in $view object
}

"preprocess" adalah untuk tema dan pre_render sudah terlambat (permintaannya sudah dijalankan) - kait pre_build jauh lebih baik.
mojzis

1

Untuk memperbarui hasil tampilan dan pager di hook_views_pre_render, Anda dapat melakukan hal berikut:

<?php

/**
 * Implementation of hook_views_pre_render().
 */
function MODULENAME_views_pre_render(&$view) {
  if ($view->name == 'my_view' && $view->current_display == 'my_display') {
    // View result update logic.
    // e.g.
    // $result = array();
    // foreach ($view->result as $k => $row) {
    //   if (whatever is your condition) {
    //     $result[$k] = $row;
    //   }
    // }

    // Assuming $result has data as per your logic.
    // Update the pager according to result.
    $view->query->pager->total_items = count($result);
    $view->query->pager->update_page_info();
    // Add results to view.
    $view->result = $result;
  }
}

Ini seharusnya bekerja !! ;)


Luar biasa! Saya ingin membatasi jumlah item pada halaman tertentu tergantung pada item yang dikembalikan oleh permintaan. Akan memeriksa metode ini secepatnya.
Jens

Ini tidak bekerja. Baris yang Anda keluarkan tidak muncul di halaman berikutnya. Jadi, Anda berakhir dengan konten yang hilang. Perlu penyelidikan lebih lanjut.
Jens

0

Kode @tanmayk membantu saya. Dalam hook_views_pre_render ditambahkan hanya 2 baris kode ini

$view->query->pager->total_items = $nr;
$view->query->pager->update_page_info();

Tapi saya tidak perlu menambahkan hasilnya ke tampilan.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.