테마 설정용 Objects 유형

나레이터: “그 주에는 처리되지 않았습니다.” :upside_down_face:

2개의 좋아요

이 부분에 대해 변화가 있나요? 저는 방금 objects 타입을 사용하는 사용자를 위해 컴포넌트를 다시 작성했는데, 재ordering이 불가능하다는 것에 대해 불만이 있습니다.

4개의 좋아요

hey @awesomerobot, 이게 곧 누군가의 목록에 올라갈 것 같아? 팀에서 1년 동안 아무도 이걸 확인하지 않은 것 같아.

또, 모든 필드가 "field_name-X"로 이름이 붙여져 있는 건 정말 최악이야. 해당 위치에 사용할 수 있는 필드 이름을 붙일 수 있는 방법이 있을까? 개수가 두세 개를 넘으면 하나하나 클릭해서 내용을 확인해야 하는 건 지옥이야.

항목 순서를 바꿀 수 없고, 클릭하지 않으면 무엇인지 알 수 없다면, 결국 여러 값을 구분 문자로 나눠서 넣는 단일 문자열 설정으로 돌아가야 할 것 같아. 그리고 옛날 방식의 배열에서는 항목 순서를 바꿀 수 있었지, 그렇지? 그래서 이 객체 타입은 프로그래머를 제외하고는 모두에게 후퇴처럼 느껴져.

2개의 좋아요

현재 순서 변경을 위한 처리 중인 항목은 없는 것 같습니다. 다만, 여전히 포함시키고 싶은 기능입니다. 이름 변경은 이미 identifier 속성을 통해 가능합니다. 예를 들어, 사용자 정의 헤더 링크 테마 컴포넌트에서

이름 필드가 각 링크의 식별자로 설정되어 있어 어떤 링크가 어떤 것인지 확인할 수 있습니다.

2개의 좋아요

좋네요. 제가 그걸 놓쳤을 줄 알았는데, 이전에는 찾지 못했었거든요. 감사합니다!

수정: 그리고 이제 identifier 속성을 사용하고 ‘order’ 필드를 추가했으니, 그렇게 나쁘지는 않습니다. 여전히 설정을 재배열할 수 있으면 좋겠다고 생각하는데, 배열에서는 가능합니다…

다시 한번 도움 주셔서 감사합니다.

1개의 좋아요

얼마 전 객체에 대한 재배열을 추가하는 커밋을 만들었습니다. 버튼을 보여주는 작은 테스트 설정입니다:

10개의 좋아요

uploads가 이제 필드 타입 옵션으로 추가되었다는 점을 공지할 가치가 있다고 생각합니다. 어딘가에서 언급된 적이 있긴 하지만, type: objects가 테마 설정과 사이트 설정(플러그인) 모두에서 작동한다는 점도 다시 한번 짚어주는 것이 좋을 것 같습니다.

10개의 좋아요

정답은 upload입니다

1개의 좋아요

감사합니다! 다음 PR에서 수정될 예정입니다:

1개의 좋아요

objects 유형에서 max 제한을 사용할 수 있나요? 시도해 봤는데, 안 되는 것 같습니다.

객체 트리에서 string 타입의 필드를 말씀하시는 건가요?
max_length를 시도해 보세요.

이 주제에 대해 Discourse 메타의 string 타입 검증을 참고하거나, 작동하는 예시를 확인해 보세요:

https://github.com/gormus/discourse-notification-banners/blob/03612783b114fa9fae943e2e969d6b7bc0651657/settings.yml#L24-L29

그가 언급하고 있는 것은 아마도:

1개의 좋아요

네, objects 배열의 최대 개수를 제한하는 것을 말씀하신 것입니다.

현재 공식적으로 지원되지 않으므로, 사용자 정의 프라이빗 테마 컴포넌트에서 해당 기능을 확장했습니다. 설정은 다음과 같습니다(참고용).

최대 배열 개수 제한 설정:

themes/quectel-custom-homepage/settings.yml

banner_images:
  type: objects
  default: []
  schema:
    name: "배너 이미지"
    max: 9 // 배열의 최대 개수를 제한하는 확장 설정
    identifier: image_url
    properties:
      image_url:
        type: upload
        required: true
      link_url:
        type: string
        min: 0
        max: 1023

확장된 구체적인 코드:

themes/quectel-custom-homepage/javascripts/discourse/api-initializers/quectel-custom-homepage.gjs

import { action } from "@ember/object";
import { apiInitializer } from "discourse/lib/api";
import classPrepend from "discourse/lib/class-prepend";
import { i18n } from "discourse-i18n";

export default apiInitializer(() => {
  // classPrepend를 사용하여 SchemaSettingNewEditor 컴포넌트를 확장하여 objects 유형의 max 제한을 지원하도록 합니다.
  // 관리자 컨텍스트에서만 해당 컴포넌트를 로드합니다.
  let SchemaSettingNewEditor;
  try {
    SchemaSettingNewEditor =
      require("discourse/admin/components/schema-setting/editor").default;
  } catch {
    // 비관리자 사용자는 해당 컴포넌트를 로드할 수 없으므로 확장을 건너뜁니다.
    return;
  }

  classPrepend(SchemaSettingNewEditor, (Superclass) => {
    return class extends Superclass {
      @action
      addItem() {
        // max 제한에 도달했는지 확인합니다.
        const maxLimit = this.args.setting.max || this.activeSchema?.max;

        if (maxLimit && this.activeData.length >= maxLimit) {
          this.validationErrorMessage = i18n(
            themePrefix("theme_settings.errors.objects_value_not_valid_max"),
            {
              count: maxLimit,
            }
          );
          return;
        }

        return super.addItem(...arguments);
      }

      @action
      addChildItem(propertyName, parentNodeIndex) {
        const propertySchema = this.activeSchema.properties[propertyName];

        // max 제한에 도달했는지 확인합니다.
        if (
          propertySchema?.max &&
          this.activeData[parentNodeIndex][propertyName].length >=
            propertySchema.max
        ) {
          this.validationErrorMessage = i18n(
            themePrefix("theme_settings.errors.objects_value_not_valid_max"),
            {
              count: propertySchema.max,
            }
          );
          return;
        }

        return super.addChildItem(...arguments);
      }
    };
  });
});

테마 번역 설정:

themes/quectel-custom-homepage/locales/zh_CN.yml

zh_CN:
  theme_settings:
    errors:
      objects_value_not_valid_max: "개수는 %{count}개를 초과할 수 없습니다"

구체적인 효과:

  1. 오류 메시지
  2. 더 이상 추가할 수 없음
1개의 좋아요