2011-04-29 7 views
7

Я создал собственный тип контента Archetypes под названием «Résumé» и хотел бы применить ограничение, которое позволяет члену добавлять только один элемент этого типа внутри папки. Еще лучше будет перенаправить участника на страницу своего сайта, если он уже существует в этой папке.Ограничение одного элемента контента для члена в папке на Plone 4

Как я могу применить это ограничение и предоставить дополнительную функциональность?

+0

Я разместил свое решение здесь: http://pastie.org/1856465 на основе предложений zupo. – zedr

ответ

5

Решение для аналогичной утилиты для Plone 3 можно найти в eestec.base. Мы сделали это, переопределив createObject.cpy и добавив специальную проверку для этого.

Код находится в коллективном СВН, по адресу http://dev.plone.org/collective/browser/eestec.base/trunk/eestec/base/skins/eestec_base_templates/createObject.cpy, линии 20-32.

+0

Спасибо. Это именно то, что я искал, т. Е. Крючок, который выполняет проверку перед частью создания контента, и перенаправляет пользователя в относительный вид редактирования, если он уже существует. – zedr

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(), который вы можете исследовать. Примечание II. Это не переносит миграцию контента.

+0

Это ограничило бы его одним объектом этого типа в совокупности вместо одного объекта этого типа для каждого пользователя. – maurits

2

Ну, это своего рода ограничение валидации, поэтому, возможно, добавьте валидатор в поле заголовка, который на самом деле не беспокоится о названии, но проверяет пользователя и т. Д.? (Я думаю, что полевой валидатор передан достаточно информации, чтобы снять это, если нет, переопределение метода post_validate или прослушивание соответствующего события должно работать.)

Если вы попробуете это, имейте в виду, что post_validate уже вызывается пользователь редактирует (т. е. при перемещении фокуса из поля).