Каков наилучший способ получить позицию объекта контента в родительском? Plone 4
Я просматриваю папки с элементами контента внутри них. Я использую 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}
Когда я распечатал это на экране, я вижу все элементы внутри dict, которые возвращаются из вызова 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: (<ATFolder at /Sanford Guide Web Edition/amt>, <InterfaceClass plone.folder.interfaces.IOrdering>, u'')
1 ответ
Лучший способ - это сделать сам индекс.
Код взломан на основе 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