【问题标题】:Get all SmartForm items from Ektron 9 in a Taxonomy在分类中从 Ektron 9 中获取所有 SmartForm 项目
【发布时间】:2014-05-01 18:41:05
【问题描述】:

我正在使用 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 获取它,这效率不高)

我错过了什么?我今天正在积极开展这项工作,并将在此处发布我的发现。

目前使用的参考资料:

编辑

在下面发布了我刚刚得到它的工作解决方案作为参考,并授予最接近的答案作为接受。感谢大家的帮助。请加入任何改进;)

【问题讨论】:

  • 完全正确 - 您想使用 ContentTaxonomyCriteria 和 ContentManager。 TaxonomyItem 对象和管理器更像是获取内容和分类之间关系的属性。
  • 如果您有兴趣,用例是常见问题解答。许多单独的问题可以在一个或多个分类法中,根据分类法拉入一个小部件并按标题排序 - 因此可以有一个通用、全部等的常见问题解答小部件。
  • 注 2,也发布到带有标签 #ektron 的推特(在这篇文章中阅读过它:stackoverflow.com/questions/10747792/…) - 我会向其他人推荐这种方法 - egandalf 几乎立刻回复了 TQ ;)
  • 基于您的代码的一个想法 - 由于框架 api 返回一个 List,因此从您的方法返回 IEnumerable 可能会产生误导。您的结果是 List,返回 IEnumerable 可能会给人一种尚未枚举的印象。这里有一个很好的讨论这样的含义:stackoverflow.com/questions/7969354/…

标签: ektron


【解决方案1】:

对于信息,这是我想出的。注意到 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;
}

【讨论】:

    【解决方案2】:

    我建议将 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 的属性。当内容基于智能表单时,此属性将为非空且具有正(非零)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;
        }
    }
    

    这样我可以获取内容(或内容列表)并在代码中非常快速地检查它是否基于智能表单:

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

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

    【讨论】:

    • 我还没有玩过 ContentProperty.XmlConfigurationId ...这是否会按智能表单类型过滤输出? ...快速查找如何从 c# 类型或名称获取智能表单类型 ID ...
    • 是的,XmlConfigurationId 与内容块的智能表单id 相同。我已更新我的答案以提供更多详细信息。
    • 如何从使用 c# 的 smartform 创建的内容中删除元数据条目?
    【解决方案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)。

    【讨论】:

    • 您可以使用与此类似的代码,但使用 ContentTaxonomyCriteria 允许您在单个标准和请求中混合分类 ID 和内容属性。根本不要使用 TaxonomyItemManager。
    • 你可以看出我不经常使用分类法。谢谢!
    • 感谢@MiracleManS ...几乎可以正常工作。当我看到它时,我会发布工作解决方案。为您的提示 +1。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多