Как сделать так, чтобы виджет списка 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"}

person Faishal Irawan    schedule 22.12.2017    source источник
comment
Когда вы смотрите на свою обложку, вы видите кавычки вокруг цифр?   -  person talves    schedule 22.12.2017
comment
В CloudCannon это можно решить очень элегантно: docs.cloudcannon.com/editing/front- вопрос / # номер   -  person JoostS    schedule 22.12.2017
comment
@talves да ....   -  person Faishal Irawan    schedule 22.12.2017
comment
На самом деле вы не используете виджет чисел - вы вводите значения в виджет списка, который выводит только строки. Если вы вложите числовое поле в поле списка, вы получите список объектов, который по-прежнему не то, что вам нужно. Начинаю задумываться, нужно ли Netlify CMS позволять изменять отдельные значения с помощью преобразователя, который находится между виджетом и выходом. Или же сделайте параметр конфигурации valueType соглашением, реализуемым несколькими виджетами.   -  person Shawn Erquhart    schedule 22.12.2017


Ответы (3)


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

В вашем конкретном случае вы можете изменить виджет «Категории» из примера с документами, чтобы работать только с числами и выводить их. Добавьте это в конец тега 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>
person Shawn Erquhart    schedule 22.12.2017

Использование виджета «Число» NetlifyCMS позволяет записывать числа в виде строки или числа. ценить.

Вы должны использовать 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"}
person talves    schedule 22.12.2017
comment
Я написал это в вопросе, не работает, идк почему - person Faishal Irawan; 22.12.2017
comment
Это интересный вариант использования. Я понимаю, о чем говорит Шон, но похоже, что CMS должна обрабатывать это немного более элегантно, иначе вы получите ошибку, когда вы попросите valueType - person talves; 23.12.2017
comment
Согласовано - начинаю задумываться, должно ли valueType быть соглашением, реализованным в большинстве виджетов, хотя принятые значения могут отличаться. - person Shawn Erquhart; 24.12.2017

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

{{ yourstring | divided_by:1 }}

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

ОБНОВЛЕНИЕ

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

{% 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 %}
person JoostS    schedule 22.12.2017
comment
где мне это реализовать? Кажется, не могу понять этого, потому что строка находится в передней части - person Faishal Irawan; 22.12.2017
comment
Хороший момент ... Я обновил свой ответ альтернативным решением. - person JoostS; 22.12.2017
comment
Я думаю, вы упустили суть, html находится в хорошем положении, проблема заключается в том, что значение, возвращаемое CMS, имеет строковый тип. - person Faishal Irawan; 22.12.2017
comment
Ты прав. Я знаю. Мое решение было обходным. - person JoostS; 22.12.2017
comment
И, глядя на другие ответы, мне кажется, что мое альтернативное решение не так уж и плохо. :-) - person JoostS; 22.12.2017
comment
Да, преобразование вывода Netlify CMS - неплохой подход. Тем не менее, я бы хотел, чтобы он устарел по мере развития проекта. - person Shawn Erquhart; 24.12.2017