2009-12-02 45 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; 
    } 
?>