动态设置文章的字段选择

Dynamically set field choices for article

使用 apostrophe-blog,我在 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: ?})。在此先感谢您的指导。

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

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

你没有说是什么类型的文档,以及它是什么其他类型的文档"featured in."写起来已经很混乱了(:所以让我举个例子:

  • 你有 "shops" 卖东西。
  • 您有 "products." 每个产品可能在一个 "shop."
  • 中有特色
  • 两者都是 "apostrophe-pieces" 子类,但请记住以下技术也适用于页面类型。

商店架构

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

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

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

注意:对于连接的 name,您必须使用前导 _。如果你不这样做,连接最终会存储在数据库中,这是多余的,而且几乎立即过时了。 _ 表示 "I am a dynamic, temporary property, don't store me. I'll get calculated again every time I am needed."

从产品端访问商店

到目前为止一切顺利。但有时你有一个产品,你想知道它在哪些商店有特色。没问题:

产品架构

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

这是一个 "reverse join." 它使 _shops 数组在您有 product 对象时随时可用。它的工作原理是在 productIds 数组中找到包含此产品的商店。

您不能从反向端编辑联接。如果这就是您要进行编辑的结尾,只需更改哪一方有 joinByArray 和哪一方有 joinByArrayReverse.

希望对您有所帮助!

另请参阅我们的 schema guide,其中详细介绍了联接。