在我的Plone实例中,我希望在创建后将每个新创建的页面移动到自己的文件夹中。该文件夹应与该页面具有相同的标题和说明。所以我把这个函数写成了zope.lifecycleevent.interfaces.IObjectAddedEvent的事件处理程序:
def notifyDocumentIsAdded(document, event):
portal = api.portal.get()
context = aq_inner(document)
folder = aq_parent(context)
if getattr(document,"title") != getattr(folder,"title"):
newfolder = api.content.create(
type='Folder',
title=getattr(document,"title"),
container=folder,
description=getattr(document,"description"))
api.content.move(source=document,target=newfolder,safe_id=True)
直到最后一行,我想将刚刚添加的新页面移动到新文件夹。我得到了
ERROR Products.ZCatalog A different document with value 'c31f15e4923e4f2683dedc829d2f773d' already exists in the index.'
具有该值的Document是什么意思?这是身份证的冲突吗?或者移动触发事件的对象是一个问题吗?
更新 使用python调试器后,我现在更好地理解了实际问题: 尽管我上面的陈述,页面仍然正确移动。问题是:执行我的处理程序之后,页面将被具有过时位置的目录编入索引,而它由我的处理程序移动。即使在移动之后使用transaction.commit(),页面仍将使用其旧位置和新位置编制索引。因此上述错误。我怎样才能防止这种情况发生。
答案 0 :(得分:2)
我认为这种情况正在发生,因为您正在尝试移动未完全创建的对象。
您可能想要更改事件处理程序的逻辑或为IObjectCreatedEvent注册它,否则您将以循环结束。
每次向容器添加对象时都会调用IObjectAddedEvent,移动后也会发生这种情况。