テーマ設定用オブジェクトタイプ

テーマ設定のサポート対象タイプに新しい type: objects を導入します。これは、近く廃止予定の既存の json_schema タイプを置き換えるために使用できます。

objects タイプのテーマ設定の定義

objects タイプのテーマ設定を作成するには、まず、通常のテーマ設定と同様に、トップレベルのキー(設定名として使用されます)を定義します。

links: ...

次に、type、default、schema のキーワードを設定に追加します。

links:
  type: objects
  default: []
  schema: ...

type: objects は、これが objects タイプの設定であることを示します。default: [] の記述は、設定のデフォルト値を空の配列に設定します。デフォルト値には、オブジェクトの配列を指定することもでき、schema が定義された後にその例を示します。

スキーマを定義するには、まず以下のようにスキーマの name を定義します。

links:
  type: objects
  default: []
  schema:
    name: link

次に、スキーマに properties キーワードを追加します。これにより、各オブジェクトがどのように見えるべきかを定義し、検証することができます。

links:
  type: objects
  default: []
  schema:
    name: link
    properties:
      name: ...

上記の例では、link オブジェクトに name プロパティがあると述べています。期待されるデータの種類を定義するために、各プロパティは type キーワードを定義する必要があります。

links:
  type: objects
  default: []
  schema:
    name: link
    properties:
      name:
        type: string

上記のスキーマ定義は、link オブジェクトに string 型の name プロパティがあることを示しており、そのプロパティには文字列値のみが受け入れられることを意味します。現在、以下のタイプがサポートされています:

  • string: プロパティの値は文字列として保存されます。拡張テキストエリアを使用するには textarea: true を設定します:

    description:
      type: string
      textarea: true
      validations:
        max_length: 500
    
  • integer: プロパティの値は整数として保存されます。

  • float: プロパティの値は浮動小数点数として保存されます。

  • boolean: プロパティの値は true または false です。

  • upload: プロパティの値は添付ファイルの URL です。

  • enum: プロパティの値は、choices キーワードで定義された値のいずれかでなければなりません。

    links:
      type: objects
      default: []
      schema:
        name: link
        properties:
          name:
            type: enum
            choices:
              - name 1
              - name 2
              - name 3
    
  • categories: プロパティの値は、有効なカテゴリ ID の配列です。

  • groups: プロパティの値は、有効なグループ ID の配列です。

  • tags: プロパティの値は、有効なタグ名の配列です。

  • icon: プロパティの値は、Discourse アイコンセットからの単一のアイコン名です。選択されたアイコンはスプライトシートに自動的に追加されるため、個別に登録せずにレンダリングできます。

スキーマが定義されると、設定のデフォルト値を以下のように yaml で配列を定義することで設定できるようになります:

links:
  type: objects
  default:
    - name: link 1
      title: link 1 title
    - name: link 2
      title: link 2 title
  schema:
    name: link
    properties:
      name:
        type: string
      title:
        type: string

必須プロパティ

定義されたすべてのプロパティは、デフォルトでオプションです。プロパティを必須としてマークするには、required: true でプロパティに注釈を付けます。また、required: false でプロパティに注釈を付けて、オプションとしてマークすることもできます。

links:
  type: objects
  default: []
  schema:
    name: link
    properties:
      name:
        type: string
        required: true
      title:
        type: string
        required: false

空の string、datetime、icon の値や、空の categories、groups、tags のリストは、欠落しているものとして扱われます。必須プロパティはこれらを拒否し、オプションプロパティはそれらの検証をスキップします。false は設定済みとして扱われます。

カスタム検証

特定のプロパティタイプでは、validations キーワードでプロパティに注釈を付けることで宣言できるカスタム検証の組み込みサポートがあります。

links:
  type: objects
  default: []
  schema:
    name: link
    properties:
      name:
        type: string
        required: true
        validations:
          min_length: 1
          max_length: 2048
          url: true

string タイプの検証

  • min_length: プロパティの最小長。キーワードの値は整数でなければなりません。
  • max_length: プロパティの最大長。キーワードの値は整数でなければなりません。
  • url: プロパティが有効な URL であることを検証します。キーワードの値は true/false で指定できます。

integer および float タイプの検証

  • min: プロパティの最小値。キーワードの値は整数でなければなりません。
  • max: プロパティの最大値。キーワードの値は整数でなければなりません。

tags、groups、categories タイプの検証

  • min: プロパティの最小レコード数。キーワードの値は整数でなければなりません。
  • max: プロパティの最大レコード数。キーワードの値は整数でなければなりません。

グループメンバーシップの解決

オブジェクト設定では、type: groups プロパティを現在のユーザーに対するブール値に解決できます。これは、テーマコードが現在のユーザーが設定されたグループのいずれかに属しているかどうかだけを必要とする場合に有用です。なぜなら、currentUser.groups にはユーザーに表示されるグループのみが含まれるからです。

groups プロパティに resolve_group_membership: true を追加します:

menu_sections:
  type: objects
  default:
    - name: section 1
      groups:
        - 1
        - 3
  schema:
    name: menu section
    properties:
      name:
        type: string
      groups:
        type: groups
        resolve_group_membership: true

管理 UI と保存された設定値は、元の groups 配列のままです。フロントエンドのランタイム settings オブジェクトでは、Discourse は各オブジェクトからグループ ID を削除し、user_in_ を接頭辞に付けた同じプロパティ名のブール値を追加します:

for (const section of settings.menu_sections) {
  if (section.user_in_groups) {
    // このセクションで選択された少なくとも1つのグループにユーザーが含まれています。
  }
}

このオプションは、type: groups を持つオブジェクトスキーマプロパティに対してのみ有効です。また、ネストされたオブジェクトスキーマや、logged_in_users や anonymous_users などの自動グループでも機能します。

ネストされたオブジェクト構造

オブジェクトは、オブジェクトの配列を含むプロパティを持つこともできます。ネストされたオブジェクト構造を作成するには、プロパティに type: objects と関連する schema 定義で注釈を付けることもできます。

sections:
  type: objects
  default:
    - name: section 1
      links:
        - name: link 1
          url: /some/url
        - name: link 2
          url: /some/other/url
  schema:
    name: section
    properties:
      name:
        type: string
        required: true
      links:
        type: objects
        schema:
          name: link
          properties:
            name:
              type: string
            url:
              type: string

設定の説明とローカライズ

en ロケールで設定の説明を追加するには、以下の objects タイプのテーマ設定が与えられた場合、次の形式で locales/en.yml ファイルを作成します。

sections:
  type: objects
  default:
    - name: section 1
      links:
        - name: link 1
          url: /some/url
        - name: link 2
          url: /some/other/url
  schema:
    name: section
    properties:
      name:
        type: string
        required: true
      links:
        type: objects
        schema:
          name: link
          properties:
            name:
              type: string
            url:
              type: string
en:
  theme_metadata:
    settings:
      sections:
        description: This is a description for the sections theme setting
        schema:
          properties:
            name:
              label: Name
              description: The description for the property
            links:
              name:
                label: Name
                description: The description for the property
              url:
                label: URL
                description: The description for the property

このドキュメントはバージョン管理されています - 変更提案は github でお願いします。

「いいね!」 16

jsonスキーマ形式の廃止が良い考えであるとは、まだ納得できません。

これらは非常に複雑になり、最も「開発者に優しい」形式ではない(そのため、この点では素晴らしい変更です)一方で、jsonスキーマを検証するためのオンラインツールがあり、スキーマとデフォルトデータの両方を検証するのに非常に役立ちます。

例:https://www.jsonschemavalidator.net/

この新しい世界では、それはどのように機能するのでしょうか?

「いいね!」 2

テーマをアップロードする際に、デフォルトデータを定義されたスキーマに対して検証します。とはいえ、現時点ではスキーマ定義自体が有効であるかの検証は行っていませんが、それを行うことは難しくありません。現在のJSONスキーマ設定についても、デフォルトデータを定義されたスキーマに対して検証しているわけではないと思います。

現在のJSONスキーマ型設定の実装は、管理インターフェースのエディタなど、多くの点で不完全です。内部で議論した結果、JSONスキーマが持つすべての可能性を許可するよりも、私たち自身が定義した限定的なスキーマ形式を維持する方が、はるかに管理しやすいという結論に至りました。

「いいね!」 2

クールな機能がいくつかあります。

  • JSON.parse を削除して、設定に直接アクセスしてオブジェクトを取得できるのは非常に便利です。

  • URLバリデーター!

:chefs_kiss: :chefs_kiss:

「いいね!」 5

エディタで複数行を尊重する方法はありますか?

このデフォルトは機能します。

- name: markdown
  value: >
    ## Heading
      * first bullet
      * second bullet

しかし、これを編集すると、キャリッジリターンが失われます。

さらに、「text」タイプがあれば、より長文のデータを格納でき、おそらくより大きな「textarea」エディタを公開できると良いでしょう。

「いいね!」 5

フィードバックをいくつかご紹介します。

「いいね!」 2

これに気づき、修正されました

「いいね!」 1

インターフェースでアイテムを並べ替えることはできますか?

例えば、これはeasy footer theme componentのオブジェクト設定エディタです。現時点では何も並べ替えることができません。

「いいね!」 4

私もこの機能をお願いしたかったです!:+1:


ちなみに、最初の投稿に identifier プロパティに関する情報が含まれていると役立ちます。

上記の Nolo の画像を見るまで、デフォルトの子ラベルをプロパティ値に置き換えることは不可能だと思っていました。コードを見た後、identifier プロパティを見つけました。

「いいね!」 4

並べ替えは、確かに内部でも提起されていることです。今週中に実装できるよう試みます。

承知しました。最初の投稿を identifier プロパティについて更新します。

「いいね!」 5

はい、(まもなく廃止される?)JSONシステムを置き換えるには、古いインターフェイスと同等かそれ以上である必要があります。

順序付けも含まれます。

「いいね!」 1

他にサポートするフィールドタイプはありますか?

例えば:

  • Markdown形式のlong_string。ツールバーをカスタマイズできるかもしれません。
  • dateフィールド(検証ルール付き)。
  • colorフィールド(検証ルール付き)?
「いいね!」 1

現在のところ予定はありませんが、有用であることには同意します。私自身もiconフィールドが欲しいです。

「いいね!」 8

私の経験では、これは保存されたプリセットのように機能するようです。この例では、最初の2つのエントリはこれらのプリセットから恩恵を受けることができますが、それ以降はすべて新しいエントリが最初は空白で表示されます。

これは、フィールドごとにデフォルト値を設定できないことも意味します。たとえば、チェックボックスを開始時にチェックされた状態にしたい場合、それはできません。

links:
  type: objects
  default:
    - name: link 1
      title: link 1 title
    - name: link 2
      title: link 2 title
  schema:
    name: link
    properties:
      is_active:
        type: boolean
        default: true

default: true は、期待どおりには機能しません。

作成された各エントリのフィールドごとにデフォルト値を設定する方法はありますか?

Sassでオブジェクトプロパティを変数にインポートする方法はありますか?

文字列を解析することはいつでも可能ですが、そのように宣伝するのはあまり良い考えではないように思えますね。:sweat_smile:

「いいね!」 1

例を共有していただきありがとうございます!確かに…あまり魅力的には見えませんね :upside_down_face:

「いいね!」 1

ちなみに、あまり時間をかけずに調べてみたのですが、この件はどこまで進んでいますか?

「いいね!」 2

はい、あまり良くないですね。やめましょう。:smile: 可能性を確認するための試みでしたが、合理的なアプローチではありませんでした。
私も同感です。直接的な方法があるといいですね!:+1:

私も知りたいです!
また、もし私が正しければ、それはjson_schemaとの機能パリティにおける唯一の不足機能になるでしょう。

「いいね!」 2

アップロードタイプが利用可能であると思って探していましたが、利用できませんでした。
コアをざっと見たところ、トピック、投稿、アップロードタイプはサーバーサイドで実装されているものの、フロントエンドでは実装されていないことがわかりました。何か特別な理由があるのでしょうか? :thinking: