Вложенные категории Keystone.js

Я пытаюсь реализовать вложенные категории для модели Post.

Что я имею:

Post.add({
    title: { type: String, required: true },
    state: { type: Types.Select, options: 'draft, published, archived', default: 'draft', index: true },
    author: { type: Types.Relationship, ref: 'User', index: true },
    publishedDate: { type: Types.Date, index: true, dependsOn: { state: 'published' } },
    content: {
        extended: { type: Types.Html, wysiwyg: true, height: 300 },
    },
    categories: { type: Types.Relationship, ref: 'PostCategory', index: true }
});

И категория

PostCategory.add({
    name: { type: String, required: true },
    subCategories: { type: Types.TextArray }
});

Теперь я могу добавить список подкатегорий в каждую категорию. Чего я не могу сделать, так это отображать подкатегории при создании сообщения. Также, если я меняю категорию, мне нужно загрузить подкатегории, связанные с выбранной категорией.

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

Еще одна вещь, о которой я думал, это добавить подкатегории в качестве отношений, см. ссылку:

categories: { type: Types.Relationship, ref: 'PostCategory.subCategories', index: true }

Но это тоже не работает.

Итак, если у кого-то есть идеи, как этого добиться, поделитесь, пожалуйста. Спасибо.

P.S. Не стесняйтесь спрашивать любую дополнительную информацию.


person user2960708    schedule 26.02.2017    source источник


Ответы (1)


Я создал вложенные категории, создав новую модель «PostSubCategory», которая позволяет пользователю назначать родительскую категорию дочерней категории при создании дочерней категории:

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

/**
* PostSubCategory Model
* ==================
*/

var PostSubCategory = new keystone.List('PostSubCategory', {
    autokey: { from: 'name', path: 'key', unique: true },
});

PostSubCategory.add({
    name: {
    type: String,
    required: true
  },
  parentCategory: {
    type: Types.Relationship,
    ref: 'PostCategory',
    required: true,
    initial: true
  }
});


PostSubCategory.relationship({ ref: 'Post', path: 'subcategories' });

PostSubCategory.register();

Затем в моем Post.js я добавляю поле для выбора подкатегории с фильтром в этом поле, чтобы выбирать только из подкатегорий, которые являются дочерними элементами выбранной родительской категории:

subcategory: {
    type: Types.Relationship,
    ref: 'PostSubCategory',
    many: false,
    filters: { parentCategory: ':categories' }
}

Я не уверен, насколько хорошо это будет работать для более глубокого вложения, и у меня есть проблема в пользовательском интерфейсе администратора редактирования сообщения, когда изменение родительской категории для сообщения не обновляет доступные подкатегории для выбора, пока вы не сохраните и не обновите. Но это продвинуло меня достаточно далеко, чтобы заставить работать категории родитель/потомок.

person hbuchel    schedule 15.06.2017