Как сделать так, чтобы виджет Netlify CMS возвращал номер

Я хочу использовать Netlify CMS для своего сайта Jekyll, и у меня есть этот макет:

{% for skills in page.skills %}
    <div class="guide-skill">
        <div class="guide-skill-fill">
            {% for i in (1..15) %}
            <div class="{% if skills.levels contains i %}fill{% endif %} skill-check"><p>{{ i }}</p></div>
            {% endfor %}
        </div>
    </div>
{% endfor %}

и начало страницы, которое я пишу в текстовом редакторе, который использует этот макет:

skills:
  - levels:
      - 1

код работает нормально, fill класс добавлен правильно.

Но когда я использую Netlify CMS с виджетом списка, он возвращает строку вместо числа в levels список, как это:

skills:
  - levels:
      - '1'

Так что код не работает, как сделать так, чтобы он возвращал число?

Что я пробовал

  • процитировать i, но это дало мне ошибку
  • использование valueType : "int"не работал

Мой конфиг

- label: "Hero Skills"
  name: "skills"
  widget: "list"
  required: false
  fields:
      - {label: "Skill Number", name: "number", widget: "number"}
      - {label: "Levels", name: "levels", widget: "list"}

3 ответа

Решение

Ни один из встроенных виджетов не может вывести список чисел (которые не являются строками), но вы всегда можете использовать собственный виджет, когда встроенные виджеты не работают. Пользовательские виджеты являются компонентами React, и мы публикуем глобальные хуки (createClass, h) для тех, кто не использует модульную систему. Больше в документации: https://www.netlifycms.org/docs/custom-widgets/

Для вашего конкретного случая вы можете изменить виджет "Категории" из примера документов, чтобы он работал только с числами и выводил их. Добавьте это в конце тега body в вашем index.html файл для Netlify CMS:

<script>
  var NumberListControl = createClass({
    handleChange: function(e) {
      var value = e.target.value.replace(/[^0-9, ]/, '');
      this.props.onChange(value.split(',').map(function(val) {
        var trimmed = val.trim();
        return trimmed ? parseInt(trimmed, 10) : trimmed;
      }));
    },

    render: function() {
      var value = this.props.value;
      return h('input', {
        type: 'text',
        value: value ? value.join(', ') : '',
        onChange: this.handleChange,
        className: this.props.classNameWrapper,
      });
    }
  });

  var NumberListPreview = createClass({
    render: function() {
      return h('ul', {},
        this.props.value.map(function(val, index) {
          return h('li', {key: index}, val);
        })
      );
    }
  });

  CMS.registerWidget('number_list', NumberListControl, NumberListPreview);
</script>

Использование виджета NetlifyCMS "Number" позволяет записывать числа в виде строковых или числовых значений.

Вы должны использовать valueType если ваш начальный вопрос получает строковое значение:

- label: "Hero Skills"
  name: "skills"
  widget: "list"
  required: false
  fields:
    - {label: "Skill Number", name: "number", widget: "number", valueType: "int", default: 1}
    - {label: "Levels", name: "levels", widget: "list"}

Разве вы не можете просто использовать математический фильтр для преобразования этой строки в число, как это?

{{ yourstring | divided_by:1 }}

Источник: https://help.shopify.com/themes/liquid/filters/math-filters

ОБНОВИТЬ

Поскольку предыдущее решение нелегко реализовать, я выбрал другой угол для решения проблемы. Следующий код не предполагает, что уровень является числом:

{% for skills in page.skills %}
    <div class="guide-skill">
        <div class="guide-skill-fill">
            {% assign all_levels = "1,2,3,4,5,6,7,8,9,10,11,12,13,14,15" | split: ',' %}
            {% for level in all_levels %}
            <div class="{% if skills.levels contains level %}fill{% endif %} skill-check"><p>{{ level }}</p></div>
            {% endfor %}
        </div>
    </div>
{% endfor %}
Другие вопросы по тегам