有没有办法做一个保持层次结构的portal_catalog?

时间:2011-08-18 21:33:29

标签: plone plone-3.x

假设:

Folder
  - Document
  - Document
  - Folder1
    - Document
    - Document

如果我使用Folder作为路径执行portal_catalog,我会得到:

[<Products.ZCatalog.Catalog.mybrains object at 0xdba8d9c>, 

<Products.ZCatalog.Catalog.mybrains object at 0xdd71234>, 

<Products.ZCatalog.Catalog.mybrains object at 0xdd71324>, 

<Products.ZCatalog.Catalog.mybrains object at 0xdd712fc>, 

<Products.ZCatalog.Catalog.mybrains object at 0xdd71194>]

但是我希望有一个portal_catalog来保存层次结构上下文,例如:

{
    "Folder": 
             [
             <Products.ZCatalog.Catalog.mybrains object at 0xdba8d9c>,
<Products.ZCatalog.Catalog.mybrains object at 0xdba8d9c>, 
              {
               "Folder1":[
                          <Products.ZCatalog.Catalog.mybrains object at 0xdba8d9c>, <Products.ZCatalog.Catalog.mybrains object at 0xdba8d9c>
                         ]
              }
             ]
}

所以,如果它是一个文件夹类型,它的id是dict中的一个键。

是否有可能有类似的数据strcuture(保持对象的层次结构),或者我必须创建自己的递归函数(我知道上面的结构可能不存在,但我想你可以得到这个想法)?由于性能问题,我正在考虑使用portal_catalog和大脑。

谢谢!

2 个答案:

答案 0 :(得分:4)

我认为您可以sort_on path索引。这意味着您的目录查询结果将按层次结构排序。然后,您可以以递归方式使用itertools.groupby来获取所描述结构的迭代器。棘手的部分将是递归。您将要使用groupby的键函数,为当前文件夹深度/递归级别选择brain.getPath()的相应部分。

答案 1 :(得分:2)

您可能还会查看站点地图生成器,它会提供嵌套的导航结构。

这里是一个(位)相关链接:Navigation portlet: all childen always expanded