2008-07-07 views2.0-rc1

相信大家都知道Views, cck, OG 三大模組都推出了對應 Drupal6.x 的 RC(release candidate) 了

其實我一直找不到一個合理的原因轉到6, 主要因為很多重要的功能都不能只由 Drupal6 核心提供
Drupal6 只變成一個有完型多語言功能的部落格, 和一個CMS, 內容管理系統有一段距離
加上 Drupal7.x 的開發又加快了不少, 我一度擔心過 Drupal6.x 不會流行而直接跳到 Drupal7.x, 發生像 xoops 分成兩個版本的狀況.
但現在看來似乎是過於擔心了, 立即先看看Views2.0 的新功能吧!

安裝過Views2.0, 便立即發覺Views 的操作介面和1.x 的完全不同,
admin/build/views 的table變得更複雜, 但頂部多了非常實用的過濾功能.
這個過濾明顯針對大型網站有數十個views 的管理問題, 使維護更方便.

接著從"add" tab 開始發掘views2.0.
路徑admin/build/views/add 新增views, 會先看到一個views 的前置設定頁,
已經看到views tag 和 view type兩個佰生詞.
views tag 是一個views 的taxonomy, 給使用者自定義這個views 的種類,
但留意, 這裡只有一個tag, 例如輸"custom, frontpage",
這個views 便只有一個tag "custom, frontpage", 而不是一個 "custom", 一個"frontpage".
而view type 是指你要提取的資料的類型.
例如你需要一個角式的用戶列表, 選"user", 或者你需要nodes, 選"node"(廢話)

按了next 以後, 便看到設定的主頁面了.
修改views 的頁面由從前的基本的form 變成一個應用程序介面.
設定頁分成四列, 有點像panels 2.0 的設定頁. 其中的filters, arguments, fields, sort 等都在1.x 中見過, 反而是最左面的一列功能比較生.
最左面defaults tab, 下方有一個下拉式選單(預設為page)和一個 "add display"按鈕, 下方還有一個"analyze".
只要選page, 按add display, 最左面的一列便會多了一個tab, 而也因為這個tab, views 就提供一個url 頁面了(和以前的page 一樣).

你也可以在這個下拉選單中找到block, feed, attachment, 代表views 輸出的方法.
而和以前最大的不同是, 一個view 可以有兩個page, 但又分別輸出不同的內容.
舉個例子, 一個page 輸出最新的book node, 一個page輸出最新story node, 因為他們很多功能上的相似, 你便可以命名這view 為"recent",將共同的設定輸入default,
而衍生的兩個page 輸出便會預設承繼default 的全部參數, 最後只各自修改他們之間的不同之處便可以了.
從另一個方向表達, 這就提供了群組功能了.
另一個應用可以是, 將首頁用到blocks 都放到同一個views, 命名為 frontpage, 便可以更方便管理首頁blocks 了.


其他的設定選項使用上雖然不同, 但概念上很相似
只要熟悉了介面, 便會發覺這個使用了AHAH 的設定頁面比 1.x 的方便很多, 省下不少開發時的pageload 時間.
但因為有了default 設定, 設定和default 不相同的時候記得使用"override" 選項,
否則便會影響了這一個views 內的其他page, block了.

rc1 的試用先到這裡, 待rc2, 正式版釋出就為大家測試測試.

AttachmentSize
Image icon views2-1.png8.32 KB
Image icon views2-2.png6.67 KB

[inmediahk] use of views argument: 作者最新文章

這也是一個少見的要求,
但也相當合理
便是要在node 頁面(node/[nid])的右面欄加一個block, 用作顯示這個node 作者的其他文章
一個多用戶參與寫作的網站便很需要用這些block 來列表特定用戶的文章

這個當然不可能給每一個用戶都做一個views
用戶數是有三萬以上的...
正解也簡單, 始終是views

我想views 的 argument 一開始的理念就是由這類的網站需求帶動的
由url 路徑作參考, 修改views 的過濾器
但這次的url 是node/[nid], 並沒有uid 的資料, 所以還是要花點功夫在php 上
在argument type, 以 user UID is author
然後我們就可以想辦法將uid 傳給views
我們只有NID 可以使用,
便唯有將整個node 用node_load()
再從中抽出UID

argument handling code

if ($view->build_type == 'block' && arg(0) == 'node' && is_numeric(arg(1))) {
  $node=node_load(arg(1));
  $args[0] = $node->uid;
}
return $args;

[inmediahk]全站RSS, 包括 views, nodes.....

全站所有頁面的RSS 其實並不是什麼特別的功能,
views 使用 argument RSS, display all values 已經可以提供該views 的RSS 了
只細心設定, 全站RSS 只是小事一樁
但這對一個新聞性, 互動性高的網站應該很重要吧

但我在檢查RSS 的時候,
發覺node 頁面是不提供RSS 的
即是說, 大家不可以使用RSS 的方式訂閱node 的留言, 回應
所以便使用了comment RSS 模組了
順利提供一個node 的comment 的RSS

[inmediahk] block 標題使用html, 特別的 'more' 連結

大家可能經常遇到一個問題, 就是想使用一個帶有html 的block title
我也看見過其他人在論壇上討論過, 得出使用一個module 的解答

但便用了另一個方法, 給大家參考
因為這次要將首頁右邊的一些block 的title 連到一些頁面
而它們都是使用views 的
很自然便使用views 的"標題" 功能, html 輸出
但我發覺一個小妙用
就是將標題用 包起, 放在在views 的 block header 中, 選用full html
這樣就連CSS 都不用改, 原生已經變成block title 使用的樣式了

還有一點要留意, 用這個方法的話,
empty text 是不會輸出title 的
所以, empty text 也要使用 加標題

這個方法的還有一個延伸應用
就是block 底的 "more" 連結
同樣, views 的footer 使用 便可以使用任何自定義的連結
而獨立媒體的行動日誌便是使用了這個方法
令一個views 的block 連到另一個 views 的頁面的

[inmediahk] content type 自動 taxonomy link

要實現的功能是 "自動放一個內容類型連結"
例如一個"專欄文章"的node, 便放一個連結到頁尾, 可以連結到"專欄文章列表"
"站外連結"node 便連到"站外連結列表"
難度在於"自動"的一部份
因為taxonomy 是用戶選的
連內建的forum 也需要用戶選擇正確的分類
所以連結不難, 但"自動化"便難

原本打算使用taxonomy, 再自己hack 一下form api, 讓它自動成為某一taxonomy
但後來用了一個更好, 更方便, 但沒有那麼直觀的方法
便是用views 的argument, 配合themes

首先在node.tpl.php內, 找出node 的type
但 $node->type 只有一個machine readable 的類型名字
連node_load() 也只有 一個英文的類型名字
番了api, node_get_types('name',$node) 才是正確得出內容類型名字的函數

而連結的地址是一個views (content_type/[node-type])
例如"專欄文章"便連到content_type/column
"站外連結"便是content_type/external_links
[node-type] 可以用 $node->type 找到
先建立一個views頁面, url 為 content_type
再在views 的 argument 內加上Node type
而其他的顯示設定和一般的taxonomy
便得到一個"偽"taxonomy link 了

又一次見證views 的強大
這個方法雖然沒有原生一個taxonomy
但同樣做到taxonomy 做的東西

Pages

Google