主题设置的对象类型

旁白:“他那周并没有完成。” :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(() => {
  // 使用 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 个赞