Pregunta

Estoy trabajando en Tridon 2009 usando .NET Templating C# 2.0

Necesito leer todos los componentes de las carpetas y su subcarpeta.

Si en mi código escribo:

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

Puedo leer todos los componentes en la subcarpeta desde el lugar donde está presente el componente indicador, pero no puedo leer otros componentes presentes en la carpeta donde está presente el indicador.

Pero si escribo

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

entonces puedo leer solo la carpeta donde está presente el componente indicador.

A continuación se muestra mi código.

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"));
    }
}

Por favor recomiende.

¿Fue útil?

Solución

Veo una gran cantidad de código superfluo en su fragmento con respecto a la pregunta "Lectura de todos los componentes de la carpeta y la subcarpeta"

Pero respondiendo a la pregunta misma, cuando estás haciendo:

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

No se pueden leer los componentes presentes en esa carpeta, ya que anteriormente ha configurado el filtro en las carpetas solo en la siguiente línea:

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

Solución:

Si desea recuperar todos los componentes en la carpeta "Componente indicador" y a continuación, debe configurar el filtro en su primera búsqueda de la siguiente manera:

filter.Conditions["Recursive"] = "true";
filter.Conditions["ItemType"] = ItemType.Component;
filter.Conditions["BasedOnSchema"] = comp.Schema.Id;

y realiza la búsqueda:

OrganizationalItem imageFolder = (OrganizationalItem)m_Engine.GetObject(comp.OrganizationalItem.Id);            
XmlElement itemList = imageFolder.GetListItems(filter);

Otros consejos

Cosas bastante básicas.Trate de evitar el uso Filter clase, ya que quedó obsoleta en 2009, y use GetListItems tanto como sea posible, ya que recuperar listas SIEMPRE es más rápido.

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;
        }
    }
}

Creo que querrías recoger sub carpetas y llamar recursivamente a tu función para cada uno de ellos, lo que parece que lo que estás tratando de lograr.

¿Esta función se llama CreateImagenodes () y dónde configura ImageLibslist?

Parece que está tratando cada artículo como una carpeta en su primer bucle, ¿qué pasa con los componentes?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top