我已經創建了一個名爲「簡歷」的自定義Archetypes內容類型,並且希望強制實施一個限制,使成員只能在文件夾內添加一個此類型的項目。如果該項目已存在於該文件夾中,那麼更好的做法是將其成員重定向到其項目的編輯頁面。限制Plone 4上文件夾中每個成員的一個內容項目
如何強制執行此限制並提供此額外功能?
我已經創建了一個名爲「簡歷」的自定義Archetypes內容類型,並且希望強制實施一個限制,使成員只能在文件夾內添加一個此類型的項目。如果該項目已存在於該文件夾中,那麼更好的做法是將其成員重定向到其項目的編輯頁面。限制Plone 4上文件夾中每個成員的一個內容項目
如何強制執行此限制並提供此額外功能?
在eestec.base中可找到Plone 3類似用例的解決方案。我們通過覆蓋createObject.cpy並添加了一個特殊的檢查來完成它。
代碼位於集體SVN中,位於http://dev.plone.org/collective/browser/eestec.base/trunk/eestec/base/skins/eestec_base_templates/createObject.cpy,第20-32行。
謝謝。這正是我正在尋找的內容,即在內容創建部分之前執行檢查的掛鉤,並在用戶已存在的情況下將用戶重定向到相對編輯視圖。 – zedr 2011-05-02 10:34:32
我不知道這是否是最佳做法,但可以在創建時從基礎對象上掛上def at_post_create_script
,並在刪除時掛上manage_beforeDelete
。
例如:
from Products.ATContentTypes.lib import constraintypes
class YourContentype(folder.ATFolder)
[...]
def at_post_create(self):
origin = aq_parent(aq_inner(self))
origin.setConstrainTypesMode(constraintypes.ENABLED) # enable constrain types
org_types = origin.getLocallyAllowedTypes() # returns an immutable tuple
new_types = [x for x in org_types if x! = self.portal_type] # filter tuple into a list
origin.setLocallyAllowedTypes(new_types)
def manage_beforeDelete(self, item, container)
BaseObject.manage_beforeDelete(self, item, container) # from baseObject
self._v_cp_refs = None # from baseObject
origin = aq_parent(aq_inner(self))
origin.setConstrainTypesMode(constraintypes.ENABLED) # enable constrain types
org_types = origin.getLocallyAllowedTypes() # returns an immutable tuple
new_types = [x for x in org_types].append(self.portal_type)
origin.setLocallyAllowedTypes(new_types)
注:還有一個叫setImmediatelyAddableTypes()
方法,你可能想探索。注2:這不能在內容遷移中存活。
這會將其限制爲總共一個此類型的對象,而不是每個用戶的此類型的一個對象。 – maurits 2011-04-29 23:52:11
嗯,這是一種驗證約束,所以可能在標題字段添加一個驗證器,實際上不會爲標題煩擾,而是檢查用戶等。 (我認爲一個字段驗證器傳遞了足夠的信息來解決這個問題,如果沒有,覆蓋post_validate方法或者聽取相應的事件應該可以工作。)
如果你嘗試這個,記住已經調用了post_validate用戶正在編輯(即將焦點移出一個字段)。
我在這裏發佈了我的解決方案:http://pastie.org/1856465基於zupo的建議。 – zedr 2011-05-02 12:31:24