Umbraco关系类型

时间:2014-02-13 16:27:12

标签: umbraco umbraco6

在Umbraco 6.1.6的Developer部分中,有一个 Relation Types 节点。

任何人都可以解释什么是关系类型,以及它们是否具有实际应用。我看过一些文档,但仍然不确定为什么我可能需要使用它们。

它们在v6和v7中是否仍然相关?

1 个答案:

答案 0 :(得分:5)

我最近开始记录Relations Service,它应该提供一些有关您可以用它做什么的见解。我偶尔使用它来维护内容树中节点之间的关系。

如果您在Umbraco中复制节点,则可以选择将新节点与使用名为“Relate Document On Copy”的关系类型的原始节点相关联。例如,使用该关系,您可以挂钩事件(如Save事件),每当更新父事件时,您还可以更新相关的子节点。此技术有时用于需要跨每种语言同步内容的多语言网站。

以下是我正在处理的最近项目中的缩写示例,其中可能会创建重复出现的事件。我们需要知道系列中的第一个事件以及事件的所有后续事件(子项)。

  public class Events : ApplicationEventHandler
  {
    protected override void ApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
    {
      ContentService.Saved += ContentServiceSaved;
    }

    private void ContentServiceSaved(IContentService sender, SaveEventArgs<IContent> e)
    {
        var rs = ApplicationContext.Current.Services.RelationService;
        var relationType = rs.GetRelationTypeByAlias("repeatedEventOccurence");

        foreach (IContent content in e.SavedEntities)
        {
            var occurences = rs.GetByParentId(content.Id).Where(r => r.RelationType.Alias == "repeatedEventOccurence");
            bool exists = false;

            foreach (var doc in occurences.Select(o => sender.GetById(o.ChildId)))
            {
                // Check if there is already an occurence of this event with a matching date
            }

            if (!exists)
            {
                var newDoc = sender.Copy(content, eventsDoc.Id, true, User.GetCurrent().Id);

                // Set any properties you need to on the new node
                ...

                rs.Relate(content, newDoc, relationType);
            }       
        }
    }
}