2013-08-23 1 views
2

콘텐츠 항목이 포함 된 폴더를 탐색 중입니다. portal_catalog를 사용하여 특정 경로에서 검색된 두뇌를 얻습니다. 두뇌는 메타 데이터에 액세스 할 수 있으며 brain.getObject()는 실제 객체를 반환합니다. brain.getObject(). aq_parent를 사용하여 객체의 부모를 얻었습니다. 이제 부모에서 객체의 위치를 ​​가져 오려고합니다. 처음에는 brain.getObject(). getObjPositionInParent()를 시도한 후 getObjPositionInParent()가 인덱스 데이터에서 액세스 할 수있는 속성이라는 사실을 깨달았습니다. 나는 화면이 인쇄 부모에서 콘텐츠 객체의 위치를 ​​얻는 가장 좋은 방법은 무엇입니까? Plone 4

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'') 

답변

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 
+0

감사를 기반으로 냈다,하지만 시도에, 나는 ordered.getObjectPosition (obj.getId())가 호출되는 ComponentLookupError를 얻을. IOrdering을 구현하는 ATFolder에서 어댑터를 찾을 수 없다고합니다. 더 이상의 생각? – user1075722

+0

@ user1075722 어딘가에 전체 추적을 게시 할 수 있습니까? – Mathias

+0

안녕하세요, @ 마티아스. stacktrace 및 오류 출력을 추가했습니다. 당신의 도움을 주셔서 감사합니다. – user1075722

관련 문제