beforeConstruct 中的动态 options.addFields 不起作用

Dynamic options.addFields in beforeConstruct not working

我想在 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>

如下图所示,请注意即使将标签为 Section Description 的 addFields 传递给纯文本小部件也不会覆盖 [=] 中设置的默认值46=].

我在 index.js 中的 options.addFields 上尝试了 console.log,但它记录未定义,如下所示,我也尝试了几种不同的变体,但 none 有效。

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