2010-09-11 50 views
4

我有以下情形:不允許用戶刪除一個節點,但允許通過瀏覽批量操作刪除

  • 編輯角色應該允許 刪除節點。因此,在 權限頁面中取消選擇相應的 權限。
  • 但是編輯器 應該能夠從視圖批量操作中刪除節點 。使用 規則創建一個動作,稱爲 「安全刪除」,如果在刪除節點之前未發佈節點等 ,則會檢查諸如 之類的內容。

問題是視圖批量操作尊重節點權限。編輯器將無法刪除該節點,因爲他沒有獲得該權限。在VBO中執行該操作時,編輯器是否可以成爲更高級角色的用戶(如某種sudo)?或者有沒有辦法告訴VBO忽略此操作的節點訪問?

我確定這是一個主流需求,但我似乎無法找到解決方案。

不涉及編程的解決方案將是首選。

回答

2

簡單但並不那麼幹淨的方式就是你已經採用的路線,但還有一個額外的小模塊來幫助它。

  • 具有功能my_module_can_delete($user),如果用戶被允許刪除,FALSE如果用戶不返回TRUE
  • 實現hook_form_alter()如果my_module_can_delete($user)
  • 實現hook_form_alter()修改那個叫/節點上的確認表格/%NID /刪除,並添加一條消息出現,告訴用戶修改和刪除node_edit窗體上的按鈕,他或她my_module_can_delete($user)。這應該足夠了,因爲禁用此表單將導致用戶無法通過此表單。 FORM-API會照顧到這一點。

但是,您可以使其更堅固,趕上其他刪除模塊:

  • 實現hook_nodeapi()$op == 'delete'趕上刪除操作和停止(通過調用drupal_goto(),或致電drupal_access_denied()強制執行用戶錯誤。僅捕獲刪除-行動,如果引用者是刪除,確認形式如上所述。或者,更安全,白名單您的VBO行動和所有其他參照網址返回false。引薦來源往往可以通過讀出$找到節點傳遞到hook_nodeapi()

A,恕我直言,更清潔,但可能更密集替代,是簡單地確保您的批次/行動呼籲每個刪除操作。

在一個模塊中,您可以通過避免所有VBO配置並將所有額外刪除操作離開那裏來完成此操作。 然後編寫一個實現hook_nodeapi()的模塊,然後從那裏調用所有清理操作。這樣,您可以確定您的刪除操作是在任何節點上的每個刪除操作上調用的。顯然你可以在你的hook_nodeapi()中添加一些條件來在某些情況下調用你的模塊(節點類型,用戶角色,權限等)。

0

我沒有一個良好的無編碼解決方案,我不知道我會叫這個解決方案「偉大」 - 只有一種解釋可能是實現具有form_alter掛鉤,消除刪除按鈕的簡單模塊從節點編輯表單開始。

一般來說,好像角色要麼有權刪除節點或沒有,胡鬧周圍像這樣將是不太可靠的,你可能會喜歡。

+0

我考慮過這個,但是使用URL/node/[nid]/delete也會刪除節點。所以雖然按鈕可能不在那裏,刪除仍然是可能的。謝謝你的時間,但! – 2010-09-12 06:44:39

1

好吧,在我看來,你已經有了一個設置,你不希望編輯角色的用戶刪除東西,除非在某些極端情況下。這是我的建議:

1)安裝標誌模塊。創建一個只能由編輯角色人員分配的「待刪除」標誌。

2)我還沒有看過它,但我確定有可能是一個規則或觸發/動作組合,當將'刪除'標誌分配給它時,它將取消發佈節點。節點從臨時視圖

然後或者設置某些cron運行活動(觸發/操作或規則)以刪除其上設置了「要刪除」標記的節點,或者讓其他具有較高權限的用戶偶爾進入並刪除標記的項目

這樣你實際上並沒有繞過權限系統,但仍然是從你的網站上刪除東西

+1

唯一的問題可能是cron在大多數安裝中以匿名用戶身份運行,並且我不記得cron是否尊重權限。 – mirzu 2010-09-29 20:34:18

1

我被抓住了一段時間,直到我注意到「actions_permissions」模塊,啓用此功能並在Permissions頁面上,您可以提供對角色的角色基礎上的特定操作的訪問權限。

+0

你使用過這個模塊嗎?那麼是否有人能夠通過VBO刪除節點,而無法通過正常節點刪除節點 - 編輯 - 刪除方法? – 2011-11-12 14:45:58

相關問題