如何使用核心服务在SDL Tridion 2011 SP1中创建文件夹结构

本文关键字:SP1 创建 文件夹 结构 2011 Tridion 核心 何使用 服务 SDL | 更新日期: 2023-09-27 18:29:26

我在Tridion 2011上使用核心服务。我想创建一个文件夹结构,然后在该结构中创建一个组件。

示例:文件夹结构的路径:/AABCD/DEFG/aaaaa

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

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

如何使用核心服务在SDL Tridion 2011 SP1中创建文件夹结构

以下是我需要使用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;
    }
}

我会使用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
}

这是我们在一个项目中用于为路径创建文件夹的方法。

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

对于创建文件夹,请使用以下代码作为示例。。。当然,你必须检查文件夹是否存在,这段代码展示了如何在文件夹中创建文件夹

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

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