根据对外部doc存储库的查找设置umbraco节点名称

时间:2014-09-19 06:51:17

标签: c# .net umbraco umbraco7

我尝试复制Umbraco(Umbraco v7)在存在具有相同名称的节点时更新节点名称的过程。

但在这种情况下,我构建了一个归档过程,它将节点从Umbraco数据库复制到一个归档数据库中。我面临的问题是尝试使网址独一无二,因为我需要对我的存档进行查找,以确保节点名称是唯一的。

目前,当触发Umbraco保存事件时,我会触发自定义保存方法,该事件会根据存档查找名称并检查URL是否唯一

    protected override void ApplicationStarting(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
    {
        ContentService.Saving += ContentService_Saving;
    }

    void ContentService_Saving(IContentService sender, Umbraco.Core.Events.SaveEventArgs<IContent> e)
    {

        // create the content global ID
        foreach (var entity in e.SavedEntities)
        {
            var url = Helper.GetNiceUrlPath(entity);
            // fetch all items from the database with that name + url
            var result = AppArchiver.GetContentByUrl(Helper.CreateUrlFromName(entity.Name)).ToList();                

            if(result.Any())
            {
                // do something here with the name if possible?
            }

            if (!entity.HasAppId())
            {
                entity.SetAppId();
            }
        }
    }

我无法将“名称”设置为其只读属性...我无法使用entity.SetValue("name", "blah (1)")

进行设置

那么我最好的选择呢?有什么建议?因为我正在用头撞击墙壁搜索Umbraco源代码,试图找出他们是如何做到的。

将这些节点存储在数据库中的原因是因为每月将创建大约300个新节点,并且难以在Umbraco中导航它们。

更新: 好的,所以看起来Umbraco在将项目发回后端进行保存之前,会对角度代码进行URL唯一检查。如果可能的话,我必须创建一个服务。

2 个答案:

答案 0 :(得分:1)

我可能误解了这个问题,但是为什么不使用已经由Umbraco创建的唯一网址,而不是尝试复制该过程?

我在Umbraco安装中设置了类似的东西,触发了Document.BeforeSave事件。 如果我尝试运行以下代码:

private void Document_BeforeSave(Document sender, global::umbraco.cms.businesslogic.PublishEventArgs e)
{
    var url = umbraco.library.NiceUrl(sender.Id);
}

然后网址已经是唯一的,因为Umbraco确保在节点保存之前重命名节点。

答案 1 :(得分:0)

好吧所以看起来它不可能通过umbraco的后端。 我必须在umbraco前端角度代码中编写一个钩子,该代码通过服务查找我的存档,如果url / name是唯一的则返回。

查看umbraco的http帖子,当您保存/发布文档时,它已经附加了具有唯一标识符的节点名称(即(1))

如果/当我开始编写该流程时,我将更新此问题。