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

时间:2014-03-24 12:02:45

标签: ektron

我使用的是Ektron CMS 9.0版

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

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

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

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

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;
}

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

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

我错过了什么?我今天正在积极研究这个问题,并将在此发表我的研究结果。

到目前为止使用的参考文献:

修改

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

3 个答案:

答案 0 :(得分: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);

更新

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

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

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

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

foreach (var contentData in contentList)
{
    if (contentData.IsSmartFormContent())
    {
        // Do smart-form stuff here...
    }
}

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

答案 1 :(得分:3)

我不太确定我理解你的组织结构,但你确实能够自己做直接针对数据库选择的子句。

在这种情况下,我不会使用TaxonomyItemManager,我会使用具有特殊条件的ContentManager:

ContentManager cApi = new ContentManager();
var criteria = new ContentCriteria();
criteria.AddFilter(ContentProperty.Id, CriteriaFilterOperator.InSubClause, "select taxonomy_item_id where taxonomy_id = " + taxonomyId);
criteria.AddFilter(ContentProperty.XmlConfigurationId, CriteriaFilterOperator.EqualTo, smartformTypeId);
var yourContent = cApi.GetList(criteria);

这应该做你要求的事情(特别是抓住具有分类法成员的内容,而只是具体的SmartForm配置)。值得注意的是,如果您的分类仅包含该XmlConfiguration,则不需要第二个条件(XmlConfigurationId)。

答案 2 :(得分:0)

有关信息,这就是我想出的。注意到Brian Oliver对List的评论,但使用其他开发者的模式,可以稍后进行重构。

为了澄清,我们正在从智能表单生成的XSD中创建类,因此可以使用智能表单类型。您的使用可能比我们的更简单。

public IEnumerable<T> GetListOfSmartFormFromTaxonomy<T>(long taxonomyId, bool isRecursive = false) where T : class
{
    long smartFormId = GetSmartFormIdFromType(typeof(T));
    // checks here for smartformid=0

    ContentManager contentManager = new ContentManager();
    ContentTaxonomyCriteria criteria = new ContentTaxonomyCriteria();

    // Smart Form Type
    criteria.AddFilter(ContentProperty.XmlConfigurationId, CriteriaFilterOperator.EqualTo, smartFormId);

    // Taxonomy
    criteria.AddFilter(taxonomyId, isRecursive);

    List<ContentData> contentDataList = contentManager.GetList(criteria);
    IEnumerable<T> smartFormList = ConvertToSmartFormList<T>(pressReleaseDataList);

    return smartFormList;
}

private IEnumerable<T> ConvertToSmartFormList<T>(List<ContentData> contentDataList) where T : class
{
    List<T> smartFormList = new List<T>();
    if (contentDataList != null && contentDataList.Count > 0)
    {
        foreach (ContentData contentData in contentDataList)
        {
            if (contentData.IsSmartFormContent())
            {
                T smartForm = GetDeserializedContent<T>(contentData.Html);
                if (smartForm != null)
                {
                    PropertyInfo property = smartForm.GetType().GetProperty("ContentId");
                    if (property != null)
                    {
                        property.SetValue(smartForm, contentData.Id, null);
                    }

                    smartFormList.Add(smartForm);
                }
            }
        }
    }

    return smartFormList;
}

private long GetSmartFormIdFromType(Type smartFormType)
{
    SmartFormConfigurationManager manager = new SmartFormConfigurationManager();
    SmartFormConfigurationCriteria criteria = new SmartFormConfigurationCriteria();

    // Note: Smart Form Title must match the type's name, i.e. no spaces, for this to work
    criteria.AddFilter(SmartFormConfigurationProperty.Title, CriteriaFilterOperator.EqualTo, smartFormType.Name);

    List<SmartFormConfigurationData> configurationData = manager.GetList(criteria);

    if (configurationData == null || configurationData.Count == 0)
    {
        return 0;
    }

    return configurationData.First().Id;
}