it-swarm-id.com

Apakah mungkin untuk secara dinamis mengatur pengaturan pager Views?

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 memberikannya opsi integer x-y. Tapi saya tidak tahu apakah mungkin untuk secara dinamis menghubungkan bidang itu ke pengaturan Tampilan. Atau mungkin ada cara lain untuk melakukan ini?

13
Jay

Kait pandangan yang ingin Anda gunakan adalah hook_views_pre_build yang 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.

18
ericduran

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.

2
heilop

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

1
tanmayk

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
}
1
dobeerman

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.

0
adevms