Тип объектов для настройки темы

Рассказчик: «На той неделе это так и не было внедрено». :upside_down_face:

2 лайка

Есть ли какие-то изменения по этому вопросу? Я только что переписал компонент для кого-то, использующего объекты, и они недовольны тем, что не могут менять их порядок.

4 лайка

Привет @awesomerobot, думаешь, это скоро попадёт в чей-то список? Кажется, что никто из команды не смотрел на это уже год.

Кроме того, очень плохо, что все они названы «field_name-X». Было бы здорово иметь возможность использовать там имя поля. Приходится кликать на каждый элемент, чтобы понять, что там находится, — это кошмар, если у вас больше пары объектов.

Если мы не сможем менять порядок элементов и вы не сможете понять, что они из себя представляют, не кликнув на них, мне, скорее всего, придётся вернуться к использованию одного строкового параметра с несколькими значениями, разделёнными, э-э, каким-то символом. И, кажется, со старыми массивами можно было менять порядок элементов, верно? Так что этот тип объектов кажется шагом назад для всех, кроме программистов.

2 лайка

На данный момент, думаю, ничего в процессе по изменению порядка не ведется, хотя мы бы хотели это включить. Переименование уже возможно с помощью свойства identifier. Например, в компоненте темы пользовательских ссылок в заголовке

Поле имени установлено как идентификатор для каждой ссылки, поэтому вы можете понять, какая ссылка какая.

2 лайка

Ура. Я думал, что упустил это, но так и не смог найти раньше. Спасибо!

РЕДАКТИРОВАНИЕ: Теперь я использовал свойство identifier и добавил поле ‘order’, так что всё не так уж плохо. Всё ещё считаю, что было бы здорово иметь возможность менять порядок настроек, и это доступно с массивами. . .

Ещё раз спасибо за помощь

1 лайк

Некоторое время назад я сделал коммит, который добавляет возможность изменения порядка для объектов. Вот небольшое тестовое значение настройки, чтобы показать кнопки:

10 лайков

Думаю, стоит объявить, что теперь в качестве типа поля доступен uploads. Казалось бы, это уже упоминалось где-то, но приятно повторить, что type: objects работает как в настройках темы, так и в настройках сайта (плагины).

10 лайков

Правильно — upload

1 лайк

Спасибо! Будет исправлено в

1 лайк

Поддерживает ли тип objects ограничение max? Я попробовал, но, кажется, это не работает.

Вы имеете в виду поле типа string в дереве объектов?
Попробуйте max_length

Смотрите #Валидация для типов string по этой теме; или рабочий пример:

Я думаю, он имеет в виду:

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 для поддержки ограничения max для типа objects
  // Загружаем этот компонент только в контексте администратора
  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 лайк