【问题标题】:Dealing with Parent/Child Content Relationships in Umbraco在 Umbraco 中处理父/子内容关系
【发布时间】:2016-10-18 10:13:46
【问题描述】:

我在 Umbraco 中有一个设置,我希望一些不同的文档类型对编辑器具有层级关系。因此,我将文档类型 A 配置为允许文档类型 B 的“子代”。我还将文档类型 B 配置为允许文档类型 C 的“子代”。

在视图的列表中,我想显示所有共享 A 类型特定祖先的 C 类型文档(即,此处 B 类型的直接父级无关)。我在控制器中使用了类似这样的代码:

var rootChildren = Umbraco?.TypedContent(RootId)?.Children;
var items = rootChildren
    .SelectMany(rc => rc?.Children?
        .Where(c => c != null
            && c.GetPropertyValue<Boolean>(FieldNames.SomeValue)));
var viewModels = allItems.Select(p => new SomeViewModel
    {
        // Object initialization code
    });
return viewModels.ToArray();

RootId 的值是从 ConfigurationSection 读取的,因此可以针对不同的环境进行更改或不相等。

我觉得一个缺点是我的代码与我为后台编辑器设置的细节纠缠在一起。我想我可以通过使用像IEnumerable&lt;IPublishedContent&gt;.DescendantsOrSelf(SomeDocumentTypeAlias) 这样的“软”选择方法来部分解决这个问题。 (我认为在使用任何 CMS 时,与文档类型相关联是一种照常业务的麻烦。)

然而,像DescendantOrSelf 这样的“软”选择方法并不能解决使用哪个节点作为起点的问题。因为站点根目录中可以有任意数量的 A 类内容,所以我不能按文档类型来分类。

此外,由于 Umbraco 的节点 ID 似乎不可预测,在开发人员和其他环境之间共享内容,我对基于配置的解决方案并不完全满意,因为从版本控制的角度来看它并不完美。

虽然我相当精通 ASP.NET MVC 等,但我对 Umbraco 的最佳实践知之甚少,所以这就是我要问的;作为经验丰富的 Umbraco 开发人员,您将如何实施这样的事情?

【问题讨论】:

    标签: umbraco umbraco7


    【解决方案1】:

    不完全确定我明白为什么这是一个问题,但这里是……抱歉,如果我误解了一些东西:-/

    AFAIK,你应该能够从这样的查询中得到你想要的:

    Umbraco?.TypedContent(ParentId)?.Descendants().OfTypes("yourDocType")
    

    关于配置(如何最好地获取 RootId),您可以在根节点 doctype(或与要显示列表的位置相关的其他位置)上创建节点选择器属性,从而选择要用作“根”的节点"/父母。

    这样,如果开发人员共享数据库,节点 ID 将被设置并正常工作,当您部署代码时,每个环境都将通过后端/数据库设置自己的 ID。

    如果每个站点只设置一个节点 id,则非常类似于“设置并忘记它”的场景,但如果要使用多个列表,编辑者自己选择父节点很容易。

    【讨论】:

    • 感谢您的反馈。我的编辑环境中确实有一些配置选项,为此添加节点选择器似乎是一个不错的建议。我还选择了OfTypes() 选项。如果它成为一个问题,我会处理它,它提供的灵活性是可取的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-30
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多