如何用KeystoneJS列表CSV下载/导出中的名称/标题替换关系字段类型对象ID?

时间:2014-07-31 11:18:33

标签: keystonejs

在Keystone管理列表视图中,方便的下载链接导出CSV文件中的所有列表项,但是,如果某些字段属于关系类型,则导出的CSV包含Mongo ObjectID而不是nmeaningful字符串(名称,标题等)这将是有用的。

如何强制ObjectIDs被另一个字段映射/替换?

1 个答案:

答案 0 :(得分:1)

Keystone具有未记录的功能,允许您创建自己的自定义CSV导出功能。此功能已于4月添加(请参阅KeystoneJS Issue #278)。

您需要做的就是向名为toCSV的架构添加方法。当指定为此方法的参数时,Keystone将注入以下任何依赖项。

 - req (current express request object)
 - user (currently authenticated user)
 - row (default row data, as generated without custom toCSV())
 - callback (invokes async mode, must be provided last)

例如,您可以使用Mongoose Model.Populate方法将任何关系字段的Object Ids替换为您想要的任何数据。

假设您有一个Post列表author字段Types.Relationship到另一个列表(假设为User),其中包含name字段。您可以通过执行以下操作,将author对象ID替换为作者姓名(来自User列表)。

Post.schema.methods.toCSV = function(callback) {

    var post = this,
        rtn = this.toJSON();

    this.populate('author', function() {
        rtn.author = post.author.name; // <-- author now has data from User list
        callback(null, rtn);
    });

};
对于以.toCSV()作为上下文返回的每个文档,将调用

Model。当异步使用时(如上所述),您应该通过将其作为回调的第二个参数传递来返回新CSV数据的JSON表示。同步使用它时,只需返回更新的JSON对象。