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

ナレーター:「しかし、その週には対応されませんでした。」 :upside_down_face:

「いいね!」 2

これに関して何か変更はありましたか? オブジェクト型を使用してコンポーネントを書き直したばかりですが、並べ替えができないことに不満を持っています。

「いいね!」 4

これはすぐに誰かのリストに載るのでしょうか?

また、すべてが「field_name-X」という名前になっているのは非常にひどいです。フィールド名を使用することは可能でしょうか?フィールドがいくつかある場合、何があるかを確認するためにすべてをクリックしなければならないのは悪夢です。

アイテムを並べ替えることができず、クリックしないと何であるかわからない場合、複数の値を持つ単一の文字列設定に戻って、区切り文字として、えーと、さまざまなフィールドを区切るための何らかの文字を使用する必要があるでしょう。そして、古いスタイルの配列では並べ替えが可能だったと思いますが、そうですよね?したがって、このオブジェクトタイプは、プログラマー以外のすべての人にとって後退のように思えます。

「いいね!」 2

現時点では再注文のプロセスはありませんが、今後も追加したいと考えています。名前の変更は、identifier プロパティで既に可能です。例えば、カスタムヘッダーリンクのテーマコンポーネントから

各リンクの識別子として名前フィールドが設定されているため、どのリンクがどれであるかを確認できます。

「いいね!」 2

やったー。見落としていたに違いないと思いましたが、それまで見つけられませんでした。ありがとうございます!

編集:そして今、identifier プロパティを使用して ‘order’ フィールドを追加したので、それほど悪くはありません。設定の並べ替えが可能であれば良いと思いますが、配列で利用できます。 . .

ご協力いただきありがとうございました。

「いいね!」 1

少し前にオブジェクトの並べ替えを追加するコミットを作成しました。ここにボタンを示すための小さなテスト設定があります。

「いいね!」 10

uploads がフィールドタイプオプションとして利用可能になったことをお知らせするのは価値があると思います。また、type: objects がテーマ設定とサイト設定(プラグイン)の両方で機能することもどこかで言及されていたと思いますが、改めて言及しておきます。

「いいね!」 10

正しくは upload です

「いいね!」 1

ありがとうございます!修正は以下で行われます。

「いいね!」 1

objects 型は max 制限をサポートしていますか?試してみましたが、だめなようです。

オブジェクトツリー内の string 型フィールドのことでしょうか?
max_length を試してみてください…

このトピックについては、#Validations for string types をご覧ください。または、動作する例:

彼はおそらくこれを指していると思います:

「いいね!」 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(() => {
  // SchemaSettingNewEditor コンポーネントを classPrepend を使用して拡張し、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