在 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'
};
我目前正在尝试让我的模块正常工作。通过添加字段扩展模块效果很好。我使用了几个模块(例如 "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'
};