Developing Discourse Plugins - Part 3 - Add custom site settings

You simply need to add a

config/locales/server.zh_CN.yml

file (and similar for any other locales you want to support) with the same English tokens but with language specific values and the plugin will use that instead of falling back to the English.

2개의 좋아요

Thanks for helping! have a nice day!

3개의 좋아요

I was looking how to create a site setting that validates a username, but found there’s a username type to do this. Here the list of site setting types we have today:

  • email
  • username
  • integer
  • regex
  • string
  • list
  • enum

Also, you can do custom validations for your plugin settings, it accepts a validator field that expects a Ruby class. You use it like this.

plugins:
  my_custom_username_validation:
    default: 'system'
    validator: 'UsernameSettingValidator'

You can check the UsernameSettingValidator class to see the interface of validators.

Cheers!

10개의 좋아요

동작하지 않음 (

<a id="forgot-password-link" class="forgot-password" href="{{Discourse.SiteSettings.myplugin_link_forgot_password}}" target="_blank">비밀번호를 잊으셨나요?</a>

settings.yml

plugins:
  myplugin_enabled:
    default: true
    client: true
  myplugin_link_forgot_password:
    default: ''
    client: true

업데이트:
동작함!!!
href="{{unbound siteSettings.myplugin_link_forgot_password}}"

텍스트 HTML을 어떻게 표시하나요?
{{unbound siteSettings.forum_text_for_admin}} 가 작동하지 않습니다.

수정:
*.hbs 파일에서 {{{unbound siteSettings.forum_text_for_admin}}} 로 작동합니다.

다시 말하지만, Computed Property를 사용하고 safe html로 포맷해야 합니다. 이건 EmberJS이지 바닐라 JavaScript가 아닙니다. 템플릿에 '코드’를 직접 넣을 수 없습니다. ember 가이드를 읽어보세요.

1개의 좋아요

이미 EmberJS를 사용하고 있습니다

저의 settings.yml 파일에는 다음과 같은 내용이 있습니다:

plugins:
  county_fence_enabled:
    default: false
    client: true
  county_fence_latrine_category:
    default: -1
    client: true

이 설정은 제 /admin/plugins 페이지에 이렇게 표시됩니다:

왜 설정(Settings) 버튼이 없는지 이해가 되지 않습니다.

plugins 대신 플러그인 이름인 county_fence를 입력해야 한다고 생각합니다.

2개의 좋아요

저도 그렇게 해보았지만, 차이가 없었습니다.

이 문서(그리고 원 포스터의 설명)에서는 plugins 키를 사용합니다. 다른 곳에서는 말씀하신 대로 플러그인 이름을 사용하는 것을 보았습니다.

1개의 좋아요

@bitmage 실제로, 제가 원인을 알고 있을 것 같습니다.

plugin.rb 파일에 # name: County Fence라고 작성하셨나요?
그렇다면 이름은 디렉터리 이름과 동일해야 합니다.

플러그인 이름은 로케일에서 덮어쓸 수 있습니다:

다음과 같은 설정 형식을 가지고 있다고 가정해 보겠습니다:

county_fence:
  county_fence_enabled: true
  ...

client.en.yml 파일에서는 다음과 같습니다:

en:
  admin_js:
    admin:
      site_settings:
        categories:
          county_fence: "County Fence"

기본값을 -1 대신 0으로 설정했더니 해당 항목이 표시되기 시작했습니다.

타입이 올바르게 감지되지 않았음을 알 수 있는 방법이 있을까요?

  1. YamlLoader가 파일을 로드합니다.
  2. SiteSettingExtension calls setting()이 YamlLoader에 의해 생성된 매개변수를 사용하여 호출됩니다.
  3. …이어서 defaults.load_setting이 호출되고, 나중에 type_supervisor.load_setting이 호출됩니다.
  4. type_supervisor.load_setting에 값이 직접 전달되지는 않지만, DefaultsProvider를 통해 초기화될 때 기본값이 전달되므로 기본값에 접근할 수 있습니다.
  5. type_supervisor.load_setting은 get_data_type을 호출하고, 이는 parse_value_type()을 호출합니다. 이 함수는 타입을 감지할 수 없는 경우 ArgumentError를 발생시켜야 합니다.

이 전체 시퀀스가 SiteSetting 모델의 load_settings에 의해 호출된다고 생각하는데, 스택 어디에도 예외 처리를 찾지 못하고 있습니다. 하지만 서버 로그나 다른 어디에서도 오류 출력을 볼 수 없습니다.

설정 파싱이 실패했음을 알리는 사용자 피드백이나 오류 로그가 어떤 형태로든 있어야 할 것 같습니다.

제대로 이해했는지 모르겠지만, 설정의 기본값을 -1로 지정하면 “설정” 버튼이 표시되지 않는다는 말씀이신가요? 이 현상을 매번 재현할 수 있으신가요?

이상하네요. 설정에 문제가 있는 부분은 보이지 않는데, 파싱이 실패할 수 있는 방법이 무엇인지 잘 모르겠습니다. :thinking:

이제 작동하니까 -1로 다시 변경해도 계속 정상 작동합니다.

데이터베이스를 삭제하고 초기화했는데도 여전히 재현할 수 없네요. :person_shrugging:

1개의 좋아요

안전을 위해 기본값인 0을 사용하여 플러그인을 라이브 사이트에 배포했습니다. 설정 버튼은 표시되는데:

image

버튼을 클릭해도 설정 항목이 목록에 표시되지 않습니다:

문제를 계속 조사하는 동안 플러그인을 비활성화할 것입니다.

네, 개발 환경이든 프로덕션 환경이든, 플러그인 디렉터리 내의 폴더 이름이 county-fence와 일치하지 않아서 그런 것 같습니다. 그래서 설정이 표시되지 않았고, 다른 문제들도 발생할 수 있었을 것입니다.

도움 주셔서 감사합니다!

1개의 좋아요

저에게는 명확하지 않습니다. 제가 설치한 플러그인 중 대부분은 plugins:를 사용하지 않으며, 여기에는 공식 플러그인과 최신 플러그인(또한 스켈레톤 템플릿)도 포함됩니다.

그 부분은 설정 필터링에 사용되는 것으로 생각했지만, 제가 틀렸을 수도 있습니다.

1개의 좋아요

오, 흥미롭네요! 죄송합니다.

말씀드리고 싶은 것은, 사실 그게 필요하지 않다는 점입니다.

plugins:를 사용해 제가 만든 플러그인의 수는 손에 꼽을 정도가 아니에요.

1개의 좋아요

문서에 대해 추가 설명을 드리면 다음과 같습니다:

Site Settings 유형에 대한 전체 목록은 type_supervisor.rb 코드에서 확인하실 수 있습니다. 해당 코드 바로 위에서는 Site Settings가 허용하는 유효한 자식 키(child keys)도 볼 수 있습니다.

이러한 옵션을 더 많이 사용하는 고급 예제는 discourse-welcome-link 테마 컴포넌트에서 찾을 수 있습니다. 동일한 값은 플러그인 내부에서도 작동하지만, 파일 위치는 config/settings.yml이 됩니다.

3개의 좋아요

플러그인과 테마 컴포넌트 타입 간에는 차이가 있습니다.

표로 정리해 보았습니다. (경미한 오류나 그룹화 방식이 다를 수 있습니다.)

카테고리 기능 플러그인 문법 TC 문법
기본 타입 문자열 type: string
min: ..
max: ..
regex: ..
secret: true/false
global
validator: class name
type: string
min: ..
max: ..
-
-
-
-
멀티라인 텍스트 type: string
textarea: true
type: string
textarea: true
정수 type: integer
min: ..
max: ..
type: integer
min: ..
max: ..
실수 type: float
min: ..
max: ..
type: float
min: ..
max: ..
불리언 type: bool type: bool
시간 type: time -
널 type: null -
선택 타입 열거형 (드롭다운) type: enum
choices: [option1, option2]
enum: ..
type: enum
choices: [option1, option2]
카테고리 type: category -
색상 type: color -
그룹 type: group -
이메일 type: email -
사용자 이름 type: username -
목록 타입 일반 목록 type: list
allow_any: true/false
type: list
단순/컴팩트 목록 type: simple_list
또는
type: list
list_type: compact
list_type: simple
type: list
list_type: compact
list_type: simple
카테고리 목록 type: category_list type: list
list_type: category
그룹 목록 type: group_list type: list
list_type: group
태그 목록 type: tag_list type: list
list_type: tag
태그 그룹 목록 type: tag_group_list -
URL 목록 type: url_list -
호스트 목록 type: host_list -
값 목록 type: value_list -
이모지 목록 type: emoji_list -
파일 타입 업로드 type: upload type: upload
업로드된 이미지 목록 type: uploaded_image_list -
파일 크기 제한 type: file_size_restriction
min: ..
max: ..
-
특수 타입 HTML (비권장) type: html_deprecated -
JSON 객체 비권장 비권장
객체 - type: objects
5개의 좋아요