星期二, 1月 25, 2011

Drupal: Block 中放置一個 Views 的 node 連結

前不久處理了一個延宕一陣子的問題:原本的 block 「重要訊息」是手寫的,一陣子之後,重要訊息變了,又要再改一次。現在要把它改成 views,至於哪些 node 要放到這個重要訊息的 block 裡頭來,我預計要加一個 cck 欄位來決定。不過,目前暫時先用「置頂」這個欄位來決定。

這個簡單,使用 views 中建立一個 block 不是一件難事。可是,我碰到一個狀況:我要把一個由 views 所建立的 page (優惠項目),也放到這個 block 來。問題是:views 所做出來的 page 並沒有「置頂」這個欄位。即使後續要改成使用 cck 欄位來決定,views 所建立的 page 也沒有 cck 欄位可以使用。

想了一下,只有把 views 嵌入在一般的 content node 的 body 裡頭,然後利用這個 node 的置頂或是 cck 欄位,才能解決這個問題。稍微在 drupal.org 上找了一下,找到了以下這個方法。


將下列的 code 放到新的 node 的 body 裡頭 (editor filter 要設定為 php code)。

第 2 行 views_get_view() 中所放的參數是你的 views 的機器名稱。

1:  <?php
2:  $view = views_get_view('view_name');
3:  $view->init();
4:  $view->set_display('default');
5:  $view->set_arguments(array(arg(0),'2ndargument'));
6:  print $view->render();
7:  ?>



其中第 3 行是重點:我們要秀出 views 中的哪一個 display 呢?如果我們的需求是要秀另一個 display,如何知道在第 3 列這裡要放入什麼參數?

假如你有安裝 devel 模組的話,這是作為開發程式的協助模組,這事就好辦了。在上面的 code 中,插入一個 dsm() 的指令,來解讀 $views 的架構,並且從其中找到我們要使用在 set_display() 中的參數。這是在開發模組中常用的技巧,幫助我們了解相關變數的結構。其實,在寫一些小程式碼時 (例如我們現在正在做的這件事),用到的機會很多。插入 dsm() 後的程式碼如下:

1:  <?php
2:  $view = views_get_view('onsell');
3:  $view->init();
4:  dsm($view);
5:  $view->set_display('page_1');
6:  print $view->render();
7:  ?>


存檔後,重新秀出這個 node,你會在網頁頁面的前面上看到 krumo 的訊息,



點開這個變數架構,可以看到架構的細節。翻翻看,找一下 display 這個元素,把它展開,圖示如下:



接下來,就是拿 display 這裡所得到的,以我這個例子來說 (不同的 views 可能會得到不同的結果),它分別是 default, page_1, panel_pane_1,使用在 $view->set_display() 上,就好了。

不要忘了把剛剛加的 dsm() 拿掉或是註解掉。

好了,現在這個 node 裡嵌入一個 view。我們可以把這個 node 設為置頂,原本的重要訊息的 block,就可以順利把這個 node 秀出來了。

3 則留言:

  1. 底下這個方式應該更快...

    回覆刪除
  2. PHP Code 被鬼隱了~

    return views_embed_view('views_name', 'display_name', arg1, arg2...);

    回覆刪除
  3. @斜陽照

    是啊,我也是這麼寫。因為要寫成部落文,所以拆解成幾列。

    你講得對,應該在文章最後,再補上這個 API.

    謝謝你的補充

    Art

    回覆刪除

注意:只有此網誌的成員可以留言。