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

时间:2018-09-04 19:51:05

标签: apostrophe-cms

如何为撇号小部件编写 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()处理程序吗?

1 个答案:

答案 0 :(得分:1)

窗口小部件只是文档的一部分,并且文档作为一个单元而不是单个窗口小部件保存到数据库中。因此没有<div> Third Element <div> <level3 name="jim"> </level3> </div> </div>

但是,如果您想要做的是每次清洁窗口小部件以潜在地包含在可以保存的文档中时采取一些措施,请查看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属性。但是,它们可能在某些站点上也具有架构。因此,content模块使用“超级模式”扩展apostrophe-rich-text-widgets方法以接受附加内容,而又不失去保存模式内容的能力的方法如下:

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调用回调。