Как указать пользовательский dev/prefix в поле Keystone LocalFile

Я хотел бы использовать то же значение, сгенерированное из плагина autokey в конструкторе keystone.List в объекте схемы, который я позже передам List.add.

Вот более точно, что я пытаюсь сделать:

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" />' }
    }
});

Так что это, конечно, не может работать. Как я могу повторно использовать любое значение autolued slug на более позднем этапе в моей схеме?

Кстати, ссылка работает в функции 'format', потому что когда эта функция вызывается, она может просто извлечь сохраненное значение через созданную модель.

1 ответ

В вашем случае использования выше, кажется, что dest а также prefix представляют сгенерированные значения, которые не обязательно должны быть доступны в интерфейсе администратора Keystone. В Mongoose есть функция, называемая виртуальными атрибутами, которую вы можете использовать именно для этого варианта использования. Виртуальные атрибуты определяются путем вызова .virtual() метод схемы Мангуста. Так как Keystone выставляет схему мангуста любого списка в своем .schema собственность, вы можете легко конвертировать dest а также prefix в виртуальные атрибуты.

В дополнение к виртуальным атрибутам Mongoose также предоставляет методы экземпляров, из которых вы можете ссылаться на любые определенные виртуальные атрибуты. Вы конвертируете format в методе экземпляра, а затем просто ссылаться на prefix виртуальный атрибут изнутри.

Наконец, убедитесь, что вы определили любые виртуальные атрибуты и методы экземпляра до вызова списка. .register() метод. Обратитесь к документации Keystone по плагинам схемы для более подробной информации.

Вот ваш пример кода с использованием виртуальных атрибутов и методов экземпляра.

Извините за длинное и запутанное бесполезное объяснение выше. Я не поняла что dest а также prefix были частью LocalFile схемы.

Наличие индивидуального пути для каждой загрузки не имеет особого смысла для меня. Пользовательский / отдельный путь для хранения одного файла кажется не очень полезным, IMHO. Тем не менее, имея пользовательское имя файла, по умолчанию автоматически созданный 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 позволяет вам определять как getter и setter (с использованием .get() а также .set() методы соответственно) для каждого определенного виртуального атрибута. Тем не менее, так как dest а также prefix в вашем сценарии использования доступны только для чтения, я определил только getter для них в моем примере кода выше.

Другие вопросы по тегам