Как удалить контент из коллекции и добавить его в другой

У меня есть несколько провайдеров, созданных с помощью 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 ответ

Так как вы хотите изменить коллекции, вам нужно взглянуть на API-интерфейсы, специфичные для коллекции. Класс менеджера находится внутри Ektron.Cms.Framework.Organization Пространство имен.

Основная идея:

  1. Получите соответствие между поставщиками и каждой коллекцией, в которой они находятся
  2. Дано iPName, получите список Коллекций, в которых этот провайдер в настоящее время находится
  3. Сравните список от #2 до sColl (например, принять разницу)
  4. Любые коллекции, которые в настоящее время не содержат поставщика, но должны добавить его
  5. Любые коллекции, которые в настоящее время содержат поставщика, но не должны, удалите его

Вот примерный код, с которого можно начать (не проверено)

//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 всегда должны быть представлены как длинные (ваш пример выше iPName является int). Мы только что изменили нашу среду так, что идентификаторы контента теперь генерируются в 64-битном диапазоне (например, 53687091658) и мы столкнулись с несколькими случаями, когда небрежный анализ int приводит к ошибкам во время выполнения. Пример кода, который я предоставил, использует long.

Другие вопросы по тегам