我有两种类型的作品,一种是作者,第二种是文章。我可以显示文章列表(在indexAjax.html
中使用index.html
和articles-pages
),因为它在Apostrophe的Demo和作者列表中实现(通过使用{ {1}}和indexAjax.html
中的index.html
。
我的问题是如何使用authors-pages/views
show.html
文件显示某位指定作者撰写的文章?
因此,当用户点击某位作者时,他/她应该能够看到指定作者撰写的文章列表。
authors-pages/views
文件如下
lib/modules/articles/index.js
任何帮助将不胜感激!
答案 0 :(得分:3)
我是P' unk Avenue的撇号建筑师。
您自己的解决方案中的代码有效地重新实现了我们已有的功能:反向连接。
你已经有了#34;前进"加入(joinByOne
)。因此,请使用joinByOneReverse
从"另一方提供这些项目。"
在作者的架构中,您可以这样写:
addFields: [
{
name: '_articles',
type: 'joinByOneReverse',
withType: 'articles',
label: 'Articles',
idField: 'author',
filters: {
projection: {
title: 1,
slug: 1,
type: 1,
tags: 1
}
}
}
]
这使得每个作者都可以使用._articles
数组属性。
重要的是要注意idField
不会发生变化。我们故意使用相同的信息,以便获得相同的内容。
如果您愿意,还可以在该字段上设置ifOnlyOne: true
,以避免为索引页和其他加载多个作者的上下文提取该文件。
查看guide to schemas了解详情。
答案 1 :(得分:2)
我找到了自己问题的答案(在看到已发布的替代答案之前)。希望它对其他人有用。
因此有两件articles
和authors
。
<强> LIB /模块/作者-页/ index.js 强>
module.exports = {
extend: 'apostrophe-pieces-pages',
articlesPerPage: 3,
construct: function (self, options) {
var beforeShow = self.beforeShow;
self.beforeShow = function (req, callback) {
var limit = self.options.articlesPerPage;
var skip = req.query.page || 1;
skip = (parseInt(skip) - 1) * limit;
if (!req.data || !req.data.piece) {
return beforeShow(req, callback);
}
var cursor = self.apos.docs.getManager('articles').find(req, {
author: req.data.piece._id
});
cursor
.skip(skip)
.limit(limit)
.sort({ createdAt: -1 })
.toArray(function (err, articles) {
req.data._articles = articles || [];
req.data.currentPage = Math.ceil((skip + 1) / limit);
cursor.toCount(function(err, count){
if(err)
count = 1;
req.data.totalPages = Math.ceil(count / limit);
beforeShow(req, callback);
})
})
}
}
}
<强> LIB /模块/作者-页/图/ show.html 强>
{% extends data.outerLayout %}
{% block title %}
{{ data.piece.title }}
{% endblock %}
{% block main %}
{% for article in data._articles %}
<p>{{article.title}}</p>
{% endfor %}
{% import 'apostrophe-pager:macros.html' as pager with context %}
{{ pager.render({ page: data.currentPage, total: data.totalPages }, data.url) }}
{% endblock %}