2011-04-29 60 views
7

我已經創建了一個名爲「簡歷」的自定義Archetypes內容類型,並且希望強制實施一個限制,使成員只能在文件夾內添加一個此類型的項目。如果該項目已存在於該文件夾中,那麼更好的做法是將其成員重定向到其項目的編輯頁面。限制Plone 4上文件夾中每個成員的一個內容項目

如何強制執行此限制並提供此額外功能?

+0

我在這裏發佈了我的解決方案:http://pastie.org/1856465基於zupo的建議。 – zedr 2011-05-02 12:31:24

回答

5

在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行。

+0

謝謝。這正是我正在尋找的內容,即在內容創建部分之前執行檢查的掛鉤,並在用戶已存在的情況下將用戶重定向到相對編輯視圖。 – zedr 2011-05-02 10:34:32

1

我不知道這是否是最佳做法,但可以在創建時從基礎對象上掛上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:這不能在內容遷移中存活。

+0

這會將其限制爲總共一個此類型的對象,而不是每個用戶的此類型的一個對象。 – maurits 2011-04-29 23:52:11

2

嗯,這是一種驗證約束,所以可能在標題字段添加一個驗證器,實際上不會爲標題煩擾,而是檢查用戶等。 (我認爲一個字段驗證器傳遞了足夠的信息來解決這個問題,如果沒有,覆蓋post_validate方法或者聽取相應的事件應該可以工作。)

如果你嘗試這個,記住已經調用了post_validate用戶正在編輯(即將焦點移出一個字段)。

相關問題