我在Tridion 2011上使用Core Service。我想创建一个文件夹结构,然后在该结构中创建一个组件。如何使用Core Service在SDL Tridion 2011 SP1中创建文件夹结构
例子: 路径文件夹结构:/ ABCD/DEFG/AAAAA
如果该文件夹存在,我们不需要创建文件夹。如果它不存在,我们必须创建它并在其中创建组件。
我知道如何在具有URI的文件夹中创建组件。
我在Tridion 2011上使用Core Service。我想创建一个文件夹结构,然后在该结构中创建一个组件。如何使用Core Service在SDL Tridion 2011 SP1中创建文件夹结构
例子: 路径文件夹结构:/ ABCD/DEFG/AAAAA
如果该文件夹存在,我们不需要创建文件夹。如果它不存在,我们必须创建它并在其中创建组件。
我知道如何在具有URI的文件夹中创建组件。
以下是当我需要获取或者创建拥有支持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;
}
}
谢谢你,他工作得很好。 – Patan 2012-03-30 09:57:46
我会使用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
}
可以请您分享课程的完整名称并分享如何创建文件夹。 – Patan 2012-03-28 10:06:03
这是核心服务客户端上的一种方法。无论如何,我从内存中添加了一些快速示例代码。希望这足以让你走。 – 2012-03-28 10:19:20
这就是我们用我们的项目之一,以创建一个路径文件夹中。
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.Thank给你答案。如果你能分享我如何创建文件夹结构,这将是一件乐事。例如:/ webdav/MyPublication/Building%20Blocks/Folder1/Folder2我必须搜索给定的路径,如果给定的路径不存在,那么我必须创建一个文件夹结构。即使“Folder1”不存在,我需要创建它我只能依靠路径。 – Patan 2012-03-28 13:34:20
这完全是这个代码所做的。我现在添加了一个如何调用该方法的示例。如果您在使用该软件时遇到问题,请分享您编写的代码以及您卡住的位置。 – 2012-03-28 14:20:50
谢谢弗兰克。我在代码中有一些疑问。 1.调用进程中的根表示我们要创建文件夹的发布/根文件夹的名称。 2.当我们使用folders.RemoveAt(0)方法时,如果路径中的文件夹存在,它是否返回文件夹数据。因为我们已经删除它。 请在此分享您的回应。 谢谢 – Patan 2012-03-28 17:28:57
对于创建一个文件夹使用以下代码为样本... 你将不得不检查过程中的文件夹存在,此代码显示了如何在文件夹内创建文件夹
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;
}
}
}
感谢评论弗兰克,赞赏 – Miguel 2012-03-30 13:34:52
@Muzimil - 你可能要考虑提交到外表套上SE网站 - 很多这些问题将是适当的有:http://area51.stackexchange.com/proposals/38335/tridion?referrer=eo63snjNlUWNn9xqeeO2NA2 – 2012-03-28 16:47:52