我有几个使用smartform创建的提供程序:
ID Title
90 Doctor A
102 Doctor B
10 Doctor C
26 Doctor D
495 Doctor E
我在CMS中有三个集合:
ID Title of Collection
12 IM Collection
43 UR Collection
9 EC Collection
以下代码检索适合我的集合的内容:
ContentManager contentManager = new ContentManager();
ContentCollectionCriteria criteria = new ContentCollectionCriteria(ContentProperty.Id, EkEnumeration.OrderByDirection.Ascending);
criteria.AddFilter(Convert.ToInt64(ddlCollection.SelectedValue));
List<ContentData> contentList = contentManager.GetList(criteria);
我将包括以下变量:
iPName (int) = the provider ID
sColl (List<string>) = The collection(s) the provider should go in
如何为每个提供程序编写递归函数,该函数将采用iPName,从提供程序所在的任何集合中删除,并使用sCol将提供程序添加到集合中。
答案 0 :(得分:0)
由于您要修改集合,因此您需要查看Collection specific APIs
管理器类位于Ektron.Cms.Framework.Organization
命名空间内。
基本理念是:
iPName
,请获取此提供商目前所在的馆藏列表sColl
进行比较(例如,采取差异)这里有一些粗略的代码可以帮助您入门(未经测试)
//this is your existing code, wrapped into a function
List<ContentData> GetCollectionContent(long collectionID)
{
var contentManager = new ContentManager();
var criteria = new ContentCollectionCriteria(ContentProperty.Id, EkEnumeration.OrderByDirection.Ascending);
criteria.AddFilter(collectionID);
return contentManager.GetList(criteria);
}
//builds the mapping from step #1 above
Dictionary<ContentData, List<ContentCollectionData>> BuildCollectionMapping()
{
//get all the collections in the system (using a new, "default" criteria object)
var collectionManager = new CollectionManager();
var allCollections = collectionManager.GetList(new CollectionCriteria());
//build the mapping, associate a content item with each collection it is in
var mapping = new Dictionary<ContentData, List<ContentCollectionData>>();
foreach (var collection in allCollections)
{
var contentItems = GetCollectionContent(collection.Id);
foreach (var contentItem in contentItems)
{
if (!mapping.ContainsKey(contentItem))
{
mapping.Add(contentItem, new List<ContentCollectionData>());
}
mapping[contentItem].Add(collection);
}
}
return mapping;
}
//steps #2-3 from above, using the variables you defined
void Reconcile(long iPName, List<string> sColl)
{
var mapping = BuildCollectionMapping();
if (mapping.Keys.Any(content => content.Id == iPName))
{
var collections = mapping.Single(kvp => kvp.Key.Id == iPName).Value;
var collectionTitles = collections.Select(c => c.Title);
//these are the names of collections to which this content item must be added
var toAdd = sColl.Except(collectionTitles);
//these are the names of collections from which the content item must be deleted
var toDelete = collectionTitles.Except(sColl);
}
}
我会留给你填写#4-5的详细信息。
稍微提一下,我想指出Ektron中的ID应始终表示为 long (您的iPName
上方的示例为int
)。
我们刚刚修改了我们的环境,现在正在64位范围内生成内容ID(例如53687091658
),我们遇到了一些情况,其中草率解析为int
在运行时错误。我提供的示例代码使用长。