Создание виджета для списка страниц с пользовательским атрибутом - PullRequest
0 голосов
/ 06 июля 2018

Это мой первый опыт создания сайта с Apostrophe, поэтому, пожалуйста, прости меня!

Я создал пользовательский атрибут на страницах, похожих на следующие:

module.exports = {
  beforeConstruct: function(self, options) {
    options.addFields = [
      {
        name: 'include_in_list', 
        label: 'Include In List',
        type: 'boolean'
      }
    ].concat(options.addFields || []);    
  }
};

Цель состоит в том, чтобы теперь создать виджет, который отображает ссылки на все страницы с этим установленным флагом, но я изо всех сил пытаюсь выяснить, куда идти дальше ... как составить список страниц с установленным флагом, а затем выставить этот список к шаблону моего виджета?

1 Ответ

0 голосов
/ 06 июля 2018
  1. Простым (и более ручным) способом было бы добавить поле joinByArray к вашему виджету, которое предназначено для страниц, а затем вручную присоединить ваши страницы к вашему виджету. Это позволит вам отсортировать порядок присоединяемых страниц с помощью пользовательского интерфейса, но его нужно будет обновить вручную, чтобы добавить больше страниц в виджет. https://apostrophecms.org/docs/tutorials/getting-started/schema-guide.html#code-join-by-array-code

  1. Способом, более похожим на ваше описание (но немного более непрозрачным), было бы переопределение метода load виджета и ручное извлечение целевых страниц при загрузке страницы.

в /lib/modules/special-widgets/index.js

module.exports = {
  extend: 'apostrophe-widgets',
  label: 'Special',
  construct: function (self, options) {
    const superLoad = self.load;
    self.load = function (req, widgets, callback) {
      return superLoad(req, widgets, function (err) {
        if (err) {
          return callback(err);
        }
        // `widgets` is each widget of this type being loaded on a page
        return self.apos.modules['apostrophe-pages'].find(req, { mySpecialProp: true }, {slug: 1, type: 1, _id: 1, title: 1}).toArray(function (err, docs) {
          widgets.forEach(function (widget) {
            // attach docs to each widget, in your widget template this becomes data.widget._pages
            widget._pages = docs;
          });
          return callback(null);
        })        
      });
    };
  }
}

В вашем lib/modules/special-widgets/views/widget.html вы можете получить доступ к этому массиву страниц в data.widget._pages

Обратите внимание, что { mySpecialProp: true } является критерием для вашего поиска, установите его, чтобы найти свойство вашей страницы.

Подробнее о методе .find() на Работа с курсорами

...