Динамические options.addFields в beforeConstruct не работает - PullRequest
0 голосов
/ 22 марта 2019

Я пытался создать простой универсальный многоразовый текстовый виджет в apostrophe-cms, поэтому я создал модуль text-only-widgets.

со следующим кодом

В lib / modules / text-only-widgets / index.js

module.exports = {
    extend: 'apostrophe-widgets',
    label: 'Section Heading',

    beforeConstruct: function (self, options) {
        console.log('options.addFields : ', options.addFields)
        options.addFields = [
            {
                name: 'sectionHeading',
                label: 'Section Heading',
                type: 'string'
            }
        ].concat(options.addFields || [])
    }

};

В lib / modules / text-only-widgets / views / widget.html

{{ data.widget.sectionHeading }}

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

  <div>
    {{
      apos.area(data.page, 'aboutUsDescriptionTwo', {
        widgets: {
          'text-only': {
          addFields: [
            {
              name: 'sectionDescription',  // set these fields dynamically
              label: 'Section Description',  // set these fields dynamically
              type: 'string'
            }
          ]

          }
        }
      })
    }}
  </div>

Как показано на рисунке ниже, обратите внимание, что даже после передачи addFields с меткой как Раздел Описание в виджет только для текста не переопределяет значения по умолчанию, заданные в index.js.

enter image description here

enter image description here

Я попытался console.log на файле options.addFields в index.js, но он регистрирует неопределенное значение, как показано ниже, я также попробовал несколько разных вариантов, но ни один не работает.

enter image description here

1 Ответ

1 голос
/ 22 марта 2019

Опция addFields находится на уровне модуля, она определяет, какие поля существуют для всех экземпляров этого виджета.Эта опция не может быть передана отдельным экземплярам виджета через apos.area.Таким образом, вы не можете сделать это таким образом.

Правильный подход заключается в создании второго модуля, который использует extend для расширения первого и addFields, на уровне модуля, чтобы добавить дополнительныйполе.Затем в вашем регионе вы можете предложить только один из двух типов виджетов или оба в соответствии с вашими потребностями.

Таким образом, в дополнение к lib/modules/text-only-widgets/index.js у вас также будет:

// in lib/modules/text-plus-description-widgets/index.js
module.exports = {
    extend: 'text-only-widgets',
    label: 'Section Heading and Description',

    addFields: [
      {
        name: 'sectionDescription',
        label: 'Section Description',
        type: 'string'
      }
    ]
};

И этот виджет также будет иметь свой собственный widget.html.

...