2

我正在遍历其中包含内容项的文件夹。我使用 portal_catalog 在某些路径上搜索大脑。大脑可以访问元数据,brain.getObject() 将返回实际对象。我已经用 Brain.getObject().aq_parent 获得了一个对象的父级。现在我想获取对象在父对象中的位置。一开始我尝试了brain.getObject().getObjPositionInParent(),后来我意识到getObjPositionInParent()是一个可以从索引数据中访问的属性。

idxData = catalog.getIndexDataForRID(brain.getRID())

sJson = json.dumps( idxData )
l = brain.getObject()
lUpdate = {'path': '/'.join( l.getPhysicalPath()), 'meta_type': l.meta_type, 'title':l.getRawTitle(), 'remoteUrl': l.getRemoteUrl(), 'json':sJson}

当我将它打印到屏幕上时,我看到了从 catalog.getIndexDataForRID 调用返回的字典中的所有项目。问题是对于所有对象,getObjPositionInParent() 是一个空数组 ([])。在此页面http://developer.plone.org/searching_and_indexing/query.html上,该值似乎应该是一个整数。这让我想知道我是否必须去创建索引数据,如果是这样,那么我可能会从对象向外太远以获取必须已经存在的数据(因为文件夹显然知道将每个孩子放在什么位置在)。获取内容对象在父级中的位置的最佳方法是什么?提前感谢您提供任何信息?

更多的:

我不确定为什么找不到适配器,但这可能与缺少注册有关。这是一个脚本,我构建 Zope 环境以直接从文件中读取 ZODB,而不是在运行的 Zope 实例之上。我是否有可能必须向 GlobalSiteManager 注册适配器?

谢谢你,马蒂亚斯。当我使用 sort_on="getObjPositionInParent" 时,出现以下错误:

Traceback (most recent call last):
  File "extractMenuStructure.py", line 459, in <module>
    res = processFolder( home['childItems'], '/Sanford Guide Web Edition/' + appFolderNm + '', config['screens'] )
  File "extractMenuStructure.py", line 390, in processFolder
    results = portal_catalog(path={"query":currentPath, "depth":d},sort_on="getObjPositionInParent")
  File "/Applications/Plone/buildout-cache/eggs/Products.CMFPlone-4.1.2-py2.6.egg/Products/CMFPlone/CatalogTool.py", line 427, in searchResults
    return ZCatalog.searchResults(self, REQUEST, **kw)
  File "/Applications/Plone/buildout-cache/eggs/Products.ZCatalog-2.13.20-py2.6.egg/Products/ZCatalog/ZCatalog.py", line 604, in searchResults
    return self._catalog.searchResults(REQUEST, used, **kw)
  File "/Applications/Plone/buildout-cache/eggs/Products.ZCatalog-2.13.20-py2.6.egg/Products/ZCatalog/Catalog.py", line 909, in searchResults
    return self.search(args, sort_index, reverse, sort_limit, _merge)
  File "/Applications/Plone/buildout-cache/eggs/Products.ZCatalog-2.13.20-py2.6.egg/Products/ZCatalog/Catalog.py", line 658, in search
    b_size=b_size)
  File "/Applications/Plone/buildout-cache/eggs/Products.ZCatalog-2.13.20-py2.6.egg/Products/ZCatalog/Catalog.py", line 678, in sortResults
    index_key_map = sort_index.documentToKeyMap()
  File "/Applications/Plone/buildout-cache/eggs/plone.app.folder-1.0.4-py2.6.egg/plone/app/folder/nogopip.py", line 91, in documentToKeyMap
    ids = folder.getOrdering().idsInOrder()
  File "/Applications/Plone/buildout-cache/eggs/plone.folder-1.0.1-py2.6.egg/plone/folder/ordered.py", line 41, in getOrdering
    adapter = getAdapter(self, IOrdering)
  File "/Applications/Plone/buildout-cache/eggs/zope.component-3.9.5-py2.6.egg/zope/component/_api.py", line 96, in getAdapter
    raise ComponentLookupError(object, interface, name)
zope.component.interfaces.ComponentLookupError: (&lt;ATFolder at /Sanford Guide Web Edition/amt&gt;, &lt;InterfaceClass plone.folder.interfaces.IOrdering&gt;, u'')
4

1 回答 1

5

最好的方法是做喜欢索引本身。

基于 CatalogTool (Products.CMFPlone) 截取的代码

from Acquisition import aq_inner
from Acquisition import aq_parent
from OFS.interfaces import IOrderedContainer

obj = brain.getObject()
parent = aq_parent(aq_inner(obj))
ordered = IOrderedContainer(parent, None)
if ordered is not None:
    return ordered.getObjectPosition(obj.getId())
return 0
于 2013-08-23T14:59:06.387 回答