Double field 雙值欄位終於出現!

前些日子在@drupal_modules的推文中看到一個新模組,Double field,當下眼睛一亮,內心吶喊:「終於出現了!」laugh

Double field是個CCK擴充欄位模組,如它的名稱所示,其功能是用來在一個欄位中同時儲存兩個文字或數值內容。相較於其他五花八門的CCK欄位模組,Double field好像沒啥了不起的。畢竟像Location就可以一次儲存多種內容,像街道名稱、國家、經緯度等;或者像Date模組可以一次儲存年月日和時間等等內容。一次可以儲存兩個文字或數值內容的功能,有什麼好令人興奮的地方呢?

這就要話說從頭了。

之前有做一個WRN西洋羅曼史讀書會的網站,主題之一是蒐集各種翻譯羅曼史書籍的資料,在網路上提供一個資料庫給嗜讀者。除了書目與作者資料之外,這個社群還會蒐集每年的羅曼史百大排行榜,公佈給大家參考。所以每年她們都會製作一個node,然後把辛苦蒐集來的資料貼到內文中發佈。這其中會包括每本書的當年排名與去年排名等資料。由於我看這工程還蠻累人的,就想說乾脆建立一個CCK欄位去處理這個「年份-排名」的資料需求,理想中最好可以用Views分別按照年份或排名去過濾出不同的資料排序。比方說可以直接看到某年份的百大排行,也可以同時依排名看到不同年份的書籍變化等等。

定了這個計劃之後,從來不寫code的我就開始去尋找可用的模組。理想中的模組當然就是可以同時紀錄兩個序對資料(order pair data)的CCK欄位囉,因為這樣才方便把所有資料集中在書目這個內容類型裡頭。可是沒想到,這麼想當然爾的簡單需求,居然從來沒有人為此寫過模組。大概社群好像很習慣「一個欄位處理一種資料」這件事,沒想過另類的作法。而如果一個內容類型需要同時關聯兩種不同種類的資料,正規的作法都會用node reference去處理。所以可能的作法是,另外建立一個「排名年份」的內容類型,在裡頭插兩個數值欄位用來儲存年份和排名資料,然後再插個node reference去關聯到書目類型。不過這種作法的缺點就是,你得一一先建立「排名年份」的node。如果數目少那還好,但百大排行可是要求你要建立100個node!沒事也不用這樣折磨自己吧!

為了看看社群中有沒有其他解法,我到官網討論區發文請求協助:CCK field for vote and annual-ranking。在討論串中,有好心的網友推薦一些作法,不過都不適合我的想法。撈了老半天,找到,conditional_field模組,似乎可以用條件性欄位組合的方式來實現。不過後來發現它的條件欄位都是得寫死的,這對「百大排名」不是難事,反正就1到100這樣的內容而已。不過對於「年份」這種會自然增加的內容,就不適合了。後來又找到了attribute field模組,算是非常接近需求的一個解決方案。然而,最主要的麻煩在於,它沒法和Views整合,所以即便可以自訂兩個輸入內容,也只能在node中顯示,無法用來篩選資料。為此我還利用triDUG meetup的機會向地方社群徵詢,而高手的回答是一個斬釘截鐵的"No, it is impossible for CCK field to do that..."。處處碰壁的情況下,當時就放棄了這個想法,讓WRN的管理員們繼續苦勞下去。

沒想到才過兩、三個月,Drupal7才沒出來多久,Double field就出現了,一個完全符合需求的模組!現在還在dev開發版,不過我已經立馬安裝試用,證實就是我要的模組。Double field主要是可以同時填入一對文字內容,而每個文字內容可以有各自的前綴與後綴詞,也就是可以自動顯示成「2007排名第1」這樣。同時可以分別以不同組別在views中過濾與排序內容。

一切都這麼美好,世界和平的夢想終於實現。不過,唯一也是最重要的問題就是,Double field只有7.x的版本!所以,唉,模組無限好,只是版本不合啊!看還要等未來好一陣子才能用到這個模組了...。blush

 

Area: 

回應

兄台有写这些长篇大论的时间, 可以做出一个模组了...

頁面