1

使用撇号博客,我在lib\modules\apostrophe-blog\index.js. 这些字段之一是select列表。但是,我需要根据正在编辑的文章的其他属性动态填充列表值。目前,我正在尝试这个,但管理模式停止工作,所以这看起来不会工作:

module.exports = {
    contextual: true,
    addFields: [
      {
        type: 'select',
        name: 'featuredIn',
        label: 'Featured In:',
        choices: []
      },
      construct: function (self, options) {
          self.pageBeforeSend = (req, callback) => {
            var featuredIn = self.options.addFields.find(x => x.name === 'featuredIn');
           featuredIn.choices = []; //do a lookup from db - self.apos.docs.find(req, { id: ?})
            return callback(null);

          }
      }
  };

有没有另一种方法来做到这一点?目前,我不确定我将挂钩​​什么事件来设置这些值,以及我将在哪里检索正在编辑的文章的文章 ID - self.apos.docs.find(req, { id: ?})。提前感谢您的指导。

4

1 回答 1

0

如你所知,我是 P'unk Avenue 的 Apostrophe 的首席开发人员。

我相信您正试图将一种作品类型与另一种作品类型联系起来。这是一个内置功能;你只想加入。

你没有说什么类型的文档被推荐,以及它被“推荐”在什么其他类型的文档中。这已经令人困惑了(:所以让我举个例子:

  • 你有卖东西的“商店”。
  • 你有“产品”。每个产品都可能出现在一个“商店”中。
  • 两者都是“撇号”子类,但请记住以下技术也适用于页面类型。

店铺模式

addFields: [
  {
    name: '_products',
    type: 'joinByArray',
    label: 'Featured:',
    withType: 'product',
    idsField: 'productIds',
    sortable: true
  }
]

轰……就是这样。当您编辑商店时,您会自动获得一个字段,允许您自动填写产品名称并选择它们。然后,当您查看商店时,您会发现该._products属性已为您填充。

idsField属性只是一个 mongodb 属性,它将存储所选产品 ID 的实际数组。您可以给它任何名称,但我们建议使用此命名约定。

_注意:您必须为连接使用前导name。如果您不这样做,则连接最终会存储在数据库中,这是多余的,而且几乎立即过时。意思是“_我是一个动态的、临时的财产,不要存储我。每次需要我都会重新计算。”

从产品端访问商店

到现在为止还挺好。但有时你有一个产品,你想知道它在哪些商店有特色。没问题:

产品架构

addFields: [
  {
    name: '_shops',
    type: 'joinByArrayReverse',
    label: 'Featured In:',
    withType: 'shop',
    idsField: 'productIds'
  }
]

这是一个“反向连接”。只要您有一个对象,它就会使_shops数组可用。product它通过定位包含该产品的商店来工作productIds

您不能从反向端编辑联接。如果那是您要进行编辑的结尾,只需更改 which party hasjoinByArray和 which party has joinByArrayReverse

希望这有帮助!

另请参阅我们的架构指南,其中详细介绍了连接。

于 2016-11-23T20:51:49.550 回答