Как указать пользовательский 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
для них в моем примере кода выше.