您在這裡

CCK 使用 Rules 修改另一個 node 的 CCK 欄位

dennys's 的頭像
dennys 在 2010-08-04 (三) 23:23 發表

需求是這樣的, 有兩個 node A, node B, 各有一些 cck 欄位 (integer), 然後其中 node B 有 cck node reference 連結到 node A. 是否有辦法在一個 node B 被修改(或產生) 之後, 把 node B 某個 CCK integer 的值加總到 node A 的 CCK ?

查了一下, 應該是可以用 Rules 來偵測 node 被產生或修改, 但是如何 trigger 後續的 update? SQL 是寫的出來, 還是說直接把 Rules 的 action 設定成一個 SQL command?

Rule設定假想:

Event:
After updating existing content and After saving new content (可能需要做兩個rules)

Do:
1.Load a reference node : 選reference到node A那個欄位名稱
2.Populate a field:選referenced node,然後用php寫(不要包含<?php這些東西)
<?php
$sum = $referenced_node->field_xxx[0]['value'] + $node->field_xxx[0]['value'];
return array(
0 => array($sum),
);
?>

請問在 Arguments configuration 裡面的 Content containing the node reference field: 設定的東西用途為何啊?
我做了兩個 action

1.Load a reference node

  1. Content containing the node reference field: 我選 referenced content
  2. 欄位的部份我選 node B 連到 node A 的那個 CCK (node reference) 欄位名稱

2.Populate a field

  1. Arguments configuration 選 referenced node, 然後欄位選擇 node A 要被修改的那個 CCK 欄位 <== 這樣對嗎?
  2. 這裡奇怪的是, 在上一步驟按了 Next 之後, 會再問一次 Arguments configuration 是什麼, 而且預設值變回 updated content. 然後不再選擇欄位, 而是要直接填值, 或是寫程式在 Advanced: Specify the fields value with PHP code.
    • 我覺得這裡的 UI 設計怪怪的
    • 這裡的欄位輸入的值不知道用在哪裡?
  3. 然後用php寫上面的程式如下:

$sum = $referenced_node->field_net_value[0]['value'] + $node->field_amount[0]['value'];
return array(
0 => array($sum),
);

field_net_value 是 node A 的欄位, field_amount 是 node B 的欄位.

執行結果如下, 看來兩個 action 都有執行到, 但卻什麼都沒改到.
0 ms "After updating existing content" has been invoked.
0.125 ms Executing the rule "test" on rule set "After updating existing content"
0.313 ms Action execution: "Load a referenced node"
4.711 ms Successfully added the new variable "Referenced content"
5.127 ms Action execution: "Populate Referenced content's field 'field_amount'"
5.347 ms Evaluation of "After updating existing content" has been finished.

1.Content containing the node reference field是說「要讀取的node reference欄位是在哪個node」,
所以其實應該要選「updated content」,也就是node B,然後再選node B裡面指定node A的那個欄位名稱。
這樣才有辦法再下一步驟修改到node A的內容。

2.Populate a field那邊沒錯,選擇referenced node,然後選你要改的node A數字欄位。
這樣的方向應該不會有錯,可能是哪個細節沒顧到,再試試看吧!

另外,
Rule的action的確有執行php這個項目吧?

原來是忘了 enable PHP filter (參考: http://groups.drupal.org/rules/faq#php-action)
另外, 最後的解法還是用兩個 action, 第一個還是 load referenced node, 第二個就是一個 php 程式了


db_query("UPDATE {content_type_account} SET field_value_value = field_value_value + [node:field_data-raw] WHERE nid= '[referenced_node:nid]' ");

Rules + PHP 還滿好用的