Создать поле выбора типа виджета на основе стороннего ответа API - PullRequest
0 голосов
/ 27 мая 2019

Мы начали разработку сайта в Apostrophe CMS на основе стороннего API и остановились на следующей проблеме:

  • нам нужен виджет, который имеет выбор (на стороне администратора).
  • параметры из него генерируются на основе ответа API.
  • Пользователь Admin выберет опцию, когда он / она настроит параметры виджета (на стороне сервера).
  • на основе этого выбора мы будем называть другой API, и на основе этого ответа будет генерироваться некоторый HTML (на стороне клиента; изображения, тексты и т. Д.)

Сценарий таков: администратор выбирает продукт из списка, и на передней панели мы будем показывать информацию, основанную на этом выборе.

const request = require( 'request-promise' );

module.exports = {
    extend: 'apostrophe-widgets',
    label: 'Preloaded list widget',
    addFields: [
        {
            label: 'Product',
            name: 'product',
            type: 'select',
            required: true,
            choices: "getChoices"
        }
    ],

    getChoices: async function( req )
    {
        const products = await request( {
            uri: "http://API_for_product_list",
            json: true
        } );

        var choiceList = [];
        for( idx = 0; idx < products.totalRecords; idx++ )
        {
            var option =
            {
                label: products.items[ idx ].label,
                value: products.items[ idx ].value
            };

            choiceList.push( option );
        }

        return choiceList;
    }
};


При запуске приложения я получил следующее предупреждение: Тип загружаемого виджета, название поля продукта: При использовании showFields field.choices должен быть массивом И список показывает пустой. Функция getChoices никогда не вызывается.

Я что-то упускаю, но я не знаю что. Мы сделали все согласно документации.

1 Ответ

1 голос
/ 27 мая 2019

Вы должны прикрепить свою функцию getChoices к самому модулю, чтобы на нее можно было ссылаться позже.

const request = require('request-promise');

module.exports = {
  extend: 'apostrophe-widgets',
  label: 'Preloaded list widget',
  addFields: [{
    label: 'Product',
    name: 'product',
    type: 'select',
    required: true,
    choices: 'getChoices'
  }],
  construct: function(self, options) {
    self.getChoices = async function (req) {
      const products = await request({
        uri: "http://API_for_product_list",
        json: true
      });

      var choiceList = [];
      for (idx = 0; idx < products.totalRecords; idx++) {
        var option = {
          label: products.items[idx].label,
          value: products.items[idx].value
        };

        choiceList.push(option);
      }
      return choiceList;
    }
  }
};
...