您在這裡

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

drakeguan's 的頭像
drakeguan 在 2007-11-12 (週一) 11:11 發表

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

我在想,有什麼辦法可以一口氣,叫所有的 node 都執行過一次 op = '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

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

唔, 兩年後的我也來後見之明一下. 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 底下附上設定參考圖: