放入块中或使用views_get_view时,随机缓存视图的顺序不同

Posted

技术标签:

【中文标题】放入块中或使用views_get_view时,随机缓存视图的顺序不同【英文标题】:Order of random cached view different when out put in a block or with views_get_view 【发布时间】:2012-02-13 12:18:50 【问题描述】:

我有一个随机缓存视图,我需要在不显示它的情况下访问其中的元素,才能将订单放入会话中以使某些下一个/上一个按钮起作用。

当我使用views_get_view 输出视图时,我得到的结果与实际显示完全不同。有什么想法吗?

 $view = views_get_view('hotels_view');
  $view->set_display('block'); 
  $view->render();
  print sizeof($view->result);
  $counter = 0;
  foreach ($view->result as $result) 
    echo 'Result: ' . $result->nid . ' -- ' . url( 'node/' . $result->nid, array('alias' => FALSE)).'<br />';
    $counter++;
    //$_SESSION['hotels_listing'][$counter] = url( 'node/' . $result->nid, array('alias' => FALSE));
 

【问题讨论】:

澄清问题:当您说“随机缓存”时,您的意思是视图结果的随机排序顺序,然后在缓存生命周期内保持不变? 抱歉这些零碎的问题,但我忘了问:您使用的是哪个 Drupal 和 Views 版本? 【参考方案1】:

我没有在本地测试过,所以只是一些猜测:

首先,我不确定这是否从 D6 更改为 D7,但 IIRC,显示 ID 总是附有一个数字,所以我预计需要使用“block_1”而不是“block”。

进一步,查看render() 函数,它期望显示ID 作为参数。如果我正确阅读代码,它将不会检查通过$view-&gt;set_display() 设置的id,因此这可能会导致使用不同的(即默认)显示,这将导致使用不同的缓存结果。

所以你可以像这样再试一次:

 $view = views_get_view('hotels_view');
  $view->render('block_1');
  print sizeof($view->result);
  $counter = 0;
  foreach ($view->result as $result) 
    echo 'Result: ' . $result->nid . ' -- ' . url( 'node/' . $result->nid, array('alias' => FALSE)).'<br />';
    $counter++;
    //$_SESSION['hotels_listing'][$counter] = url( 'node/' . $result->nid, array('alias' => FALSE));
 

如果可行,您可能还希望通过省略渲染来节省一些处理时间,因为您只对查询结果顺序感兴趣,而不是实际输出:

 $view = views_get_view('hotels_view');
  $view->execute('block_1');
  [...]

【讨论】:

以上是关于放入块中或使用views_get_view时,随机缓存视图的顺序不同的主要内容,如果未能解决你的问题,请参考以下文章

在 Drupal 中使用 views_get_view 时的查询字符串问题

在 drupal 7 中,views_get_view('VIEWNAME') 出现错误?

在 Django 中将一个块放入另一个块中

如何将 ext.* 变量放入 build.gradle.kts 中的插件块中

如何在matlab功能块中的特定列中添加随机数?

有3个小球和两只杯子,将小球随机放入杯中,设X为有小球的杯子数,求X的概率分布?