Как ограничить количество специальных объектов content_type в типе папок только одним объектом? - PullRequest
1 голос
/ 13 июля 2011

Я создаю тип папок (архетип 1) и хочу иметь возможность добавить в эту папку только один объект (архетип 2).

Ответы [ 4 ]

1 голос
/ 14 июля 2011

Хорошо, вы хотите, чтобы ваш второй тип архетип 2 был добавлен только один раз внутри архетип 1 ?

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

Вам необходимо убедиться, что папка архетип 1 подклассов ConstrainTypesMixin .

Я думаю, что если вы используете типы содержимого папок в Products.ATContentTypes , вы автоматически создадите подкласс этого класса mixin, но это поможет убедиться.

Затем внутри архетипа 1 добавьте метод: getLocallyAllowedTypes . Этот метод объявлен в классе ConstrainTypesMixin в Products / ATContentTypes / lib / constraintypes.py

В этом методе вы можете теперь добавить логику, чтобы проверить, был ли уже добавлен экземпляр архетип 2 . Если это так, не возвращайте его как один из локально разрешенных типов. Если этого не произошло, верните его (вместе с другими типами, если они существуют).

Обязательно сначала вызовите super () в этом методе, чтобы получить локально добавленные типы из метода суперкласса.

Чтобы понять, как это работает, вы можете посмотреть на метод * _addableTypesInContext * в FactoriesSubMenuItem классе plone / app / contentmenu / menu.py , чтобы узнать, когда и как это getLocallyAllowedTypes метод вызывается.

1 голос
/ 13 июля 2011

Вы можете ограничить добавляемые типы внутри вашего типа папок («архетип 1») до «архетип 2», изменив определение типов «архетипы 1» (profile / default / archetype1.xml):

<?xml version="1.0"?>
<object name="archetype1">
   ...
  <property name="filter_content_types">True</property>  
  <property name="allowed_content_types">
    <element value="archetype2" />
  </property>
  ...
</object>
0 голосов
/ 14 июля 2011

Вы можете переопределить сценарий createObject.cpy и добавить туда проверку:

this_type = REQUEST.form.get('type_name') 
if this_type == 'MyATContentType':
    # MyATContentType needs a special check
    ctool = getToolByName(context, 'portal_catalog')
    this_path = '/'.join(context.getPhysicalPath())

    # Query the Catalog to see we already have an instance of this object here
    results = ctool.searchResults({'portal_type': this_type, 'path': this_path})

    if results:
        context.plone_utils.addPortalMessage(_(
            u'Sorry, but there already is an object of type %s here.' % this_type
        ))

        # Redirect to the edit form of the first found object.
        cv = results[0]
        cv_path = cv.getPath()
        return context.REQUEST.RESPONSE.redirect(cv_path + "/edit")

Предоставьте настроенный сценарий вместе со связанным файлом .metadata в папке скинов / шаблонов вашего продукта.

Бонусный совет: в Ловкости вы добавили бы эту проверку в ловкость.AddForm.update ()

0 голосов
/ 13 июля 2011

Возможно, вам лучше всего создать пользовательскую форму добавления (возможно, используя z3c.form) и установить там ограничение.

...