使用ApostropheCMS语言渲染页面

时间:2018-08-16 08:02:05

标签: apostrophe-cms

我知道这种愚蠢的问题要问。但是对于初学者和熟悉express nodejs的人来说,这个问题也可能对其他人有用。对我来说,我很熟悉使用Express Node.js用这种方法渲染nunjucks。这是一个我们都知道的例子:

nunjucks.render('index.html', { foo: 'bar' });

我在documentation上使用render(req, name, data)找到了您的Apostrophe文档。我想自定义光标和覆盖 req.data,就像在上面使用nunjucks一样。而且我发现this是正确的使用方法,而且我不知道从哪里开始!我应该使用self.beforeShow吗?我不想在发生GET请求的地方使用self.route。我只想添加其他数据并将其呈现在show.htmlindexAjax.html上,或者甚至使用自定义indexCustom.html来呈现它,类似于上面的Nunjucks示例。我知道如何做游标并通过它来操纵数据。我是一个学习缓慢的人,但我从未停止学习。先感谢您。

  

P / s:如果你们可以在HOWTO部分发布新的教程,以将此“额外渲染/覆盖数据到页面中”,那将是非常有帮助的!

1 个答案:

答案 0 :(得分:1)

要使其他数据可用于页面模板,最简单的方法是监听apostrophe-pages:beforeSend promise事件(使用Apostrophe 2.63.0或更高版本):

// in app.js

var apos = require('apostrophe')({
  shortName: 'myproject',
  // among other things
  modules: {
    'apostrophe-pieces': {}
  }
});

// in lib/modules/products/index.js


module.exports = {
  extend: 'apostrophe-pieces',
  name: 'product',
  construct: function(self, options) {
    self.on('apostrophe-pages:beforeSend', 'getAllProducts', function(req) {
      // Let's assume you have a "products" module that extends pieces
      // and you want all of them on every page (not necessarily a good idea)
      return self.apos.modules.products.find(req).toArray().then(function(products) {
        req.data.products = products;
      });
    });
  }  
};

{# In any page template or layout #}

{% for product in data.products %}
  {{ product.title }}
{% endfor %}

较旧的方法是实现pageBeforeSend方法,但这会迫使您使用回调,并且promises绝对是2018年的发展之路。

您没有为用例指定更多的内容,因此我的示例是一种以常规方式扩展片段的方法,但要确保所有片段在每个页面上都可用-这可能是一个好主意或糟糕,取决于您拥有多少,但是它展示了这种技术。