2012-09-29 3 views
1

Я работаю на Tridon 2009 с использованием .NET Templating C# 2.0Чтения всех компонентов из папки и подпапки

мне нужно прочитать все компоненты из папки и ее подпапок.

Если в моем коде я пишу:

OrganizationalItem imageFolder = 
    (OrganizationalItem)m_Engine.GetObject(comp.OrganizationalItem.Id); 

Я могу прочитать все компоненты в подкаталоге от места, где компонент индикатор присутствует, но я не могу читать другие компоненты, присутствующие в папка с индикатором.

Но если я пишу

OrganizationalItem imageFolder = (OrganizationalItem)m_Engine.GetObject(
           comp.OrganizationalItem.OrganizationalItem.Id); 

тогда я могу читать только папку, в которой компонент индикатор присутствует.

Ниже приведен мой код.

XmlDocument doc = xBase.createNewXmlDocRoot("ImageLibrary"); 
XmlElement root = doc.DocumentElement; 


Filter filter = new Filter(); 
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(filter); 

foreach (XmlElement itemImg in itemList) 
{ 
    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(filter); 

    doc = this.createImageNodes(imageLibs, doc, filter, comp); 
    foreach (XmlElement imglib in imageLibsList) 
    { 
     XmlElement imageroot = doc.CreateElement("Image"); 
     XmlElement uploadeddateNode = doc.CreateElement("DateUploaded"); 
     Component imgComp =  
       (Component)m_Engine.GetObject(imglib.GetAttribute("ID")); 
    } 
} 

Прошу предложить.

ответ

6

Я вижу много лишнего кода на вашем фрагменте кода относительно вопроса «Чтение всех компонентов из папки и подпапки»

Но отвечая на сам вопрос, когда вы делаете:

OrganizationalItem imageFolder = (OrganizationalItem)m_Engine.GetObject(comp.OrganizationalItem.Id); 

Ваш являются не будучи в состоянии прочитать компоненты, присутствующие в этой папке, потому что вы ранее настроили фильтр к папкам только на следующей строке:

filter.Conditions["ItemType"] = ItemType.Folder; 

Решение:

Если вы хотите получить все компоненты в папке «индикатор компонента» и ниже, необходимо установить фильтр на первый поиск следующим образом:

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); 
+0

Большое спасибо. Сегодня у меня нет времени, чтобы это исправить. Я проверю это и вернусь к вам. еще раз спасибо – user1678234

0

Я думаю, что вы хотите собирать вспомогательные папки и рекурсивно вызывать свою функцию для каждого из них, что похоже на то, чего вы пытаетесь достичь.

Эта функция называется createImageNodes() и где вы устанавливаете imageLibsList?

Похоже, вы рассматриваете каждый элемент как папку в своем первом цикле, а что же касается компонентов?

+0

Да, мне нужно прочитать все компоненты, в которых присутствует моя индикаторная составляющая. Кроме того, прочитайте все компоненты в папках и там вложенные папки, в которых присутствует индикатор. – user1678234

2

Pretty basic stuff. Старайтесь избегать использования класса Filter, поскольку он был устарел в 2009 году и максимально использует GetListItems, так как выборки списков ВСЕГДА быстрее.

public class GetComponentsInSameFolder : ITemplate 
{ 
    public void Transform(Engine engine, Package package) 
    { 
     TemplatingLogger log = TemplatingLogger.GetLogger(GetType()); 
     if (package.GetByName(Package.ComponentName) == null) 
     { 
      log.Info("This template should only be used with Component Templates. Could not find component in package, exiting"); 
      return; 
     } 
     var c = (Component)engine.GetObject(package.GetByName(Package.ComponentName)); 
     var container = (Folder)c.OrganizationalItem; 
     var filter = new OrganizationalItemItemsFilter(engine.GetSession()) { ItemTypes = new[] { ItemType.Component } }; 

     // Always faster to use GetListItems if we only need limited elements 
     foreach (XmlNode node in container.GetListItems(filter)) 
     { 
      string componentId = node.Attributes["ID"].Value; 
      string componentTitle = node.Attributes["Title"].Value; 
     } 

     // If we need more info, use GetItems instead 
     foreach (Component component in container.GetItems(filter)) 
     { 
      // If your filter is messed up, GetItems will return objects that may 
      // not be a Component, in which case the code will blow up with an 
      // InvalidCastException. Be careful with filter.ItemTypes[] 
      Schema componentSchema = component.Schema; 
      SchemaPurpose purpose = componentSchema.Purpose; 
      XmlElement content = component.Content; 
     } 
    } 
} 
Смежные вопросы