【问题标题】:How to create folder structure in SDL Tridion 2011 SP1 using Core Service如何使用核心服务在 SDL Tridion 2011 SP1 中创建文件夹结构
【发布时间】:2012-04-11 21:33:35
【问题描述】:

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

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

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

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

【问题讨论】:

标签: c# tridion


【解决方案1】:

对于创建文件夹,请使用以下代码作为示例... 当然,您必须检查文件夹是否存在,此代码显示了如何在文件夹中创建文件夹

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

【讨论】:

  • 感谢弗兰克的评论,感谢
【解决方案2】:

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

【讨论】:

    【解决方案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);
    

    【讨论】:

    • @Frank。谢谢你的回答。如果您能分享我如何创建文件夹结构,那将是一种乐趣。示例:/webdav/MyPublication/Building%20Blocks/Folder1/Folder2 我必须搜索给定的路径,如果给定的路径不存在,那么我必须创建一个文件夹结构。即使“Folder1”不存在我也需要创建它.我只能依靠路径。
    • 这正是这段代码的作用。我现在添加了一个如何调用该方法的示例。如果您在让它工作时遇到问题,请分享您编写的代码以及您遇到的问题。
    • 谢谢弗兰克。我对代码有一些疑问。 1.Invoke过程中的根表示我们要在其下创建文件夹的发布/根文件夹的名称。 2.由于我们使用的是folders.RemoveAt(0)方法,如果路径中的文件夹存在,是否返回文件夹数据。因为我们已经在移除它了。请分享您对此的回应。谢谢
    • 1. root 是 FolderData 类型,他通过 tcm id 从客户端对象和 2 获取。是的,代码返回并使用(耶,递归)folder 数据。 RemoveAt(0) 只是删除folders 数组中的第一项并将其计数减一。使用 Pez 分配器进行插图或研究“堆栈”的想法。
    【解决方案4】:

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

    【讨论】:

    • 能否分享一下班级的全名,分享一下如何创建文件夹。
    • 这是核心服务客户端上的一个方法。无论如何,我从内存中添加了一些快速示例代码。希望这足以让您继续前进。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-29
    • 2012-04-21
    • 2012-05-13
    • 1970-01-01
    • 2012-03-24
    相关资源
    最近更新 更多