您在這裡

把 node 在儲存前後的某個 field 拿來計算 (Rules or Trigger, Action?)

dennys's 的頭像
dennys 在 2011-11-15 (二) 22:59 發表

需求是這樣的, node 有兩個欄位 A 和 B, 都是數字. 在修改 node 之後, 希望把 A 在修改前後的值相減, 然後存到 B. 測試了一下, 用 Rules 2 是可以做到的, Event 使用 Before saving content, Action 則使用 Calculate a value 和 Set a data value 就可以了.

不過用好幾 Event 有點麻煩, 而且之後的邏輯可能更複雜, 因此想改用 PHP 自己寫, 於是就把 action 改成了 Execute custom PHP code, 但是找不到範例取得 node 的值和修改 node 的值. 以下這兩種寫法都不行, 不知道有沒有範例程式可以參考?


$node->field-final['und'][0]['value'] = 123;
$node->field-final[LANGUAGE_NONE][0]['value'] = 123;

另外, 不是很確定這是不是好的 solution, 選 Rules 的原因是因為看了一下內建的 trigger 和 action 沒有 "儲存前的 trigger", 所以猜測可能沒法抓到存檔前的 data. 主要的需求在於某個 node 被新增/刪除/修改 之後, 要依照修改前後的內容, 去修改其他欄位的值.

改了之後發現還是沒作用, 然後隨便打些一定不存在的指令 (就亂打一些 ooxx), 竟然也沒有錯誤訊息?
下面是 Rules debug 內容, 從 php_eval 旁邊的 edit 就可以跳到 php code 的編輯畫面.
看來 Rules 似乎是有去執行 php code, 但又好像什麼都沒執行到?

Rules debug information:
" Reacting on event Before saving content.
0 ms Reacting on event Before saving content.
12.607 ms Evaluating conditions of rule RULE_TEST. [edit]
13.194 ms The condition node_is_of_type evaluated to TRUE [edit]
13.209 ms AND evaluated to TRUE.
" Rule RULE_TEST fires. [edit]
0 ms Rule RULE_TEST fires.
0.357 ms Evaluating the action php_eval. [edit]
0.544 ms Rule RULE_TEST has fired.
13.802 ms Finished reacting on event Before saving content.