2009-12-02 59 views

回答

6

你也许可以做到这一点无论是通过一个主题或模块实现preprocess_page的(THEMENAME_preprocess_page(& $瓦尔)或MODULENAME_preprocess_page(& $瓦尔)),但高于Mac是在观点正确不知道是空的或不直到他们运行,所以会有性能问题。

在函数,你应该能够访问结构化的主要环节阵列,这样你就可以运行该视图:

$view = views_get_view('view_name'); 
// Swap out 'default' for a different display as needed. Also, $args are arguments, and can be left out if not applicable. 
$output = $view->preview('default', $args); 
if (empty($view->result)) { 
    // The view has no results, alter the primary links here to remove the link in question. 
} 
+2

+1,但有一个附加说法:'$ view-> preview'不仅构建视图,而且还呈现它,这是不必要的开销。 '$ view-> execute'也会填充结果属性,但是会节省额外的处理时间来处理它(它只是构建并运行查询)。 – 2009-12-03 14:01:37

+0

有用的代码 - 谢谢:) – MrFidge 2010-12-15 12:01:20

2

我已经准备好了相互矛盾的任何时刻,因为我从来没有实现过类似的事情,但我的印象是,既然意见基本上是对查询的数据库,你不能真正知道,如果一个视图是空的,直到你实际上调用它。

考虑到 - 考虑到您正在谈论主链接(几乎显示在您网站的每个页面上),这可能会造成严重的性能下降,具体取决于视图的复杂性和“缓存性”。

您还应该考虑是否其他用户可以在“我们”用户同时浏览网站时更改该视图的内容:如果视图在“我们”用户加载页面后填充,“我们“用户永远不会知道。

至于如何要达到你想要的,请看看接受的答案。

HTH!

+1

使用由于菜单被缓存,hook_menu_alter不会跟上视图的动态特性。例如,如果在构建菜单路由器时视图没有结果,那么menu_alter的实现将不会添加该项目。然后,如果视图突然开始返回结果,那么直到重建菜单才会将​​该项目添加到菜单中。 – jhedstrom 2009-12-03 01:42:20

+0

用于指向性能命中的 – dusan 2009-12-03 12:44:02

+0

@jhedstrom - 关于缓存的好处!我很高兴“随时准备好与之相矛盾”!我编辑了原始文章并插入了一行指向您的答案,以便将来的读者不会感到困惑。 – mac 2009-12-03 12:52:34

0

我重写views_embed_view()只有当有内容提供输出,然后叫我重写从主题层:

function mymodule_embed_view($name, $display_id = 'default') { 
    // handle any add'l args (this hook supports optional params) 
    $args = func_get_args(); 
    array_shift($args); 
    if (count($args)) { 
    array_shift($args); 
    } 
    $view = views_get_view($name); 
    $output = $view->preview($display,$args); 
    if ($view->result) { 
    return $output; 
    } 
} 

然后在模板文件:

<?php 
    $view = mymodule_embed_view('view_name');   
    if (strlen($view) > 0) { 
    print $view; 
    } 
?>