如何从集合中删除内容并将其添加到另一个

时间:2015-12-16 14:34:42

标签: c# content-management-system ektron

我有几个使用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将提供程序添加到集合中。

1 个答案:

答案 0 :(得分:0)

由于您要修改集合,因此您需要查看Collection specific APIs 管理器类位于Ektron.Cms.Framework.Organization命名空间内。

基本理念是:

  1. 获取供应商与其所在的每个集合之间的映射
  2. 鉴于iPName,请获取此提供商目前所在的馆藏列表
  3. 将#2中的列表与sColl进行比较(例如,采取差异)
  4. 目前不包含提供商的任何馆藏,但应添加
  5. 目前包含提供商但不应删除的任何馆藏
  6. 这里有一些粗略的代码可以帮助您入门(未经测试)

    //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在运行时错误。我提供的示例代码使用