2012-03-28 23 views
6

Tôi đang sử dụng Dịch vụ cốt lõi trên Tridion 2011. Tôi muốn tạo cấu trúc thư mục, sau đó tạo thành phần trong cấu trúc đó.Cách tạo cấu trúc thư mục trong SDL Tridion 2011 SP1 bằng Dịch vụ lõi

Ví dụ: Path of cấu trúc thư mục:/ABCD/DEFG/aaaaa

Nếu thư mục tồn tại, chúng ta không cần tạo thư mục. Nếu nó không tồn tại, chúng ta phải tạo nó và tạo thành phần trong đó.

Tôi biết cách tạo thành phần trong thư mục có URI.

+1

@Muzimil - bạn có thể muốn xem xét cam kết đến các trang web Tridion SE - Rất nhiều những câu hỏi sẽ là thích hợp có: http://area51.stackexchange.com/proposals/38335/tridion?referrer=eo63snjNlUWNn9xqeeO2NA2 –

Trả lời

6

Sau đây là đoạn code tôi sử dụng khi tôi cần phải tìm lấy hoặc Tạo thư mục với CoreService SDL Tridion của. Đó là một phương pháp đệ quy đơn giản để kiểm tra sự tồn tại của thư mục hiện tại. Nếu nó không tồn tại, nó đi vào GetOrCreate thư mục mẹ và như vậy cho đến khi nó tìm thấy một đường dẫn hiện có. Trên đường ra khỏi đệ quy, nó chỉ đơn giản là tạo ra các thư mục mới liên quan đến cha mẹ trực tiếp của chúng.

Lưu ý: phương pháp này không kiểm tra đầu vào folderPath. Thay vào đó, nó giả định nó đại diện cho một con đường hợp lệ.

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

Cảm ơn bạn. Tôi làm việc rất tốt. – Patan

5

Tôi sẽ sử dụng IsExistingObject - chuyển vào URL WebDAV - để xem Thư mục đã tồn tại chưa. Nếu nó trả về false, bạn có thể tiếp tục và tạo thư mục.

Edit: Dưới đây là một số mã giả nhanh chóng ...

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

bạn có thể vui lòng chia sẻ tên đầy đủ của lớp và chia sẻ cách tạo thư mục. – Patan

+0

Đó là một phương pháp trên máy khách dịch vụ cốt lõi. Dù sao, tôi đã thêm một số mã ví dụ nhanh từ bộ nhớ. Hy vọng rằng đó là đủ để giúp bạn đi. –

3

Đây là những gì chúng tôi được sử dụng trên một trong những dự án của chúng tôi để tạo các thư mục cho một con đường.

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

Vì vậy, bạn muốn gọi nó với một cái gì đó như thế này:

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.Cảm ơn bạn đã trả lời. Sẽ rất vui nếu bạn có thể chia sẻ với tôi cách tạo cấu trúc thư mục.Ví dụ:/webdav/MyPublication/Building% 20Blocks/Folder1/Folder2 Tôi phải tìm kiếm đường dẫn đã cho, nếu đường dẫn không tồn tại, thì tôi phải tạo cấu trúc thư mục.Được rồi nếu "Folder1" không tồn tại, tôi cần tạo nó Tôi phải dựa vào con đường duy nhất. – Patan

+1

Đó là chính xác những gì mã này. Bây giờ tôi đã thêm một ví dụ về cách gọi phương thức. Nếu bạn gặp sự cố khi làm việc, vui lòng chia sẻ mã mà bạn đã viết và nơi bạn đang gặp khó khăn. –

+0

Cảm ơn Frank. Tôi có một số nghi ngờ trong mã. 1.Lựa gốc trong quá trình gọi chỉ ra tên của thư mục gốc/thư mục gốc mà chúng tôi muốn tạo thư mục. 2. Vì chúng ta đang sử dụng phương thức folders.RemoveAt (0), nếu thư mục trong đường dẫn tồn tại, nó có trả về dữ liệu thư mục hay không. Bởi vì chúng tôi đã loại bỏ nó. Vui lòng chia sẻ câu trả lời của bạn về vấn đề này. Cảm ơn bạn – Patan

2

Đối Tạo một thư mục sử dụng đoạn mã sau khi mẫu ... Bạn sẽ phải kiểm tra xem thư mục tồn tại tất nhiên, mã này cho thấy làm thế nào để tạo một thư mục trong một thư mục

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

Dưới đây là một số mã cho các phương pháp được tham chiếu .... sử dụng Hệ thống; bằng System.Collections.Generic; bằng System.Linq; bằng System.Text; sử dụng CoreWebService.ServiceReference1; sử dụng CoreWebService.Properties; bằng System.Xml; bằng 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

Cảm ơn bạn đã đánh giá Frank, đánh giá cao – Miguel

Các vấn đề liên quan