向Keystone添加自定义字段的正确方法是什么(包含在管理UI表单中)?

时间:2017-11-07 14:21:50

标签: keystonejs

我可以看到字段的好解释,以及它们的构成,在这里:https://github.com/keystonejs/keystone/tree/v4.0.0-beta.5/fields

如何添加自定义字段?

添加一个自定义字段(在我自己的项目中进行版本化,这取决于keystone,或者可能已经足够通用,可以推送到npm)在梯形图设置脚本中导入它并以某种方式改变keystone实例或其他什么,以便它也加载我的字段与内置的?

编辑:

用例位于管理界面的上下文中(例如,您有一个用户keystone模型,并且您希望用户表单具有一个新的自定义字段,其UI是您实现的任意反应组件)

1 个答案:

答案 0 :(得分:0)

该框架支持存储字段,如本地文件,s3,azure,cloudinary图像和嵌入字段。这可能会满足您的文件字段需求。

自定义字段

keystone wiki似乎有keystonejs wiki的简短教程,在撰写本文时,管理界面不支持自定义类型。

wiki中的示例代码包含信用卡号的验证方法,因此这可能是您正在寻找的功能类型。

以下是自定义类型的简短示例。这是一个只接受杰夫或亚历山大作为有效值的字段。您可以将其放在自己的myNameType.js文件中。

var keystone = require('keystone');
var util = require('util');

/*
    Custom FieldType Constructor
    @extends Field
    @api public
*/
function myName(list, path, options) {
    // add your options to this
    // call super_  
    this._nativeType = Text;
    myName.super_.call(this, list, path, options);  
}

/* inherit Field */
util.inherits(myName, keystone.Field);    

/* override or add methods */
myName.prototype.validateInput = function(data) {
    console.log('validate my name');
    var isValid = false;

    if (data && (data.toLower() === 'jeff' || data.toLower() === 'alexander')) {
        isValid = true;
    }

    return isValid;
};

然后在keystonejs启动文件中注册您的类型:

// Require keystone
var keystone = require('keystone');

 // add a new custom Field Type
Object.defineProperty(
    keystone.Field.Types,
    'MyName',
    { 
        get: function() {
            // or whatever your path is
            return require('./myName.js');
        } 
    }
);

从那里你可以在模型中使用它(记得由于缺乏管理UI支持而将其设置为隐藏):

var keystone = require('keystone');
var Types = keystone.Field.Types;

var Person = new keystone.List('Post', {
    map: { name: 'title' },
    autokey: { path: 'slug', from: 'title', unique: true },
    sortable: 'unshift',
    perPage: 5,
    track: true,
    autocreate: true
});

Person.add({
    name: { type: Types.MyName, label: 'My Name', hidden: true },
    heightInInches: { type: Types.Number, label: 'Height (inches)' },
});

Person.register();