apostrophe-cms - 向小部件添加自定义参数

标签 apostrophe-cms

假设我们创建了一个简单的小部件,它可能有一个字符串或一个富文本字段。当我将小部件插入 html 时,我想指定哪个字段可见/事件。换句话说,我想向小部件添加一些自定义选项,这将改变它的行为。 小部件如下所示:

{{
    apos.singleton(data.page, 'footerTitle', 'footerTitle', {
        controls: {
            movable: false,
            position: 'top-right'
        }
    })
}}

我想做这样的事情:

{{
    apos.singleton(data.page, 'footerTitle', 'footerTitle', {
        controls: {
            movable: false,
            position: 'top-right'
        },
        settings: {
            type: 'string',
            anotherParameter: 1,
            thirdParameter: false
        }
    })
}}

稍后(在小部件的 index.js 中)相应地处理这些参数:

...
beforeConstruct: function( self, options )
{
    if (type === 'string')
    {
        // Do some additional setup, magic, whatever...
    }
    switch (anotherParamter)
    {
        // Add some insane code here :)
    }
},
construct: function( self, options )
    {
        const superLoad = self.load;
        self.load = ( req, widgets, callback ) => superLoad( req, widgets, ( err ) =>
        {
            if( err )
            {
                return callback( err );
            }

            for( const widget of widgets )
            {
                // Some additional work here based on the initial settings.
            }

            return callback( null );
        } );
    }
...

是否有可能向小部件添加自定义参数、选项(在 2.98.1 版本或 3.0.0 更高版本中)?

最佳答案

这在 Apostrophe 2.x 中显示的方式中是不可能的,因为小部件选项是从模板传递的,并且模板只能执行同步工作。此时小部件模块的load 方法已经运行。因此,现在影响获取内容的方式为时已晚。

但是,有一种方法可以获得您想要的效果。我们在这种情况下所做的是创建小部件的子类,并在每个地方使用适当的子类。或者,我们有时会在小部件的架构中使用选择元素。

在这两种情况下,您都可以修改 load 的行为以适应这种情况。

对于子类化方法,可以编写扩展第一个模块的第二个模块:

// in lib/modules/subclass-widgets
module.exports = {
  name: 'subclass',
  extend: 'original-widgets',
  construct: function(self, options) {
    var superLoad = self.load;
    self.load = function(req, widgets, callback) {
      // ... we can call superLoad if we want or completely replace it
    };
  }
}

然后在模板中,您可以选择originalsubclass 或两者。

对于选择字段替代方案,您可以只使用一个小部件类型:

// in lib/modules/cool-widgets/index.js
module.exports = {
  name: 'cool',
  addFields: [
    {
      name: 'subtype',
      label: 'Subtype',
      type: 'select',
      choices: [
        {
          label: 'One',
          value: 'one'
        },
        {
          label: 'Two',
          value: 'two'
        },
      ]
    }
  ]
  construct: function(self, options) {
    self.load = function(req, widgets, callback) {
      for (const widget of widgets) {
        if (widget.subtype === 'two') { ... }
      }
    };
  }

最佳选择取决于您是否通常每次都为用户提供选择并且代码不会有太大差异(使用 select 元素),或者您是否想限制他们在每个模板中可以做的事情(而是使用子类化,并且只在每个模板中放置与用例匹配的子类。

至于3.0版本,会有办法实现你最初在3.0要求的。一方面,output 方法是 3.x 中的 async 方法。这意味着您可以覆盖它并使用选项进行异步工作。另一方面,3.x 支持模板中的异步组件:

https://github.com/apostrophecms/apostrophe/issues/1668

(关闭,因为是在3.0分支实现的)

但是,3.0 的发布还有一段时间,现在还不是开始项目的时候。 2.x 版在 2023 年之前提供企业支持,作为维护者,我们今天在 2.x 上开始新的企业项目,所以我不建议等待。

3.0 的开发在今年夏天有所放缓,因为我们将 Apostrophe Technologies 扩展到自己的公司,并承担了基于 2.x 的额外企业支持工作,但从长远来看,这让我们能够增加人员并追求3.0 在接下来的几个月中更加有效。

关于apostrophe-cms - 向小部件添加自定义参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58505134/

相关文章:

javascript - ApostropeCMS - 在快速 route 渲染完整的 HTML 页面

apostrophe-cms - 自动将用户添加到撇号

apostrophe-cms - 模板数据权限

javascript - Apostrope CMS 中的文章作者不会向未登录的用户显示

apostrophe-cms - 为页面设置添加更多字符 SEO 描述和字段

javascript - $.json调用导致错误,但收到正确的数据

apostrophe-cms - 如何通过电子邮件发送 ApostropheCMS 联系表格提交?

node.js - 在 Apostrope cms 中使用第 3 方 jquery 插件

css - 撇号 CMS,如何在一 block 中设置富文本样式

javascript - 在 ApostropeCMS 中编辑时添加只读字段