"아무것도 하지 않는"Umbraco 패키지를 만든 이유

7678 단어 umbraco
글쎄, 아무것도 아닐 수도 있지만 확실히 null입니다.

이 문제를 고려하십시오. 페이지에 온도 속성이 있고 해당 속성은 선택 사항입니다. 코드에서 값 없음과 0°C를 어떻게 구분합니까?

기본적으로 Umbraco 백오피스의 빈 십진수 또는 정수 속성은 기본값property value converter의 다른 쪽에서 기본값 0으로 나옵니다. 이는 빈 값과 0을 구별할 수 있음을 의미합니다. 추가 업무.

내가 어떻게 하곤 했는지





중첩된 콘텐츠. 기본적으로 작동하며 매우 의도적입니다. 중첩된 콘텐츠 내부의 속성은 필수여야 하며 편집기는 온도 값을 "추가"하거나 비워 둘 수 있습니다.

그러나 그것은 예쁘지 않고 편집자에게는 다소 투박한 흐름입니다.

백오피스는 이미 차이점을 알고 있습니다.



백오피스는 이미 소수/정수 속성에서 빈 값과 0을 구분합니다. 이 스크린샷에서 온도는 "0"이지만 온도 2는 비어 있습니다.


따라서 우리에게 필요한 것은 코드에서 빈 값과 0 값을 구분하는 좋은 방법입니다.

그 값을 nullable로 만드십시오!



이것은 nullable 값이기 때문에 nullable 값 유형을 사용하기에 좋은 곳입니다! Umbraco는 이미 데이터베이스에 NULL로 저장합니다. 따라서 decimal 값 유형을 반환하는 십진수 속성 대신 decimal? 유형을 반환하도록 만들 수 있습니다.

너 스스로해라



이렇게 하려면 null을 반환할 수 있는 새로운 속성 값 변환기를 사용해야 합니다.

상속(또는 데코레이터 패턴 사용)하여 ConvertSourceToIntermedia 클래스의 Umbraco.Cms.Core.PropertyEditors.ValueConverters 메서드를 대체하는 새 클래스를 만듭니다. nullable로 만드는 것은 실제로 매우 간단합니다.

public object? ConvertSourceToIntermediate(
    IPublishedElement owner,
    IPublishedPropertyType propertyType,
    object? source,
    bool preview)
{
    if (source is null)
    {
        return null;
    }

    // is it already a decimal?
    if (source is decimal)
    {
        return source;
    }

    // is it a double?
    if (source is double sourceDouble)
    {
        return Convert.ToDecimal(sourceDouble);
    }

    // is it a string?
    if (source is string sourceString && decimal.TryParse(sourceString, NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign, CultureInfo.InvariantCulture, out decimal d))
    {
        return d;
    }

    // couldn't convert the source value - default to null
    return null;
}


내 사이트는 Nullable Reference Types을 사용하므로 null을 반환하므로 반환 유형을 object에서 object?로 변경해야 합니다. 이것은 내가 단순히 상속할 수 없다는 것을 의미하므로 내 클래스는 실제로 데코레이터입니다.

public class NullableDecimalConverter : IPropertyValueConverter
{
    readonly IPropertyValueConverter coreConverter = new DecimalValueConverter();
...


클래스in my package's repo의 전체 예제를 볼 수 있습니다.

속성 값 변환기는 시작 시 유형 스캔되고 유형에 대해 한 번에 하나의 속성 값 변환기만 가질 수 있으므로 시작 시 DecimalValueConverterNullableDecimalConverter로 바꿔야 합니다.

이를 위한 패키지가 있습니다



10진수 외에도 null 값을 반환할 수 있어야 하는 값 형식을 반환하는 다른 여러 속성 형식이 있습니다.
  • 날짜 선택기 - 기본값은 0001-01-01 00:00:00입니다
  • 정수 - 기본값은 0입니다
  • .
  • 레이블

  • 그래서 저는 Emptiness라는 패키지를 만들었습니다.


    위에서 언급한 속성 유형에 대한 nullable 속성 값 변환기와 보너스를 추가합니다.

    토글(참/거짓)



    토글은 UI에서 null 상태가 아니지만 다음과 같은 경우 비어 있을 수 있습니다.
  • 콘텐츠 유형에 속성이 추가되었지만 그 이후로 해당 유형의 일부 콘텐츠가 (재)게시되지 않았습니다.
  • 속성 값이 설정되지 않은 상태에서 API를 통해 콘텐츠가 생성되었습니다.

  • 이러한 경우 다음 변환기가 유용할 수 있습니다.
  • YesNoDefaultConverter 속성 편집기의 설정에서 구성된 "초기 상태"(기본값) 값을 반환합니다.
  • NullableYesNoConverter , 콘텐츠가 속성과 함께 아직 (재)게시되지 않은 경우 null을 반환합니다.

  • 시작하기



    NuGet에서 설치하고 이동하십시오.

    > dotnet add package Our.Umbraco.Emptiness
    


    대부분의 사이트에 적합하다고 생각되는 default configuration이 있습니다. 비어있을 때 빈 정수, 소수점 및 날짜 선택기를 null로 만들고 Toggle이 기본값을 반환하도록 합니다.

    설치 및 구성 후 ModelsBuilder 모델을 다시 빌드하면 관련 속성이 null 가능하게 된 것을 볼 수 있습니다(그래서 null 검사를 하는 것이 좋습니다 😉).

    피드백 부탁드립니다🙏



    패키지는 아직 새것이고 한 사이트에서만 화를 내며 사용하고 있으므로 어떤 것이든 정말 환영합니다feedback/issues etc..

    Umbraco에서 속성으로 작업할 때 사용했던 것과는 다소 다르지만 null 허용 값이 백오피스 편집기 UI에서 발생하는 일을 가져와 웹사이트 코드에 표시하는 데 훨씬 더 좋은 방법이라는 것을 알았습니다.

    좋은 웹페이지 즐겨찾기