1

モデルに「createdBy」フィールドを追加しましたが、管理者はすべてのユーザーを「createdBy」ユーザーとして選択できます。このフィールドに、現在ログインしている管理者が自動的に入力されるようにしたいのですが、機能していないようです。

理想的には、これは UI にまったく表示されず、ユーザーが保存されたときに保存されるだけです。

User.add({
    name: { type: Types.Name, required: true, index: true },
    email: { type: Types.Email, initial: true, required: true, index: true },
    company: { type: String, required: true, index: true, initial: true },
    phone: { type: String, required: true, index: true, initial: true },
    password: { type: Types.Password, initial: true, required: true },
    createdBy: { type: Types.Relationship, initial:true, required:true, ref: 'User' },
    createdAt: { type: Date, default: Date.now }
    }, 'Permissions', {
      level : { type: Types.Select, numeric: true, options: [{ value: 1, label: 'User'   }, {     value: 2, label: 'Group Administrator' }, { value: 3, label: 'System Administrator' }] }
    },
    'Screening', {
      rooms : { type: Types.Select, numeric: true, options: [{ value: 1, label: 'Screening room 1' }, { value: 2, label: 'Screening room 2' }, { value: 3, label: 'Screening room 3' }] }
});
4

2 に答える 2

2

あなたの実装は機能していますが、多くの Keystone 開発者 (私自身を含む) はuser.idPOST. 現在、Keystone でこれを行う良い方法がないと言うのも正しいです。

私の解決策は、この機能を Keystone 自体に実装することでした。と呼ばれるオプションのメタ パターンを追加しましたaudit meta。これにより、2 つのフィールドがList(createdByupdatedBy)に追加UpdateHandler()され、 の既存のキャッシュされたコピーを使用して入力されますreq.useruser._idこの方法では、POST 経由で送信する必要はありません。

List.addPattern('audit meta');を使用する場合と同様に、リストを定義した後に追加するだけで使用できますstandard meta。私の実装でaudit metaはフィールドも追加さstandard metaれるため、両方を使用する必要はありません。

これを実装するために、Keystone に次の変更を加えました。

まず、lib\list.js次のコード (接頭辞+) をaddPatern()メソッドに追加しました。

List.prototype.addPattern = function(pattern) {

    switch (pattern) {
        ...

+       case 'audit meta':
+           var userModel = keystone.get('user model');
+
+           if(!this.schema.path('createdOn') && !this.schema.path('updatedOn')) {
+               this.addPattern('standard meta');
+           }
+
+           if (userModel) {
+               this.add({
+                   createdBy: { type: Field.Types.Relationship, ref: userModel, hidden: true, index: true },
+                   updatedBy: { type: Field.Types.Relationship, ref: userModel, hidden: true, index: true }
+               });
+               this.map('createdBy', 'createdBy');
+               this.map('modifiedBy', 'updatedBy');
+           }
+       break;
+
    }

    return this;

次に、メソッドの最後で が呼び出される直前にlib/updateHandler.js、次のコードを に追加しました。UpdateHandler.prototype.process()progress()

+   // check for audit meta fields (mapped to createdBy/modifiedBy)
+   if (this.list.mappings.createdBy && this.item.isNew) {
+       this.item.set(this.list.mappings.createdBy, this.user._id);
+   }
+   if (this.list.mappings.modifiedBy) {
+       this.item.set(this.list.mappings.modifiedBy, this.user._id);
+   }

以前、プル リクエスト ( https://github.com/JedWatson/keystone/pull/490 ) を Keystone に送信しました。これには、実装の詳細な説明が含まれています。したがって、これが緊急に必要な場合は、いつでも Keystone のコピーをフォークして、私の PR をマージできます。

于 2014-07-25T01:21:35.867 に答える
1

どうやらこれを行う良い方法はありませんが、カスタム隠し入力フィールドを作成することで、他の誰かのアイデアを使用して回避策を思いつきました。理想的ではありませんが、このプロジェクトでは機能します。createdBy のデフォルト値は、必須フィールドにできるようにするためのものですが、その入力タイプの最初の jade テンプレートではなく、フォームの jade テンプレートに入力されます。

User.add({
  name: { type: Types.Name, required: true, index: true },
  email: { type: Types.Email, initial: true, required: true, index: true },
  company: { type: String, required: true, index: true, initial: true },
  phone: { type: String, required: true, index: true, initial: true },
  password: { type: Types.Password, initial: true, required: true },
  createdBy: { type: Types.Admin, required: true, initial: true, default: 'createdBy' },
  createdAt: { type: Types.Hidden, default: Date.now }
}, 'Permissions', {
  level : { type: Types.Select, numeric: true, options: [{ value: 1, label: 'User' }, {     value: 2, label: 'Group Administrator' }, { value: 3, label: 'System Administrator' }] }
},Screening', {
  rooms : { type: Types.Select, numeric: true, options: [{ value: 1, label: 'Screening room 1' }, { value: 2, label: 'Screening room 2' }, { value: 3, label: 'Screening room 3' }] }
});

次に、カスタムフィールドタイプを次のように作成します。フォームとイニシャル用に作成するだけです。また、fieldTypes/admin.js を作成し、fieldTypes.index.js を更新します。

入力 admin/form.jade

.field(class='type-' + field.type, data-field-type=field.type, data-field-path=field.path, data-field-collapse=field.collapse ? 'true' : false, data-field-depends-on=field.dependsOn, data-field-noedit=field.noedit ? 'true' : 'false')
- var value = field.format(item)
.field-ui(class='width-' + field.width)
    if field.noedit
        .field-value= user._id
    else
        input(type='hidden', name=field.path, value=user._id, autocomplete='off').form-control
    if field.note
        .field-note!= field.note
于 2014-07-24T23:06:52.270 に答える