Как получить доступ к свойствам / параметрам виджета внутри шаблона виджета в Apostrophe cms - PullRequest
0 голосов
/ 16 мая 2019

Я играл с Apostrophe CMS и пытался создать виджет, который получает некоторые значения от стороннего API на основе его настроек. Есть ли способ получить значения виджета внутри виджета index.js? В основном, когда администратор создает страницу, он добавляет виджет с некоторыми установленными значениями. И поведение виджета должно меняться в зависимости от этих настроек. Возможно ли это вообще, и если да, то как?

const request = require('request-promise');

module.exports = {
    extend: 'apostrophe-widgets',
    label: 'Listing widget',
    addFields: [
        {
            name: 'page',
            type: 'integer',
            label: 'Page',
            required: true
        },
        {
            name: 'count',
            type: 'integer',
            label: 'Count',
            required: true
        }
    ],
    construct: function(self, options) {
        self.on('apostrophe-pages:beforeSend', 'preset', async function(req) {
            var page = ...;
            var count = ...;
            const dataToList = await request({
                uri: "someURL?count=" + count + "&page=" + page,
                json: true
              });
            req.data.dataToList = dataToList;
        });
    }
};

В моем коде вы можете увидеть очень простой виджет. Единственное, что мне нужно, это как-то получить значения для переменных page и count.

Обновление: По совету Стюарта Романека исправленный окончательный код выглядит следующим образом:

const request = require( 'request-promise' );

module.exports = {
    extend: 'apostrophe-widgets',
    label: 'Listing widget',
    addFields: [
        {
            name: 'page',
            type: 'integer',
            label: 'Page',
            required: true
        },
        {
            name: 'count',
            type: 'integer',
            label: 'Count',
            required: true
        }
    ],
    construct: function( self, options )
    {
        const superLoad = self.load;
        self.load = ( req, widgets, callback ) => superLoad( req, widgets, async ( err ) =>
        {
            if( err )
            {
                return callback( err );
            }

            for( const widget of widgets )
            {
                var page = widget.page;
                var count = widget.count;

                const dataToList = await request( {
                    uri: "http:/APIRoute?count=" + count + "&page=" + page,
                    json: true
                } );

                widget.dataToList = dataToList;
            }
            return callback( null );
        } );
    }
};

А из HTML к нему можно получить доступ: data.widget.dataToList.

1 Ответ

0 голосов
/ 16 мая 2019

Если вы хотите что-то сделать с виджетом до его рендеринга на странице, вы можете подключиться к методу load виджета в его index.js

module.exports = {
  name: 'my-widget',
  label: 'My Widget',
  construct: (self, options) => {
    const superLoad = self.load;
    self.load = (req, widgets, callback) => superLoad(req, widgets, (err) => {
      if (err) {
        return callback(err);
      }

      // Hit some API, do something wacky

      for (const widget of widgets) {

        // do something to each widget

        widget.coolThing = true;
      }
      return callback(null);
    });
  }
};

https://docs.apostrophecms.org/apostrophe/modules/apostrophe-widgets#load-req-widgets-callback

В load, widgets - это массивы виджетов этого типа, загружаемые по этому запросу. Здесь вы можете понять, хотите ли вы что-то добавить к данным виджета. Вы можете получить доступ к этой информации в своем шаблоне и js.

...