2

私は 2 種類の作品を持っています。1 つはAuthorsで、2 番目はArticlesです。Apostrophe's Demoに実装されているように、記事のリストを ( and を使用indexAjax.htmlして)index.html表示することができます。articles-pagesindexAjax.htmlindex.htmlauthors-pages/views

show.html私の質問は、特定の著者が書いた記事をfile ofを使用して表示するにはどうすればよいauthors-pages/viewsですか?
したがって、ユーザーが著者をクリックすると、指定した著者によって書かれた記事のリストが表示されるはずです。

lib/modules/articles/index.jsファイルは以下

module.exports = {
    extend: 'apostrophe-pieces',
    name: 'articles',
    label: 'Article',
    pluralLabel: 'Articles',
    contextual: true,
    addFields: [
        {
            name: '_author',
            type: 'joinByOne',
            withType: 'author',
            label: 'Author',
            idField: 'author',
            filters: {
                projection: {
                    title: 1,
                    slug: 1,
                    type: 1,
                    tags: 1
                }
            }
        },

....

    ]

};

どんな助けでも大歓迎です!

4

2 に答える 2

3

私はパンク アベニューのアポストロフィの設計者です。

独自のソリューションのコードは、既にある逆結合という機能を効果的に再実装しています。

すでに「前方」結合 ( joinByOne) があります。したがってjoinByOneReverse、これらのアイテムを「反対側」から利用できるようにするために使用します。

authorのスキーマでは、次のように記述できます。

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して、インデックス ページや複数の作成者をロードするその他のコンテキストでフェッチされないようにすることもできます。

詳細については、スキーマのガイドをご覧ください。

于 2017-03-10T13:13:15.057 に答える
2

自分の質問に対する回答を見つけました (投稿された別の回答を見る前に)。それが他の人に役立つことを願っています。

したがって、 と の 2 つの部分がarticlesありauthorsます。

lib/modules/authors-pages/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/modules/authors-pages/view/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 %}
于 2017-03-09T20:32:00.430 に答える