循环浏览一堆文件夹式的内容,这本身可能就是文件夹式的?

问题描述

| 假设我的内容类型为Folder,包含4个项目。
+ MyObject
 - Child1
 - Child2
 - Child3
 + Child4
  - Child5
 - Child6
假设我有另一种内容类型(我们称它为“1ѭ”)。这个“ 1”主要是对另一个对象的引用,但有点偏:它可以包含许多其他别名。我将在下面的树表示中使用ѭ3来表示此引用。(\“ Reference \”主要是一个名为\“ reference \”的属性,该属性从目标对象接收UID)。 假设ѭ4现在引用了我的ѭ5。
+ MyAlias --> MyObject
 - (nothing)
当引用
MyObject
时,
MyAlias
不知道
MyObject
是Folder,因此内部MyAlias子级不存在。我需要遍历每个人,并在
MyAlias
内手动创建一个Alias,这是对
MyObject
个孩子的引用(具有相同的结构)。一棵小树,显示应该发生的情况:
+ MyAlias --> MyObject
 - Alias --> Child1
 - Alias --> Child2
 - Alias --> Child3
 + Alias --> Child4
  - Alias --> Child5
 - Alias --> Child6
我想知道最好的方法来迭代,5ѭ项目,并使用某种循环并在订户中使用
invokeFactory
来与另一个对象创建相同的结构。最后,我将拥有两棵树:一个是实际的Folder和子代,另一个是对该相同Folder和子代的引用。 (总结:类似collection.alias之类的东西,但是以一种非常原始的形式,只需将文档放在文件夹中,因为我不能使用collective.alias。)     

解决方法

        最优雅,最Python化的解决方案是编写一个递归生成器。假设这是一种方法:
def iter_preorder(self):
    yield self
    # check for folderishness here if a non-folderish
    # node may have children as well
    for x in self.children:
        for y in x.iter_preorder():
            yield y
然后
for x in tree.iter_preorder():
    do_action(x)
这样,您实际上不必将动作包装到一个函数/可调用中,并且控制也不会反转。     ,        递归可能会有所帮助
def do_action(child):
    if child.isfolder():
        for i in child:
            do_action(i)
    else:
        child.setSomething()

do_action(MyObject)
    ,        为什么不使用目录?该目录旨在为您快速安全地解决这些问题,以便您可以专注于重要的事情。因此,要查找某个路径中的所有对象:
ct = getToolByName(context,\'portal_catalog\')
path = \'/\'.join(context.getPhysicalPath())
brains = ct.searchResults(path=path)
您当然可以在查询中进行更多过滤。然后,
for brain in brains:
    obj = brain.getObject()
    obj.setSomething()
该目录是您的朋友,请阅读如何使用它。     ,        听起来您可能正在尝试进行内容类型迁移。如果是这种情况,请查看Products.contentmigration。