Tridion 从文件夹和子文件夹读取所有组件

Tridion 从文件夹和子文件夹读取所有组件,tridion,tridion2009,Tridion,Tridion2009,我正在使用.NET模板C#2.0开发Tridon 2009 我需要读取文件夹及其子文件夹中的所有组件 如果我在代码中写入: OrganizationalItem imageFolder= (OrganizationalItem)m_Engine.GetObject(comp.OrganizationalItem.Id); 我能够从指示器组件所在的位置读取子文件夹中的所有组件,但无法读取指示器所在文件夹中的其他组件 但是如果我写 OrganizationalItem imageFolder=(O

我正在使用.NET模板C#2.0开发Tridon 2009

我需要读取文件夹及其子文件夹中的所有组件

如果我在代码中写入:

OrganizationalItem imageFolder=
(OrganizationalItem)m_Engine.GetObject(comp.OrganizationalItem.Id);
我能够从指示器组件所在的位置读取子文件夹中的所有组件,但无法读取指示器所在文件夹中的其他组件

但是如果我写

OrganizationalItem imageFolder=(OrganizationalItem)m_Engine.GetObject(
公司组织项目Id);
然后,我就能够只读指示器组件所在的文件夹

下面是我的代码

XmlDocument doc=xBase.createNewXmlDocRoot(“ImageLibrary”);
XmlElement根=doc.DocumentElement;
过滤器=新过滤器();
Component comp=this.GetComponent();
filter.Conditions[“ItemType”]=ItemType.Folder;
filter.Conditions[“Recursive”]=“true”;
OrganizationalItem imageFolder=
(OrganizationalItem)m_Engine.GetObject(comp.OrganizationalItem.Id);
XmlElement itemList=imageFolder.GetListItems(过滤器);
foreach(itemList中的XmlElement itemImg)
{
filter.Conditions[“ItemType”]=ItemType.Component;
filter.Conditions[“BasedOnSchema”]=comp.Schema.Id;
OrganizationalItem imgFolder=
(OrganizationalItem)m_Engine.GetObject(itemImg.GetAttribute(“ID”)
.ToString());
XmlElement imageLibs=imgFolder.GetListItems(过滤器);
doc=this.createImageNodes(imageLibs、doc、filter、comp);
foreach(imageLibsList中的XmlElement imglib)
{
XmlElement imageroot=doc.CreateElement(“图像”);
XmlElement uploadeddateNode=doc.CreateElement(“DateUpload”);
组件imgComp=
(组件)m_Engine.GetObject(imglib.GetAttribute(“ID”);
}
}

请提出建议。

我认为您应该收集子文件夹,并递归地为每个子文件夹调用您的函数,这似乎是您想要实现的目标

这个函数名为createImageNodes(),您在哪里设置imageLibsList


在第一个循环中,您似乎将每个项目都视为一个文件夹,那么组件呢?

我认为您应该收集子文件夹,并递归调用每个子文件夹的函数,这似乎是您试图实现的目标

这个函数名为createImageNodes(),您在哪里设置imageLibsList


看起来您在第一个循环中将每个项目视为一个文件夹,那么组件呢?

关于“从文件夹和子文件夹读取所有组件”的问题,我在您的代码片段中看到了很多多余的代码

但是回答问题本身,当你在做:

OrganizationalItem imageFolder=(OrganizationalItem)m_Engine.GetObject(comp.OrganizationalItem.Id);
您无法读取该文件夹中的组件,因为您之前已将筛选器设置为仅在以下行上的文件夹:

filter.Conditions[“ItemType”]=ItemType.Folder;
解决方案:

如果要检索“indicator component”文件夹及以下文件夹中的所有组件,需要在第一次搜索时设置过滤器,如下所示:

filter.Conditions[“Recursive”]=“true”;
filter.Conditions[“ItemType”]=ItemType.Component;
filter.Conditions[“BasedOnSchema”]=comp.Schema.Id;
并执行以下搜索:

OrganizationalItem imageFolder=(OrganizationalItem)m_Engine.GetObject(comp.OrganizationalItem.Id);
XmlElement itemList=imageFolder.GetListItems(过滤器);

关于“从文件夹和子文件夹读取所有组件”的问题,我在您的代码片段中看到了很多多余的代码

但是回答问题本身,当你在做:

OrganizationalItem imageFolder=(OrganizationalItem)m_Engine.GetObject(comp.OrganizationalItem.Id);
您无法读取该文件夹中的组件,因为您之前已将筛选器设置为仅在以下行上的文件夹:

filter.Conditions[“ItemType”]=ItemType.Folder;
解决方案:

如果要检索“indicator component”文件夹及以下文件夹中的所有组件,需要在第一次搜索时设置过滤器,如下所示:

filter.Conditions[“Recursive”]=“true”;
filter.Conditions[“ItemType”]=ItemType.Component;
filter.Conditions[“BasedOnSchema”]=comp.Schema.Id;
并执行以下搜索:

OrganizationalItem imageFolder=(OrganizationalItem)m_Engine.GetObject(comp.OrganizationalItem.Id);
XmlElement itemList=imageFolder.GetListItems(过滤器);

非常基本的东西。尽量避免使用
Filter
类,因为它在2009年被弃用,并且尽可能多地使用GetListItems,因为获取列表总是更快

公共类GetComponentsInSameFolder:ITemplate
{
公共无效转换(引擎、包)
{
TemplatingLogger log=TemplatingLogger.GetLogger(GetType());
if(package.GetByName(package.ComponentName)==null)
{
log.Info(“此模板应仅与组件模板一起使用。在包中找不到组件,正在退出”);
返回;
}
var c=(Component)engine.GetObject(package.GetByName(package.ComponentName));
var container=(文件夹)c.OrganizationalItem;
var filter=neworganizationalitemsfilter(engine.GetSession()){ItemTypes=new[]{ItemType.Component};
//如果我们只需要有限的元素,那么使用GetListItems总是更快
foreach(container.GetListItems(过滤器)中的XmlNode节点)
{
字符串componentId=node.Attributes[“ID”].Value;
字符串组件标题