Как создать структуру папок в SDL Tridion 2011 SP1 с помощью Core Service - PullRequest
6 голосов
/ 28 марта 2012

Я использую базовую службу в Tridion 2011. Я хочу создать структуру папок, а затем создать компонент в этой структуре.

Пример: Путь к структуре папок: / ABCD / DEFG / aaaaa

Если папка существует, нам не нужно создавать папку. Если он не существует, мы должны создать его и создать в нем компонент.

Я знаю, как создать компонент в папке с URI.

Ответы [ 4 ]

6 голосов
/ 28 марта 2012

Ниже приведен код, который я использую, когда мне нужно получить или создать папки с помощью 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;
    }
}
5 голосов
/ 28 марта 2012

Я бы использовал IsExistingObject - передавая URL-адрес WebDAV - чтобы увидеть, существует ли папка. Если он возвращает 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
}
3 голосов
/ 28 марта 2012

Это то, что мы использовали в одном из наших проектов для создания папок для пути.

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);
2 голосов
/ 29 марта 2012

Для создания папки используйте следующий код в качестве примера ... Конечно, вам придется проверить, существует ли папка, этот код показывает, как создать папку в папке

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