拥有撇号小部件的 beforeSave 处理程序

Own beforeSave handler for the apostrophe widget

如何编写撇号小部件的 beforeSave() 处理程序?小部件 index.js 中的这段代码对我不起作用:

module.exports = {
  extend: 'apostrophe-widgets',
  label: 'My widget',
  addFields: [
  {
      name: 'label',
      type: 'string',
      label: 'Caption',
      required: true
  }
  ],
  construct: function(self, options) {

    self.beforeSave = function(callback) {
      console.log("beforeSave");
      return callback();
    }
  }
};

当我保存一个小部件的实例时,日志没有改变。是否可以为部件编写自己的 beforeSave() 处理程序?

小部件只是文档的一部分,文档作为一个单元而不是单个小部件保存到数据库中。所以没有beforeSave.

但是,如果您想要做的是在每次清理小部件以可能包含在可能保存的文档中时采取一些操作,请查看 sanitize 方法:

self.sanitize = function(req, input, callback) {
  var output = self.apos.schemas.newInstance(self.schema);
  var schema = self.allowedSchema(req);
  output._id = self.apos.launder.id(input._id) || self.apos.utils.generateId();
  return self.apos.schemas.convert(req, schema, 'form', input, output, function(err) {
    if (err) {
      return callback(err);
    }
    output.type = self.name;
    return callback(null, output);
  });
};

注意此方法如何获取 input,这是浏览器提供的数据,并通过 apos.schemas.convert 运行它以仅将有效数据复制到 output。然后它将 output 发送到它的回调。

我们可以使用 "super pattern" 在此过程结束时进行更改。例如,富文本小部件通常没有架构,它们只有 content 属性 包含标记。但是,他们在某些网站上也可能有一个架构。所以这里是 apostrophe-rich-text-widgets 模块如何使用 "super pattern" 扩展 sanitize 方法来接受额外的内容,而不会失去保存模式内容的能力:

var superSanitize = self.sanitize;
self.sanitize = function(req, input, callback) {
  return superSanitize(req, input, function(err, output) {
    if (err) {
      return callback(err);
    }
    output.content = sanitizeHtml(input.content, self.options.sanitizeHtml);
    return callback(null, output);
  });
};

注意:

  • 方法的原始版本被捕获在变量superSanitize中。然后一个新的函数被指定为方法。
  • 原版superSanitize调用。如果失败,我们会先处理。
  • output被修改。您对 output 所做的任何更改都将直接进入文档中的小部件,因此请确保验证您从 input 接受的任何内容。浏览器(和黑客编写的脚本)会撒谎。
  • 我们以与原始方法相同的方式结束:通过 (null, output).
  • 调用回调