Drupal 6 视图 2:设置日期参数

Posted

技术标签:

【中文标题】Drupal 6 视图 2:设置日期参数【英文标题】:Drupal 6 Views 2: Setting Date Arguments 【发布时间】:2009-08-19 16:36:24 【问题描述】:

将 uid 作为参数传递可以很好地使用此代码:

$bouts = views_get_view_result('Results', 'page_1', array($user->uid));

views_get_view_result 中设置参数的关键行是:

$view->set_arguments($args);

但是通过日期范围呢?

另外,如果某些东西被指定为视图上的过滤器,有没有办法以编程方式改变它?

views_get_view_result:

/**
* Investigate the result of a view.
* from Drupal.org. 
*
* @param string $viewname
*      The name of the view to retrieve the data from.
* @param string $display_id
*      The display id. On the edit page for the view in question, you'll find
*      a list of displays at the left side of the control area. "Defaults"
*      will be at the top of that list. Hover your cursor over the name of the
*      display you want to use. A URL will appear in the status bar of your
*      browser. This is usually at the bottom of the window, in the chrome.
*      Everything after #views-tab- is the display ID, e.g. page_1.
* @param array $args
*      Array of arguments. (no keys, just args)
* @return
*      array
*          An array containing an object for each view item.
*      string
*          If the view is not found a message is returned.
*/
function views_get_view_result($viewname, $display_id = NULL, $args = NULL) 
  $view = views_get_view($viewname);
  if (is_object($view)) 
    if (is_array($args)) 
      $view->set_arguments($args);
    
    if (is_string($display_id)) 
      $view->set_display($display_id);
    
    else 
      $view->init_display();
    
    $view->pre_execute();
    $view->execute();
/*  print "<pre> $viewname: $display_id";
    print_r(get_class_methods($view));  */
    return $view->result;
  
  else 
    return t('View %viewname not found.', array('%viewname' => $viewname));
  

【问题讨论】:

AFAIK 视图模块中没有 views_get_view_result() 函数 - 你自己声明了吗?如果是这样,您应该添加它的定义以允许答案。 你已经创建了这么多的 Drupal 问题。您应该将所有内容合二为一。 【参考方案1】:

至于传递数据范围和给定发布的函数定义,只有当视图接受它们作为参数时,您才能将日期范围传递给它。我不是 100% 确定,但是 afaik 日期范围只能定义为过滤器,而不是参数,这会导致您的第二个问题:

考虑到相当复杂的视图对象/数组混搭结构,以编程方式更改视图过滤器设置是可能的,但有点混乱。在您上面发布的函数中,第一行是

$view = views_get_view($viewname);

之后,$view 包含整个视图对象。过滤器设置是按显示器定义的,因此假设您有一个只有默认显示器的视图,您将在

下找到过滤器设置
$view->display['default']->display_options['filters']

(注意对象/数组符号组合 - 显示是类型为 views_display 的包含对象)

“过滤器”数组每个过滤器包含一个条目,根据过滤器类型具有不同的元素。出于您的目的,我建议使用您感兴趣的过滤器创建一个虚拟视图,并使用预配置/硬编码的值。使用调试器(或var_dump/print_r),您可以在视图创建后查看过滤器数组。根据您在那里找到的内容,您应该能够推断出如何注入您的自定义日期范围。


免责声明:像这样在视图中四处寻找有点烦人,而且效果不佳,但它确实有效。到目前为止,我还没有找到一个简明的 Views2 文档,可以直接解释内部结构,因为我发现 official API documentation 在代码使用方面有点缺乏。 (当然这很可能只是我太笨了;)

【讨论】:

【参考方案2】:

如果您使用视图 2,则可以使用 GUI 添加日期参数。然后在url中,可以放:

www.yousite.com/yourview/startDate--finishDate

对于 startDate/finishDate,格式为 YYYY-MM-DD-HH。

GL!

【讨论】:

以上是关于Drupal 6 视图 2:设置日期参数的主要内容,如果未能解决你的问题,请参考以下文章

Drupal 7:如果日期字段具有结束日期,则过滤视图

无法以编程方式在视图 Drupal 7 中为日期设置公开过滤器

Drupal:使用参数的动态视图

Drupal 6 视图 2:PHP 片段

drupal 多视图参数与空参数的 PHP 代码验证

如何在 Drupal 6 的视图中显示完整节点?