有什麼辦法大量對所有的 node 做一次 'update' 的方法嗎?

最近我在使用一個叫 Computed Field 的 CCK 模組,我用它從 node 裏頭取出 裏的 src url 加以使用。一切都很美好,除了這個欄位必須在新增一個 node 或更新一個 node 時,裏頭的 scripts 才會執行以外…

我在想,有什麼辦法可以一口氣,叫所有的 node 都執行過一次 op = 'update' 的方法嗎?

nobody1225 的照片

Re: 有什麼辦法大量對所有的 node 做一次 'update' 的方法嗎?

請問 Computed Field 做什麼用的阿
完全沒用過
可否麻煩您教學一下呢
謝謝您了

DrakeGuan 的照片

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

nobody1225 的照片

Re: 有什麼辦法大量對所有的 node 做一次 'update' 的方法嗎?

哇,這麼好用阿
唉,我英文太差了
謝謝您了

如果寫模組介紹那 drupal 肯定會在台灣發光 (現在好像是xoops,雖然我沒用過)

jimmy 的照片

Re: 有什麼辦法大量對所有的 node 做一次 'update' 的方法嗎?

我有在issues裡頭patch過一個cron來做update...
http://drupal.org/node/87546

--
from open mind to open source~

DrakeGuan 的照片

Re: 有什麼辦法大量對所有的 node 做一次 'update' 的方法嗎?

真有趣的作法。

我昨晚突然想說,就自己硬做好了。
於是直接在一個 block 裏頭寫 php 來處理 database…整個就是很暴力的方法,哈。

tokimeki 的照片

Re: 有什麼辦法大量對所有的 node 做一次 'update' 的方法嗎?

請教一下,上面舉的例子中,這種計算欄位是每次資料篩選出來都會計算,還是只有在資料寫進資料庫時才計算?
我的意思是,假設相關的欄位內容變更後,該計算欄位的內容也會即時的變更嗎?
例如說,以上述例子來看,如果我更改單價的數字,總和欄位也會變更嗎?

DrakeGuan 的照片

Re: 有什麼辦法大量對所有的 node 做一次 'update' 的方法嗎?

端看你是否有勾選「Store using the database」。有勾選的話,那就只有在新增或修改 node 時,這個欄位裏的 php 才會被執行;沒有勾選的話,則是每次都會執行。很顯然地,就效率與安全性來說,前者的作法是比較好的。

tokimeki 的照片

Re: 有什麼辦法大量對所有的 node 做一次 'update' 的方法嗎?

多謝指教~
不過我這裡還有一個問題,如果不勾選「Store using the database」,在 Views 裡面的 Arguments 便不會出現該欄位。
我需要對該欄位作 Group Count 的動作,如果能用 Arguments 就簡單很多...
不知道有沒有什麼好方法?

DrakeGuan 的照片

Re: 有什麼辦法大量對所有的 node 做一次 'update' 的方法嗎?

這我就不曉得了
Views 的 Arguments 會轉換成 SQL expression 的一部分
所以如果不勾選「Store using the database」的話,就沒輒啦
可以去查一下,說不定也有給 Views 用的 computed sql :)