2012-03-28 48 views
6

我在Tridion 2011上使用Core Service。我想创建一个文件夹结构,然后在该结构中创建一个组件。如何使用Core Service在SDL Tridion 2011 SP1中创建文件夹结构

例子: 路径文件夹结构:/ ABCD/DEFG/AAAAA

如果该文件夹存在,我们不需要创建文件夹。如果它不存在,我们必须创建它并在其中创建组件。

我知道如何在具有URI的文件夹中创建组件。

+1

@Muzimil - 你可能要考虑提交到外表套上SE网站 - 很多这些问题将是适当的有:http://area51.stackexchange.com/proposals/38335/tridion?referrer=eo63snjNlUWNn9xqeeO2NA2 – 2012-03-28 16:47:52

回答

6

以下是当我需要获取或者创建拥有支持SDL Tridion的CoreService文件夹我使用的代码。这是一个简单的递归方法,用于检查当前文件夹的存在。如果它不存在,它将进入GetOrCreate父文件夹等等,直到它找到一个现有的路径。在递归的途中,它只是创建相对于其直接父对象的新文件夹。

注意:此方法不检查输入folderPath。相反,它假定它代表一条有效的路径。

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

谢谢你,他工作得很好。 – Patan 2012-03-30 09:57:46

5

我会使用IsExistingObject - 传入WebDAV URL - 查看文件夹是否已经存在。如果它返回false,则可以继续并创建该文件夹。

编辑:下面是一些快速的伪代码...

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

可以请您分享课程的完整名称并分享如何创建文件夹。 – Patan 2012-03-28 10:06:03

+0

这是核心服务客户端上的一种方法。无论如何,我从内存中添加了一些快速示例代码。希望这足以让你走。 – 2012-03-28 10:19:20

3

这就是我们用我们的项目之一,以创建一个路径文件夹中。

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

所以,你会像这样的东西来调用它:

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.Thank给你答案。如果你能分享我如何创建文件夹结构,这将是一件乐事。例如:/ webdav/MyPublication/Building%20Blocks/Folder1/Folder2我必须搜索给定的路径,如果给定的路径不存在,那么我必须创建一个文件夹结构。即使“Folder1”不存在,我需要创建它我只能依靠路径。 – Patan 2012-03-28 13:34:20

+1

这完全是这个代码所做的。我现在添加了一个如何调用该方法的示例。如果您在使用该软件时遇到问题,请分享您编写的代码以及您卡住的位置。 – 2012-03-28 14:20:50

+0

谢谢弗兰克。我在代码中有一些疑问。 1.调用进程中的根表示我们要创建文件夹的发布/根文件夹的名称。 2.当我们使用folders.RemoveAt(0)方法时,如果路径中的文件夹存在,它是否返回文件夹数据。因为我们已经删除它。 请在此分享您的回应。 谢谢 – Patan 2012-03-28 17:28:57

2

对于创建一个文件夹使用以下代码为样本... 你将不得不检查过程中的文件夹存在,此代码显示了如何在文件夹内创建文件夹

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

以下是引用的方法的一些代码.... using System; using System.Collections.Generic;使用System.Linq的 ; using System.Text; 使用CoreWebService.ServiceReference1; 使用CoreWebService.Properties;使用System.Xml的 ; using 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

感谢评论弗兰克,赞赏 – Miguel 2012-03-30 13:34:52

相关问题