rules

Custom Rules action example

The actions being used inside rules and actions in trigger is not the same
But we can still take code example from rules/modules/*.rules.inc
and you will see lots of "core - optional" module rules

Rules action example module:

自定義 Rules action 例子

Rules 內的 action 原來和 trigger 使用的,Drupal 原生的 action 是不相同的
大家可以參考 rules/modules/*.rules.inc 便會看到很多 core - optional 的 module 的 rules

我寫一個 rules action 的 example module:

Rules 沒有我想要的欄位可以 compare

Rules 原生的 node 欄位只有很少的幾個
例如 created, updated 之類的
但我想比較的是 cck 的欄位呀
一個 checkbox 有沒有選到
一個 node reference 是否為空
一個字符欄位有否包含某些字等等

其實只要先加一個 'entity has field' 的 condition
選你想要比較的欄位
再到 data compare 便會出現你需要的欄位了

又或者更直接的方法是加一個 content is type
選擇你需要的 content type, 但如此的話便必需要是單一 content type 了

話說回來,要在 rules 和 hooks 之間選擇才是真正的困難
相關討論: http://www.drupaler.co.uk/blog/rules-versus-hooks-or-abstraction-shock

Rules 7.x 模組 201 - Component, Scheduling tasks

Component 由多個 rules 的組合而成的
目的是提供一組需要被多個 rules 重覆使用的行動
例如使用相同的條件或 rules, 或者在自定義的模組中使用它們
你也可以匯出 Component

Rules 的管理頁面的下一個 tab 就是 Component 的管理頁面
按 Add a new Component 便會看到以下的選項
Condition set (OR): 條件的組合 (set of conditions), 只需要其中一個條件符合便執行
Condition set (AND): 條件的組合, 需要全部條件都符合才執行
Action set: 行動組合 (set of actions), 順序一個一個的執行
Rule: 包含條件和行動的組合, 但沒有 Events 的設定
Rule set: 多個 rules的組合, 順序一個一個的執行, 同樣沒有 Events 的設定. 在需要執行多個行動的時候很有用

Rules 7.x 模組 101 - Actions

Actions 是 rules 的最後一組設定了
Actions 行動的意思
例如「顯示訊息」「發佈內容」「設定一個欄位值」「發電郵」等等

actions 會隨著你安裝的模組而增加
例如著名的 Commerce模組便提供一系列和 commerce 有關的 actions (還有 conditions, events)
已經整合 rules 為使用者提供更方便, 集中的流程管理
令「庫存少於10件的時候管理人員會收到相關電郵
「某產品在00:00 上架,03:00 下架
都不需要自己編寫程式便可以逹成

Rules 7.x 模組 201「當一內容設為 sticky 的時候, 站內其他的內容都設為 非 sticky」

首先介紹這個教學會用到的另一個強力模組: Views Bulk Operations
Views bulk operation (VBO) 是在 Drupal 6.x 的時候已經是很好用的模組
可以一次性為大量節點設定值
例如設為 unpublish, 批量賦與欄位值, 加減 tag 之類

VBO 在 7.x 的重大改變是它變成一個欄位
不再是一個獨立的 "Display"
可以想像, 建立一個 table, 再在前頭加一個 checkbox 欄位
table 的上方放一個 actions 的下拉選單

因為 views 是不支持 Rules 內的 "List" 的
所以便借用 VBO 的 "Load a list of entity objects from a VBO View."
將 "list of nodes" 傳到 rules 之內
所以, 相同原則之下, 你可以使用 node smart queue 逹成同樣的效果
VBO 只是一個例子而已

Rules 7.x 模組 101 - Conditions

經過 events 的啓動條件之後
便來到過濾的部份了
例如「文章更新」的 events 中, 會需要更多細節的考慮
內容類型是什麼? 作者是誰? 某欄位的是什麼? 設為置頂嗎?
這些細節的過濾便是 conditions

例如 rules 是「admin role 文章自動設為置頂」
conditions 便應該是:
「作者的 role 是 admin」

很多情況之下和有多於一個 conditions
例如上例可以修改為「admin role 的"發佈到首頁"文章自動設為置頂」
conditions 便應該修改為:
「作者的 role 是 admin」

「文章為"發佈到首頁"」

「和」是其中一個邏輯判斷, 另一種是「或」, 例如
「頁面或發佈到首頁者不可以為置頂」
conditions:
「內容類型為"頁面"」或「文章為"發佈到首頁"」

Rules 7.x 模組 101 - Events

Event 或者三個元件(events, conditions, actions)中最簡單的
簡單講就是「啟動條件」

「在儲存 node 之後」
「更新 node 之後」
「cron 之後」
「用戶登入之後」
「留言被觀看之後」等等
加插一下, 及後會再討論「排定執行(scheduled rules)」的時候
排定執行本身是作為一個 events 的, 所以排定執行不可以使用 rules, 而需要一個 component
因為 rules 本身已經有 events, 而events 不可再包住另一個 events (待詳細論)

回到 rules, 一個 rules 可以有多個 events
只要符合其中一個 events, rules 便會啓動
再經過 conditions 便會執行 actions

按 Add event

Rules 7.x 模組 101

Rules 模組在 6.x 的時代功能上已經很強大
但使用者介面一直很不友善,
rules rule set, actions, trigger, workflow, workflow-ng 等等使人很眼花撩亂
令很多使用者, 甚至開發人員, 包括我, 對 rules 模組卻步
情願自建模組, 編寫代碼, 使用方便的 hooks 完成用戶需求
例如, node 有一個電郵欄位, 每一次 save 的時候都送出一封電郵到 node 的電郵欄位
便可以使用 hook_nodeapi() (D6)

而在 7.x 中, rules 模組的使用者介面得到很大的改善
一般的使用者也可以使用
進階的 AND OR 邏輯也只需要簡單的學習就可以了
直接令自建模組的機會大大減少, 例如下圖:

Actions, trigger, rules, workflow

這四個Drupal6 的module 互相有關連,功能又多, 做一個小小的整理

action 和 rules 是做同一件事:定義一些“行為”/“行動”
而rules 是進階版的 action
這些“行為” 例如顯示一個信息, 發一個email 等等,單獨存是沒有意義的, 它需要一個觸發器去觸發一個action/rule
這個觸發器就是 trigger module 了

觸發器的例子有:“在儲存一個node 之後”
那你就可以達成:“在儲存一個node 之後,發一個email到 admin@abc.com

以上的例子很簡單,不足以說明它們的強大,但這篇只是想給讀者一個概念
讀者們要先內化這概念, 下一個post 便可以講一下進階的用法

而 workflow 是一個處理流程的module, 本身也是一個巨大的觸發器
workflow 自己可以做到定時出版一類的功能,由draft 到review 到publish, 每一步都有一個trigger, 可以trigger send email 等等的rules
有機會的話也可以詳細講講

Google