Собственный обработчик beforeSave для виджета апостроф - PullRequest
0 голосов
/ 04 сентября 2018

Как кодировать обработчик 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 голосов
/ 05 сентября 2018

Виджет - это только одна часть документа, и документы сохраняются в базе данных как единое целое, а не как отдельные виджеты. Так что нет 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. Браузеры (и скрипты, написанные хакерами) могут лгать.
  • Мы завершаем то же самое, что и оригинальный метод: вызывая обратный вызов с (null, output).
...