撇号:将自定义全局设置拉入beforeConstruct for piece模块(博客)

时间:2018-01-22 19:47:35

标签: javascript mongodb apostrophe-cms

我试图在具有数组字段类型的相应区域中提取我创建的自定义全局设置。

我想将全局设置拉入博客模块,以构建一个字段以添加到博客类型。我尝试使用撇号模型层和mongo db集合,如教程文档中所述,但看起来需要一些req交互或self.method才能正确触发,我不认为可在beforeConstruct函数中找到。

// This would ideally be a data.global.arrayField
var optionArraySet = ['Item 1', 'Item 2', 'Item 3'];
var formattedArraySet = [];
for (var type in optionArraySet) {
  formattedArraySet.push({
    label: optionArraySet[type],
    value: optionArraySet[type]
  })
}
options.addFields = [
  {
    label: 'Custom Array Field',
    name: 'customArrayField',
    type: 'select',
    choices: formattedArraySet
  }
].concat(options.addFields || [])

所以optionArraySet理想情况下是包含我想要访问的数据数组的全局设置。

对于上下文,此全局设置将适用于几个不同的区域,而不是必须更新后端中的代码,如果我们想要更改值,我可以在全局设置中向数组集添加新值并让前端页面更新其显示和设置字段更新相应的部分。

如果这有帮助,我基本上试图控制内容编辑器可以选择特定片段类型的标签,这样他们就无法输入不需要的标签。

construct: function(self, options) {
 self.beforeSave = function(req, piece, options, callback) {
  var newTags = [];

  newTags.push(piece.anotherFieldValue);

  var customArrayField = piece.customArrayField;

  for (var option in customArrayField) {
    newTags.push(customArrayField[option]);
  }

  piece.tags = newTags;
  return callback();
 };
}

由于

1 个答案:

答案 0 :(得分:1)

由于可以随时编辑全局设置,并且default仅在站点启动时执行,因此在那里读取全局设置并不十分有用。

有些方法可以在运行时修补架构,但有一个更简单的解决方案:

  1. 创建一个新的片段类型模块“special-tags”。将<?xml version="1.0" encoding="UTF-8"?> <dispatch-entries> <dispatch> <url>m1.myapp.com/*</url> <module>m1</module> </dispatch> <dispatch> <url>m2.myapp.com/*</url> <module>m2</module> </dispatch> </dispatch-entries> 设为beforeConstruct

  2. 使用名为name的{​​{1}}架构字段加入special-tag

  3. 现在,用户只能在编辑在其架构中具有此联接的文档时从特殊标记列表中进行选择,并且管理员可以通过管理栏编辑特殊标记,就像任何其他片段类型一样。联接会加载文档,因此您可以访问joinByArray并查找包含标记名称的_specialTags属性的文档数组。

    有关withType: 'special-tag'的详情,请参阅:

    http://apostrophecms.org/docs/tutorials/getting-started/schema-guide.html#code-join-by-array-code

    一般的架构指南。