在 apostrophe-cms 模块中删除字段作为选项参数

Remove Fields as option parameter in apostrophe-cms module

我目前正在尝试让我的模块正常工作。通过添加字段扩展模块效果很好。我使用了几个模块(例如 "teaser")来扩展 "container",它定义了像大小这样的基本选项。

这是我的容器,定义了一个"size"选项:

module.exports = {
  extend: 'apostrophe-widgets',
  label: 'Container',
  contextualOnly: true,
  addFields: [{
    name: 'contentBlock',
    type: 'area',
    label: 'Content Block',
  }],
  beforeConstruct: function(self, options) {
    options.addFields = [{
      name: 'size',
      label: 'Modulbreite',
      type: 'select',
      choices: [{
          label: 'Content width',
          value: 'content-width'
        },
        {
          label: 'Full width',
          value: 'full-width'
        }
      ],
      required: true
    }].concat(options.addFields || []);
  }
};

这是我的预告片,扩展了容器:

module.exports = {
  extend: 'container-widgets',
  label: 'Teaser',
  contextualOnly: false,
  addFields: [
    {
      name: 'teasertext',
      label: 'Text',
      type: 'string',
      textarea: true
    },
    {
      name: 'teaserurl',
      label: 'Link',
      type: 'string',
      required: true
    },
    {
      name: 'image',
      label: 'Teaser Image',
      type: 'singleton',
      widgetType: 'apostrophe-images',
      options: {
        limit: 1
      },
      required: true
    }
  ]
};

然后我在页面标记中包含容器:

{{ apos.area(data.page, 'body', { widgets: { 'container': {} } }) }}

容器标记中的预告片:

{{ apos.area(data.widget, 'contentBlock', { widgets: { 'teaser': {} } }) }}

问题是在某些情况下,我不想为用户提供 "size" 选项,因为预告片可能嵌套在其他一些已经定义了大小的模块中。因此,我想传递一个参数来删除 "size" 选项。这不像我想的那样有效,但我不知道这是否可能像这样。

我试着在这种情况下包含一个预告片,如下所示:

{{ apos.area(data.widget, 'contentBlock', { widgets: {
    'teaser': {
      removeFields: ['size']
    }
 } }) }}

这是不可能的还是我搞错了什么?

您不能在传递给 apos.area 的选项中使用 removeFields,因为对于该类型的所有小部件,小部件的架构是在启动时确定的。

但是,您可以 extend 您的 teaser-widgets 模块创建一个 simple-teaser-widgets 模块,该模块确实使用 removeFields 删除 size 字段。然后你可以把你想要的小部件类型放在每个区域而忽略另一个。

index.js 对于 simple-teaser-widgets 确实非常简单:

module.exports = {
  extend: 'teaser-widgets',
  label: 'Simple Teaser'
};