2017-03-09 7 views
2

私は2つのタイプのピースを持っています。著者と、もう1つはです。記事です。それはアポストロフィのDemoと作家のリストで実装されているように私は(authors-pages/viewsindexAjax.htmlindex.htmlを使用して)だけでなく(articles-pagesindexAjax.htmlindex.htmlを使用して)記事の一覧を表示することができます。ピースを他のピースに展示するにはどうすればいいですか?

私の質問は、特定の著者がshow.htmlファイル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 
       } 
      } 
     }, 

.... 

    ] 

}; 

です!

+0

こんにちはKarlen、開始点としてjoinByArray [guide](http://apostrophecms.org/docs/tutorials/getting-started/schema-guide.html#code-join-by-array-code)を使用してください。 –

+0

こんにちは@ robert-jakobson、ご意見ありがとうございます。私はすでに解決策を見つけました。私は 'joingByArray'を使いたくないのです。アーティクルのIDを作成した記事がそのリストに追加されると、db docs間のリンクが1対1になるため、この特定のケースではうまくいきません。 – Karlen

答えて

3

私はP'unk Avenueでのアポストロフィの建築家。

独自のソリューションのコードは、すでに持っている機能、つまり逆方向結合を効果的に再実装します。

"フォワード"結合(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

ありがとうございます。私はドキュメントのすべてのページをほとんどチェックしましたが、このオプションを実現しなかったか、忘れてしまったのでしょうか、ドキュメントを見落としている可能性があります。とにかく素晴らしいプラットフォームとあなたの答えにも感謝します! – Karlen

+0

あなたは大歓迎です! –

1

私は自分の質問に対する回答を見つけました(代替回答を表示する前に)。それが他の人に役立つことを願っています。

したがって、articlesauthorsの2つがあります。

の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 %} 
関連する問題