我试图直接实现一个基本的Zope2内容类型,而不使用灵巧或Archetypes,因为我需要它非常精益。
from OFS.SimpleItem import SimpleItem
from Products.ZCatalog.CatalogPathAwareness import CatalogAware
from persistent.list import PersistentList
class Doculite(SimpleItem, CatalogAware):
""" implement our class """
meta_type = 'Doculite'
def __init__(self, id, title="No title", desc=''):
self.id = id
self.title = title
self.desc = desc
self.tags = PersistentList()
self.default_catalog = 'portal_catalog'
def add_tags(self, tags):
self.tags.extend(tags)
def Subject(self):
return self.tags
def indexObject(self):
self.reindex_object()
从外部方法我这样做:
def doit(self):
pc = self.portal_catalog
res1 = pc.searchResults()
o1 = self['doc1']
o1.add_tags(['test1', 'test2'])
o1.reindex_object()
res2 = pc.searchResults()
return 'Done'
我清除目录并运行我的外部方法。我的对象没有进入目录。但是从索引选项卡中,当我浏览主题索引时,我可以看到我的内容项列出了值。 res1和res2都是空的。
为什么我的内容项目没有显示在目录的searchResuts()中?
答案 0 :(得分:2)
Plone是一个全脂内容管理系统,如果你追求精益,它可能不是正确的选择(或许尝试金字塔。)
要使您的内容类型成为Plone站点的完整部分,它必须满足Zope2,CMF和Plone层的许多要求。 plone.app.content.item.Item是关于Plone站点的内容项可以获得的最简单的基类,尽管更简单的基类本身不会真正使您的内容类型的实例更加“精益” - Python中的一个类的实例基本上只是一个dict和指向它的类的指针。
页面视图上的大部分工作都将呈现网站的各种用户界面功能。渲染基于模式的添加/编辑框架(如Archetypes和Dexterity)的形式也相对昂贵。
我花了一点时间使用其中一种支持的内容类型系统来分析您的应用程序,然后再花时间构建自己的应用程序。
答案 1 :(得分:0)
为了在portal_catalog的“目录”选项卡中查看对象,您的对象需要具有“getPhysicalPath()
”方法,该方法返回表示其路径的元组(例如('','Plone','myobject')
)。
也尝试使用它:
from Products.CMFCore.CMFCatalogAware import CMFCatalogAware
作为基类。
答案 2 :(得分:0)
您需要使用目录多路复用器注册您的类型。看看zmi中的配置 - > archetypes_tool。
我不确定,但您可能还需要一个portal_type注册...
就像劳伦斯所说,如果你想用plone的门户目录编目你的数据,你最好只使用当前的内容类型框架之一。如果您可以处理单独的目录,请查看repoze.catalog。
答案 3 :(得分:0)
Plone需要每个内容对象提供一个“allowedRolesAndUsers”索引来返回searchResults中的对象。
可能有一个zcml代码段会为我的内容类型启用此功能。但是我可以通过添加另一种方法来解决问题:
def allowedRolesAndUsers(self):
return ['Manager', 'Authenticated', 'Anonymous']
答案 4 :(得分:0)
CatalogAware将在Zope 4中删除,然后将不再使用。
cf https://github.com/zopefoundation/Products.ZCatalog/issues/26