需求是這樣的, 有兩個 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?
Re: CCK 使用 Rules 修改另一個 node 的 CCK 欄位
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),
);
?>
Re: CCK 使用 Rules 修改另一個 node 的 CCK 欄位
請問在 Arguments configuration 裡面的 Content containing the node reference field: 設定的東西用途為何啊?
我做了兩個 action
1.Load a reference node
2.Populate a field
$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.
Re: CCK 使用 Rules 修改另一個 node 的 CCK 欄位
另外就是, Rules 的 action 是否有可能直接執行一段 php? 感覺這樣比較有彈性
Re: CCK 使用 Rules 修改另一個 node 的 CCK 欄位
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這個項目吧?
Re: CCK 使用 Rules 修改另一個 node 的 CCK 欄位
原來是忘了 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 還滿好用的
Re: CCK 使用 Rules 修改另一個 node 的 CCK 欄位
讚哦!
Re: CCK 使用 Rules 修改另一個 node 的 CCK 欄位
有沒有第三種解法?
就是寫一個 module, 在 hook_nodeapi 函式 或是 update 函式裏處理細節 ?
我還沒試過, 只是好奇順便問一下. :P
Re: CCK 使用 Rules 修改另一個 node 的 CCK 欄位
應該是可以吧, 不過我也沒寫過 :p