我尝试复制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唯一检查。如果可能的话,我必须创建一个服务。
答案 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的http帖子,当您保存/发布文档时,它已经附加了具有唯一标识符的节点名称(即(1))
如果/当我开始编写该流程时,我将更新此问题。