从分类中获取Ektron 9中的所有SmartForm项目

Rus*_*kin 2 ektron

我正在使用Ektron CMS 9.0版

我有智能表单内容,分配给分类法,例如,我可能有五个智能表单内容项(全部相同)分配给分类法,另外三个分配给不同的分类法:

我需要从分类法中获取智能表单类型的所有内容:

public IEnumerable<T> GetListOfSmartFormFromTaxonomy<T>(long taxonomyId, bool isRecursive) where T : class
{
  // TODO
}
Run Code Online (Sandbox Code Playgroud)

根据以下链接,我的工作是:

public IEnumerable<TaxonomyItemData> GetListOfSmartFormFromTaxonomy(long taxonomyId)
{
    TaxonomyItemCriteria criteria = new TaxonomyItemCriteria();
    criteria.AddFilter(TaxonomyItemProperty.TaxonomyId, CriteriaFilterOperator.EqualTo, taxonomyId);

    TaxonomyItemManager taxonomyItemManager = new TaxonomyItemManager();
    List<TaxonomyItemData> taxonomyItemList = taxonomyItemManager.GetList(criteria);

    return taxonomyItemList;
}
Run Code Online (Sandbox Code Playgroud)

但这只是获取项目的标题和ID,而不是智能表单数据本身.

作为一个Ektron新手,我不知道如何只使用一个调用来获取一个Smart Form类型的所有项目(而不是循环遍历每个项目并通过ID获取它是无效的)

我错过了什么?我今天积极致力于此,并将在此发表我的发现.

目前使用的参考文献:

编辑

将我刚刚获得的工作解决方案发布为fyi,并将最接近的答案视为已接受.谢谢大家的帮助.请提出任何改进;)

Bri*_*ver 6

我建议将ContentTaxonomyCriteria与ContentManager一起使用.

long smartFormId = 42;
long taxonomyId = 127;
bool isRecursive = true;

var cm = new ContentManager();

var taxonomyCriteria = new ContentTaxonomyCriteria();
taxonomyCriteria.AddFilter(ContentProperty.XmlConfigurationId, CriteriaFilterOperator.EqualTo, smartFormId);
taxonomyCriteria.AddFilter(taxonomyId, isRecursive);

var content = cm.GetList(taxonomyCriteria);
Run Code Online (Sandbox Code Playgroud)

UPDATE

ContentData对象具有一个名为的属性XmlConfiguration.当内容基于smartform时,此属性将为非null并且具有正(非零)Id: content[0].XmlConfiguration.Id例如.

我经常在我的代码中添加一个扩展方法,告诉我给定的ContentData是否基于智能表单:

public static class ContentDataExtensions
{
    public static bool IsSmartFormContent(this ContentData content)
    {
        return content != null && content.XmlConfiguration != null && content.XmlConfiguration.Id > 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

这样我就可以获取内容(或内容列表)并在代码中快速检查它,看它是否基于smartform:

foreach (var contentData in contentList)
{
    if (contentData.IsSmartFormContent())
    {
        // Do smart-form stuff here...
    }
}
Run Code Online (Sandbox Code Playgroud)

当然,如果您的内容来自框架api,并且您使用的是基于特定XmlConfigurationId选择的条件对象,那么理论上您不必使用它,但它仍然经常派上用场.