是否可以动态设置Views的寻呼机设置?


13

例如,您有一个视图,在查看某个节点类型时会显示该视图,但您希望每个单独节点的寻呼机设置都不同。我当时想制作一个像“ pager setting”这样的CCK字段,然后给它一个xy的整数选项。但是我不知道是否有可能以某种方式将那个字段动态地插入到视图的设置中。还是有另一种方法可以做到这一点?

Answers:


18

您要使用的视图挂钩hook_views_pre_build是在构建查询之前调用的。现在,这是假设您具有一些基本的模块开发经验,并且您熟悉Views api。

您应该能够:

/*
 * 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;
    }
  }
}

在上面,我们使用了一个视图挂钩,该挂钩在构建视图查询之前被调用,这样分页器和其他所有内容都会反映出更改。

提醒您:仅当您了解发生了什么情况时,才应使用views hooks。上面的代码是为views-2.x编写的。

希望这可以帮助。


太棒了,谢谢你。我还没有任何模块开发经验,但是我正在开始做我想完成的几件事。我确实对PHP有一定的了解,因此我可以按照上面粘贴的代码块中的内容进行操作。我认为这对我有很大帮助。谢谢。
杰伊

1
对于Views 3.x,相关代码应更改为$view->items_per_page = $pager_count;
stevenw00 2014年

是否也可以动态设置每页的偏移量?
shekoufeh

2

对于Drupal 7,仅应编写以下内容:

$view->items_per_page = $pager_count;

在示例中:

/**
 * 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;
    }
  }
}

我使用@ericduran的代码示例。


1

您应该使用视图预处理功能

/*
 * 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”用于主题设置,而pre_render为时已晚(他的查询已全部运行)-pre_build挂钩要好得多。
mojzis

1

要在hook_views_pre_render中更新视图结果和寻呼机,您可以执行以下操作:

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

这应该工作!!;)


优秀!我想根据查询返回的项目来限制给定页面上的项目数。将尽快检查此方法。
詹斯(Jens)

它不完全起作用。您排出的行不会在下一页上出现。因此,您最终会丢失内容。需要更多调查。
詹斯(Jens)

0

@tanmayk的代码对我有用。在hook_views_pre_render中仅添加了这两行代码

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

但是我不需要将结果添加到视图中。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.