【问题标题】:How to specify custom dev/prefix in a Keystone LocalFile field如何在 Keystone LocalFile 字段中指定自定义开发/前缀
【发布时间】:2015-03-20 13:12:44
【问题描述】:

我想在我稍后传递给 List.add 的架构对象中使用从 keystone.List 构造函数中的 autokey 插件生成的相同值。

这更准确地说是我想要做的:

var Thing = new keystone.List('Thing', {
    autokey: { path: 'slug', from: 'title', unique: true }
});

Thing.add({
    image: {
        type: Types.LocalFile,
        dest: 'public/images/things/'+Thing.slug,
        prefix: '/images/things/'+Thing.slug+'/',
        format: function( ThingDoc, file ) { return '<img src="/images/things/'+ThingDoc.slug+'/'+file.filename+'" style="max-width:300px" />' }
    }
});

所以这当然行不通。以后如何在我的架构中重新使用自动键入的 slug 值?

顺便说一句,引用在“格式”函数中起作用,因为当调用该函数时,它可以通过实例化模型提取存储的值。

【问题讨论】:

    标签: mongoose keystonejs mongoose-plugins


    【解决方案1】:

    在您上面的用例中,destprefix 似乎表示生成的值不需要在 Keystone Admin UI 中可用。 Mongoose 有一个名为virtual attributes 的功能,您可以将其准确地用于此用例。 虚拟属性是通过调用 Mongoose schema.virtual() 方法来定义的。由于 Keystone 在其 .schema 属性中公开了任何 List 的猫鼬 schema,因此您可以轻松地将 destprefix 转换为 虚拟属性

    除了虚拟属性,Mongoose 还提供instance methods,您可以从中引用任何已定义的虚拟属性。您将format 转换为实例方法,然后简单地从其中引用prefix 虚拟属性

    最后,确保在调用 List 的.register() 方法之前定义了所有虚拟属性实例方法。查看schema plugins 上的 Keystone 文档了解更多详情。

    这是您使用虚拟属性实例方法的代码示例。

    对于上面冗长而无用的解释,我们深表歉意。我没有意识到 destprefixLocalFile 架构的一部分。

    每次上传都有一个自定义路径对我来说没有多大意义。恕我直言,存储单个文件的自定义/单独路径似乎不是很有用。但是,具有默认为自动创建的slug 的自定义文件名。这就是我将如何做到的。希望这对你有用。

    var Thing = new keystone.List('Thing', {
      autokey: { path: 'slug', from: 'title', unique: true }
      }
    });
    
    Thing.add({
        image: {
          type: Types.LocalFile,
          dest: 'public/images/things/',
          prefix: '/images/things/',
          filename: function(item, file) {
            return item.slug;
          },
          format: function(item, file) { 
            return '<img src="' + item.prefix + item.filename + '" style="max-width:300px" />';
          }
    });
    
    Thing.register();
    

    注意:Mongoose 允许您为每个定义的虚拟属性同时定义gettersetter(分别使用.get().set() 方法)。但是,由于在您的用例中destprefix 似乎是只读,因此我只在上面的示例代码中为它们定义了getter

    【讨论】:

    • 我喜欢为这些属性使用虚拟属性的想法,尤其是因为 Keystone 仅将它们用于内部上传处理,并且实际上存储了一组完全不同的图像属性。
    • 多次按回车键...评论继续:因为 Keystone 显式检查要在图像选项对象中设置的那些属性,所以虚拟程序无法工作。我希望我能说服 Keystone 项目中的某个人使用 pre/post 钩子对这些属性进行更精细的控制。感谢您详尽解释的建议。
    • 你是绝对正确的。我忘了destprefixformatLocalFile 架构的一部分。现在我回去检查了LocalFile 的代码,您打算将每个上传的文件存储在一个单独的文件夹中(即每个文件夹一个文件)。这对我现在没有意义。 pathprefix 背后的想法是使用单个路径来存储所有上传的文件。如果您想要自定义文件名,我可以理解。如果是这种情况,您可以通过将filename 属性设置为返回自定义名称的函数来自定义它。我会相应地更新我的答案。
    • 我的推理是这样的:我正在建立一个产品目录,每个产品最多有 8 个产品照片(尽管没有必要在那里设置限制)。我已经使用filename 属性为图像添加前缀以便于查找,因此可以将所有内容转储到一个目录中。不过,我希望能够支持数百甚至数千种产品,因此我喜欢将每个产品的图像(以及以后可能关联的任何其他文件)分开的想法。我希望这对你来说是足够的理由。再次感谢您的宝贵时间。
    • 我明白你的意思。这是一个有趣的用例。我将创建一个拉取请求以将此功能添加到 Keystone(我将在此处发布进度)。如果 PR 被合并,我将在此处发布并编辑我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-29
    • 1970-01-01
    • 2021-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多