最近我在使用一個叫 Computed Field 的 CCK 模組,我用它從 node 裏頭取出 裏的 src url 加以使用。一切都很美好,除了這個欄位必須在新增一個 node 或更新一個 node 時,裏頭的 scripts 才會執行以外…
我在想,有什麼辦法可以一口氣,叫所有的 node 都執行過一次 op = 'update' 的方法嗎?
最近我在使用一個叫 Computed Field 的 CCK 模組,我用它從 node 裏頭取出 裏的 src url 加以使用。一切都很美好,除了這個欄位必須在新增一個 node 或更新一個 node 時,裏頭的 scripts 才會執行以外…
我在想,有什麼辦法可以一口氣,叫所有的 node 都執行過一次 op = 'update' 的方法嗎?
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 :)
Re: 有什麼辦法大量對所有的 node 做一次 ...
唔, 兩年後的我也來後見之明一下. tokimeki大肯定早就知道原因了, 我借花獻佛寫給以後的d友們參考.. :P
1 「Store using the database」勾選與否, 會直接影響到相關資料表欄位的變動.
2 假設有個 content type 叫做 my_profile, 在其底下建了一個 CCK 的 computed field 叫做 field_age:
2.1 在 field_age 的設定當中, 若勾選「Store using the database」後儲存設定:
2.1.1 則資料庫的 content_type_my_profile 這個 table 裏, 會增加一個 field_age_value 的欄位.
2.2 在 field_age 的設定當中, 若取消勾選「Store using the database」後儲存設定:
2.2.1 則資料庫的 content_type_my_profile 這個 table 裏, field_age_value 欄位會被刪掉(若存在的話).
2.3 這應該就是影響到 views 抓不抓得到這個 computed field 欄位的原因.
2.4 底下附上設定參考圖: