如何将is_folderish属性添加到Dexterity对象?

时间:2013-03-02 17:25:08

标签: plone dexterity

.is_folderish属性在很多地方使用。例如,当setting an object as the default viewactivating discussions on an object时。

我的第一个问题是如何检查对象是否具有该属性集。我尝试使用bin/instance debug这样的东西:

>>> app.site.news.is_folderish
...
AttributeError: is_folderish

我想我无法以这种方式访问​​属性,因为app.site.news是具有该属性的对象的包装器。

我的第二个问题是如何将该属性添加到新的Dexterity对象。我想我可以使用下面的代码来完成它(但是在我的第一个问题解决之前我无法测试它。)

from zope import schema
from plone.dexterity.content import Item

class IHorse(form.Schema):
    ...

class Horse(Item):
    def __init__(self):
        super(Horse, self).__init__(id)
        is_folderish = False

但我不确定如何将这两个类联系起来。

1 个答案:

答案 0 :(得分:2)

您无需在类型中添加is_folderish;它是目录中的索引,Dexterity类型已经具有该索引的适当属性isPrincipiaFolderish

如果你需要为内容类型添加属性,你可以使用事件订阅者或创建plone.dexterity.content.Item的自定义子类:

  • subscribers可以收听IObjectCreatedEvent事件:

    from zope.app.container.interfaces import IObjectAddedEvent
    
    @grok.subscribe(IYourDexterityType, IObjectCreatedEvent)
    def add_foo_attribute(obj, event):            
        obj.foo = 'baz'
    
  • custom content classes需要在您的XML类型中注册:

    from plone.dexterity.content import Item
    
    class MyItem(Item):
        """A custom content class"""
        ...
    

    然后在您的Dexterity FTI XML文件中添加klass属性:

    <property name="klass">my.package.myitem.MyItem</property>