最近我在使用一個叫 Computed Field 的 CCK 模組,我用它從 node 裏頭取出 裏的 src url 加以使用。一切都很美好,除了這個欄位必須在新增一個 node 或更新一個 node 時,裏頭的 scripts 才會執行以外…
我在想,有什麼辦法可以一口氣,叫所有的 node 都執行過一次 op = 'update' 的方法嗎?
請問 Computed Field 做什麼用的阿 完全沒用過 可否麻煩您教學一下呢 謝謝您了
一句話帶過的話,Computed Field 是個非常原始,需要懂得怎麼寫 php 與存取 drupal 資料的方式,才能發揮功能的「瑞士萬用刀」。
例子1:你有一個 node,裏頭有 2 個 cck field,分別是單價(price)與數量(number)。現在,你可以新增一個 computed field 叫總合(sum),它的內容是 price * number。
例子2(官方例子):你有個 node 是用來記錄每個人的資料的,其中有一個欄位叫出生年月日(birthday)。現在,你可以新增一個 computed field 叫年紀(age),它會自動幫每個人算出年齡。公式可能如下:
$birthday_date = date_make_date($node->field__[0]['value']); $birthday = $birthday_date->db->parts;
//compute age $bdayunix = mktime("", "", "", $birthday['mon'], $birthday['mday'], $birthday['year']); $nowunix = time(); $unixage = $nowunix - $bdayunix; $age = floor($unixage/ (365 * 24 * 60 * 60));
$node_field[0]['value'] = $age;
大致來說,當你發覺找不到合用的 cck field 時,然後你需要的欄位,需要一些計算,那就可以用這一把「瑞士萬用刀」了。
PS. 我突然覺得,應該寫篇「模組介紹」的? 算了 :p
哇,這麼好用阿 唉,我英文太差了 謝謝您了
如果寫模組介紹那 drupal 肯定會在台灣發光 (現在好像是xoops,雖然我沒用過)
我有在issues裡頭patch過一個cron來做update... http://drupal.org/node/87546
-- from open mind to open source~
真有趣的作法。
我昨晚突然想說,就自己硬做好了。 於是直接在一個 block 裏頭寫 php 來處理 database…整個就是很暴力的方法,哈。
請教一下,上面舉的例子中,這種計算欄位是每次資料篩選出來都會計算,還是只有在資料寫進資料庫時才計算? 我的意思是,假設相關的欄位內容變更後,該計算欄位的內容也會即時的變更嗎? 例如說,以上述例子來看,如果我更改單價的數字,總和欄位也會變更嗎?
端看你是否有勾選「Store using the database」。有勾選的話,那就只有在新增或修改 node 時,這個欄位裏的 php 才會被執行;沒有勾選的話,則是每次都會執行。很顯然地,就效率與安全性來說,前者的作法是比較好的。
多謝指教~ 不過我這裡還有一個問題,如果不勾選「Store using the database」,在 Views 裡面的 Arguments 便不會出現該欄位。 我需要對該欄位作 Group Count 的動作,如果能用 Arguments 就簡單很多... 不知道有沒有什麼好方法?
這我就不曉得了 Views 的 Arguments 會轉換成 SQL expression 的一部分 所以如果不勾選「Store using the database」的話,就沒輒啦 可以去查一下,說不定也有給 Views 用的 computed sql :)
Re: 有什麼辦法大量對所有的 node 做一次 'update' 的方法嗎?
請問 Computed Field 做什麼用的阿
完全沒用過
可否麻煩您教學一下呢
謝謝您了
Re: 有什麼辦法大量對所有的 node 做一次 'update' 的方法嗎?
一句話帶過的話,Computed Field 是個非常原始,需要懂得怎麼寫 php 與存取 drupal 資料的方式,才能發揮功能的「瑞士萬用刀」。
例子1:你有一個 node,裏頭有 2 個 cck field,分別是單價(price)與數量(number)。現在,你可以新增一個 computed field 叫總合(sum),它的內容是 price * number。
例子2(官方例子):你有個 node 是用來記錄每個人的資料的,其中有一個欄位叫出生年月日(birthday)。現在,你可以新增一個 computed field 叫年紀(age),它會自動幫每個人算出年齡。公式可能如下:
$birthday_date = date_make_date($node->field__[0]['value']);
$birthday = $birthday_date->db->parts;
//compute age
$bdayunix = mktime("", "", "", $birthday['mon'], $birthday['mday'],
$birthday['year']);
$nowunix = time();
$unixage = $nowunix - $bdayunix;
$age = floor($unixage/ (365 * 24 * 60 * 60));
$node_field[0]['value'] = $age;
大致來說,當你發覺找不到合用的 cck field 時,然後你需要的欄位,需要一些計算,那就可以用這一把「瑞士萬用刀」了。
PS. 我突然覺得,應該寫篇「模組介紹」的? 算了 :p
Re: 有什麼辦法大量對所有的 node 做一次 'update' 的方法嗎?
哇,這麼好用阿
唉,我英文太差了
謝謝您了
如果寫模組介紹那 drupal 肯定會在台灣發光 (現在好像是xoops,雖然我沒用過)
Re: 有什麼辦法大量對所有的 node 做一次 'update' 的方法嗎?
我有在issues裡頭patch過一個cron來做update...
http://drupal.org/node/87546
--
from open mind to open source~
Re: 有什麼辦法大量對所有的 node 做一次 'update' 的方法嗎?
真有趣的作法。
我昨晚突然想說,就自己硬做好了。
於是直接在一個 block 裏頭寫 php 來處理 database…整個就是很暴力的方法,哈。
Re: 有什麼辦法大量對所有的 node 做一次 'update' 的方法嗎?
請教一下,上面舉的例子中,這種計算欄位是每次資料篩選出來都會計算,還是只有在資料寫進資料庫時才計算?
我的意思是,假設相關的欄位內容變更後,該計算欄位的內容也會即時的變更嗎?
例如說,以上述例子來看,如果我更改單價的數字,總和欄位也會變更嗎?
Re: 有什麼辦法大量對所有的 node 做一次 'update' 的方法嗎?
端看你是否有勾選「Store using the database」。有勾選的話,那就只有在新增或修改 node 時,這個欄位裏的 php 才會被執行;沒有勾選的話,則是每次都會執行。很顯然地,就效率與安全性來說,前者的作法是比較好的。
Re: 有什麼辦法大量對所有的 node 做一次 'update' 的方法嗎?
多謝指教~
不過我這裡還有一個問題,如果不勾選「Store using the database」,在 Views 裡面的 Arguments 便不會出現該欄位。
我需要對該欄位作 Group Count 的動作,如果能用 Arguments 就簡單很多...
不知道有沒有什麼好方法?
Re: 有什麼辦法大量對所有的 node 做一次 'update' 的方法嗎?
這我就不曉得了
Views 的 Arguments 會轉換成 SQL expression 的一部分
所以如果不勾選「Store using the database」的話,就沒輒啦
可以去查一下,說不定也有給 Views 用的 computed sql :)