2012-03-28 6 views
6

Sto utilizzando il servizio principale su Tridion 2011. Voglio creare una struttura di cartelle e quindi creare un componente in quella struttura.Come creare la struttura di cartelle in SDL Tridion 2011 SP1 utilizzando il servizio principale

Esempio: Path of struttura di cartelle:/ABCD/DEFG/aaaaa

Se esiste la cartella, non abbiamo bisogno di creare la cartella. Se non esiste dobbiamo crearlo e creare componenti in esso.

So come creare il componente in una cartella con URI.

+1

@Muzimil - si può prendere in considerazione di impegnarsi al sito Tridion SE - Un sacco di queste domande sarebbe opportuno lì: http://area51.stackexchange.com/proposals/38335/tridion?referrer=eo63snjNlUWNn9xqeeO2NA2 –

risposta

6

Quello che segue è il codice che uso quando ho bisogno di ottenere o creare cartelle con CoreService di SDL Tridion. È un semplice metodo ricorsivo che verifica l'esistenza della cartella corrente. Se non esiste, passa in GetOrCreate alla cartella principale e così via finché non trova un percorso esistente. All'uscita dalla ricorsione, crea semplicemente le nuove cartelle relative al loro genitore immediato.

Nota: questo metodo non controlla l'input folderPath. Piuttosto, presuppone che rappresenti un percorso valido.

private FolderData GetOrCreateFolder(string folderPath, SessionAwareCoreServiceClient client) 
{ 
    ReadOptions readOptions = new ReadOptions(); 

    if (client.IsExistingObject(folderPath)) 
    { 
     return client.Read(folderPath, readOptions) as FolderData; 
    } 
    else 
    { 
     int lastSlashIdx = folderPath.LastIndexOf("/"); 
     string newFolder = folderPath.Substring(lastSlashIdx + 1); 
     string parentFolder = folderPath.Substring(0, lastSlashIdx); 
     FolderData parentFolderData = GetOrCreateFolder(parentFolder, client); 
     FolderData newFolderData = client.GetDefaultData(ItemType.Folder, parentFolderData.Id) as FolderData; 
     newFolderData.Title = newFolder; 

     return client.Save(newFolderData, readOptions) as FolderData; 
    } 
} 
+0

Grazie. Sta lavorando così bene. – Patan

5

Vorrei utilizzare IsExistingObject - passando nell'URL WebDAV - per vedere se la cartella esiste già. Se restituisce false, puoi andare avanti e creare la cartella.

Edit: Ecco alcuni pseudo codice rapido ...

string parentFolderId = @"/webdav/MyPublication/Building%20Blocks"; 

var client = GetCoreServiceClient(); 

if (!client.IsExistingObject(parentFolderId + "/AAA")) 
{ 
    var folder = client.GetDefaultData(2, parentFolderId); 
    folder.Title = "AAA"; 
    client.Save(folder); 
    // Create the other folders and components here 
} 
+0

puoi condividere il nome completo della classe e condividere come creare una cartella. – Patan

+0

È un metodo sul client del servizio principale. Ad ogni modo, ho aggiunto un breve codice di esempio dalla memoria. Spero che sia abbastanza per farti andare. –

3

Questo è quello che abbiamo usato su uno dei nostri progetti per creare cartelle per un percorso.

static FolderData GetOrCreateFolder(List<string> folders, 
            FolderData root, 
            SessionAwareCoreService2010Client client) 
{ 
    var filter = new OrganizationalItemItemsFilterData(); 
    filter.ItemTypes = new [] { ItemType.Folder }; 

    var items = client.GetListXml(root.Id, filter). 
          Elements(TRIDION_NAMESPACE + "Item"); 

    foreach (var element in items) 
    { 
     if (folders.Count == 0) 
     { 
      break; // break from foreach 
     } 
     var titleAttribute = element.Attribute("Title"); 
     var idAttribute = element.Attribute("ID"); 
     if (titleAttribute != null && titleAttribute.Value == folders[0] && 
      idAttribute != null) 
     { 
      // folder exists 
      FolderData fd = client.Read(idAttribute.Value, 
             EXPANDED_READ_OPTIONS) as FolderData; 

      // We just took care of this guy, remove it to recurse 
      folders.RemoveAt(0); 

      return GetOrCreateFolder(folders, fd, client); 
     } 
    } 

    if (folders.Count != 0) 
    { 
     //Folder doesn't exist, lets create it and return its folderdata 
     var newfolder = new FolderData(); 
     newfolder.Title = folders[0]; 
     newfolder.LocationInfo = new LocationInfo { 
      OrganizationalItem = new LinkToOrganizationalItemData { 
       IdRef = root.Id 
      } 
     }; 
     newfolder.Id = "tcm:0-0-0"; 

     var folder = client.Create(newfolder, EXPANDED_READ_OPTIONS) 
           as FolderData; 

     folders.RemoveAt(0); 

     if (folders.Count > 0) 
     { 
      folder = GetOrCreateFolder(folders, folder, client); 
     } 
     return folder; 
    } 
    return root; 
} 

Così ci si richiama con qualcosa di simile:

var root = client.Read("tcm:1-1-2", null) as FolderData; 
var pathParts = "/ABCD/DEFG/aaaaa".Trim('/').Split('/').ToList(); 
var folder = GetOrCreateFolder(pathParts, root, client); 
+0

@ Frank.Grazie per la risposta. Sarebbe un piacere se mi puoi condividere come creare una struttura di cartelle.Esempio:/webdav/MyPublication/Building% 20Blocks/Folder1/Folder2 Devo cercare il percorso dato, se il percorso specificato non esiste, allora devo creare una struttura di cartelle. Anche se "Folder1" non esiste, ho bisogno di crearlo . Devo fare affidamento solo sul percorso. – Patan

+1

Questo è ESATTAMENTE ciò che fa questo codice. Ho aggiunto ora un esempio di come invocare il metodo. Se hai problemi a farlo funzionare, per favore condividi il codice che hai scritto e dove ti stai bloccando. –

+0

Grazie, Frank. Ho alcuni dubbi nel codice. 1.Il root nel processo invoke indica il nome della cartella pubblicazione/root in cui vogliamo creare le cartelle. 2.Come si utilizza il metodo folders.RemoveAt (0), se la cartella nel percorso esiste, restituisce i dati della cartella. Perché lo stiamo già rimuovendo. Si prega di condividere la vostra risposta su questo. Grazie – Patan

2

Per Creare una cartella utilizzare il seguente codice come campione ... Si dovrà verificare se la cartella esiste, naturalmente, questo codice mostra come creare una cartella all'interno di una cartella

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using CoreWebService.ServiceReference1; 

namespace CoreWebService 
{ 
    class CoreWebServiceSamples 
    { 

     public static void createFolder() 
     { 
      string folderWebDavUrl = "/webdav/020%20Content/Building%20Blocks/Content/wstest"; 

      CoreServicesUtil coreServicesUtil = new CoreServicesUtil(); 

      FolderData folderData = coreServicesUtil.getFolderData(folderWebDavUrl); 


      FolderData folderDataChild = folderData.AddFolderData(); 
      folderDataChild.Title = "childFolder"; 

      folderDataChild = (FolderData)coreServicesUtil.coreServiceClient.Save(folderDataChild, coreServicesUtil.readOptions); 
      coreServicesUtil.coreServiceClient.Close(); 
     } 
    } 
} 

Ecco un codice per i metodi a cui si fa riferimento .... using System; utilizzando System.Collections.Generic; utilizzando System.Linq; usando System.Text; utilizzando CoreWebService.ServiceReference1; utilizzando CoreWebService.Properties; usando System.Xml; utilizzando System.Xml.Serialization;

namespace CoreWebService 
{ 

    public class CoreServicesUtil 
    { 
     public CoreService2010Client coreServiceClient; 
     public ReadOptions readOptions; 
     /// <summary> 
     /// 
     /// </summary> 
     public CoreServicesUtil() 
     { 
      this.coreServiceClient = new CoreService2010Client("basicHttp_2010"); 
      this.readOptions = new ReadOptions(); 
     } 


     public FolderData getFolderData(string tcmuri) 
     { 
      FolderData folderData = (FolderData)coreServiceClient.Read(tcmuri, readOptions); 
      return folderData; 
     } 


    } 

    public static class CoreServicesItemCreator 
    { 

     /** 
     * <summary> 
     * Name: AddFolder 
     * Description: returns a new Folder Data created in the folder Data 
     * </summary> 
     **/ 
     public static FolderData AddFolderData(this FolderData folderData) 
     { 
      FolderData childFolder = new FolderData(); 
      childFolder.LocationInfo = getLocationInfo(folderData); 
      childFolder.Id = "tcm:0-0-0"; 
      return childFolder; 
     } 
    } 
} 
+0

Grazie per la recensione Frank, apprezzato – Miguel