我正在开发一个Plone产品,需要以编程方式导入以前导出到ZEXP文件的对象。除导航栏外,它工作正常。导入一个对象时,它会正确执行,但导航栏不会更新。可以通过它的URL及其父容器内容选项卡访问该对象。
Bellow是我用来导入对象的代码。它基于zope的ObjectManager._importObjectFromFile实现。
def importDocument( app, fileName, container ):
app._p_jar.sync()
owner = 1
connection = container._p_jar
ob = connection.importFile( config.REMOTE_DIR + fileName, customImporters={ magic: importXML, } )
id = ob.id
if hasattr(id, 'im_func'): id = id()
try:
container._setObject( id, ob, set_owner = owner, suppress_events=False )
except AttributeError:
print "AttributeError"
# Try to make ownership implicit if possible in the context
# that the object was imported into
ob = container._getOb( id )
ob.manage_changeOwnershipType( explicit = 0 )
transaction.commit()
return True
我注意到_setObject实现在它的代码中触发了ObjectAddedEvent事件,并且在该事件之后,当我使用ZMI接口导入对象时菜单得到更新,所以我认为有些东西正在监听这个事件,处理菜单,但奇怪的是,使用我的代码时不会发生这种情况。
答案 0 :(得分:0)
也许在导入完成后尝试手动重建整个目录?它可能会给你更多提示:...
ZMI - > portal_catalog - > tab'advance' - > '清楚&重建”。
答案 1 :(得分:0)
一般来说,不支持导入zexp对象(部分原因是由于此类情况可能会发生意外或意外结果)。如果它有效,那很好。如果没有,您可以“独立”,最好将Data.fs文件复制到新的软件堆栈。
那就是说,我不确定我理解为什么清楚并重建目录(ZMI - > portal_catalog - > tab'advance' - >'clear& rebuild')不是这里的答案。根据其描述,它的工作是“遍历整个门户网站,寻找应在目录中编入索引并将其编入索引的内容对象”。
除非我误解,否则您刚刚描述了一种情况,即新导入的内容“应该编入索引”,因为它尚未编入索引。
如果您担心清除和重建所需的时间长度,请尝试从命令行运行它,如下所示:
如果您担心抓取整个网站,请在每个对象上调用indexObject()(http://dev.plone.org/plone/browser/plone.org/Products.PloneOrg/trunk/scripts/catalog_rebuild。 PY#L109)
答案 2 :(得分:0)
您可能需要在导入后“发布”该对象以使其可见。
请改用manage_importObject方法。