Umbraco 9에서 고유하지 않은 노드 이름 활성화

7343 단어 umbraco
기본적으로 Umbraco는 동일한 부모 아래에 동일한 이름을 가진 두 개의 문서를 허용하지 않습니다. 나는 그것을 바꿀 필요가 있었다.

이유가 궁금하시다면...



(없으면 skip to the how )

제 경우에는 뉴스 기사와 이벤트 페이지를 위한 것입니다.

내 뉴스 및 이벤트 페이지는 사용자 정의 IUrlProviderIContentFinder ( as per the docs )를 사용하므로 내 뉴스 및 이벤트 페이지는 다음과 같은 URL을 가질 수 있습니다.
/events/2022/03/16/my-awesome-event/
이름이 같은 이벤트가 여러 개 있지만 모든 이벤트를 백오피스의 단일 상위 노드 아래에 유지하고 싶습니다. 기본적으로 백오피스의 동일한 노드 아래에 "My Awesome Event"라는 두 개의 이벤트를 생성하면 다음과 같이 "My Awesome Event"및 "My Awesome Event (1)"로 끝납니다.



URL도 변경됩니다./events/2022/03/16/my-awesome-event//events/2022/04/20/my-awesome-event-1/
날짜 "폴더"를 사용하고 저장할 때 기사/이벤트를 이동하여 이를 자동화할 수 있지만 원하지 않거나 필요하지 않은 추가 노드와 계층이 추가됩니다. 이 모든 것을 하나의 목록 보기에 포함하면 훨씬 더 멋진 편집기 환경을 만들 수 있습니다(이 사이트에서).

약간의 인터넷 검색은 v7에서 구성에서 ensureUniqueNaming를 false로 설정하는 옵션이 있음을 상기시켰습니다. 그것은 v8에서 사용할 수 없었고 어쨌든 약간 무딘 도구였습니다.

v9(아마도 v8에서도 가능하지만 확인하지는 않았지만)에는 더 똑똑한 방법이 있다는 것이 밝혀졌습니다...

방법은 다음과 같습니다.

EnsureUniqueNaming is still a property DocumentRepository 및 저장소에서 고유하지 않은 이름을 허용하는지 확인하는 데 사용됩니다. false로 설정되어 있고 이 클래스를 상속하고 단순히 true로 설정하는 방법에 대해 생각했습니다. 하지만 그렇게 하면 모든 콘텐츠에 대해 true로 설정되고 위험해 보입니다. 내 뉴스/이벤트의 고유하지 않은 이름이 중요하지 않은지 확인하기 위한 라우팅이 있지만 편집자가 다른 곳에서 중복된 이름으로 페이지를 만들면 작동하지 않습니다.

다행스럽게도 overridable method이 있습니다. 이는 우리가 조금 더 똑똑해질 수 있음을 의미합니다 - EnsureUniqueNodeName .

이 방법에서는 상위 ID에 액세스할 수 있으므로 콘텐츠를 저장할 위치를 확인하고 조건부로 중복 노드 이름을 허용할지 여부를 결정할 수 있습니다.

내가 한 일은 다음과 같습니다.

public class CustomDocumentRepository : DocumentRepository
{
    private static readonly string[] allowNonUniqueChildNames = { EventsPage.ModelTypeAlias, NewsPage.ModelTypeAlias };

    // constructor ommited for brevity

    protected override string EnsureUniqueNodeName(int parentId, string nodeName, int id = 0)
    {
        var parent = this.Get(parentId);

        if (allowNonUniqueChildNames.InvariantContains(parent.ContentType.Alias))
        {
            return nodeName;
        }

        return base.EnsureUniqueNodeName(parentId, nodeName, id);
    }
}


이 경우 콘텐츠 유형 별칭은 내 ModelsBuilder 모델에서 가져옵니다.

Dependency Injection 덕분에 기존 저장소를 사용자 지정 저장소로 교체하는 것이 매우 쉽습니다. 다음은 startup.cs를 사용하는 예입니다. AddUmbraco 확장 뒤에 서비스를 추가하거나 your own builder extension method에 추가해야 합니다.

public void ConfigureServices(IServiceCollection services)
{
    services.AddUmbraco(_env, _config)
        .AddBackOffice()
        .AddWebsite()
        .AddComposers()
        .Build();
        .Build();

    services.AddUnique<IDocumentRepository, CustomDocumentRepository>();
}



결과:


이게 더 나을 수도...



이 접근 방식은 부모 노드를 기반으로 고유하지 않은 이름의 범위를 지정하는 것이 타당한 경우에만 실제로 작동합니다. 유형을 기반으로 할 필요는 없지만 속성 값 등이 될 수 있습니다. 제 경우에는 "이벤트"노드 하위 이벤트 및 "뉴스"노드만 하위 뉴스 기사만 있으므로 괜찮습니다.

이상적으로는 내가 저장하는 노드의 유형이나 내용과 같은 더 많은 것을 고려하고 싶지만 이 방법은 이름 외에 내용에 대해 아무것도 모릅니다. 다른 방법을 재정의할 수 있지만 코드 중복이 많이 발생합니다(모든 개인 방법을 살펴보세요). 고유한 이름이 적용되는 방법과 시기를 제어할 수 있도록 여기에 알림을 추가하거나 최소한 콘텐츠 자체를 고려하도록 메서드를 오버로드하는 범위가 있을 수 있습니다. 이에 대한 PR을 할 수 있게 되면 이 게시물을 업데이트하겠습니다.

좋은 웹페이지 즐겨찾기