Строим блог на Areto фреймворк

Контроллер статей

Класс ArticleController отвечает за действия с моделью статьи.

module/admin/controllers/ArticleController.js

const Base = require('../component/CrudController');
module.exports = class ArticleController extends Base {
};
module.exports.init(module);
const async = require('areto/helper/AsyncHelper');
const Category = require('../model/Category');
const Article = require('../model/Article');<
Список статей

Метод actionIndex выводит список статей с возможностью поиска и сортировки по идентификатору, статусу и заголовку. Каждая статья извлекается вместе со связанными моделями author и mainPhoto, которые необходимы для представления статьи в списке.

module/admin/controllers/ArticleController.js

actionIndex () {
  let searchText = this.getQueryParam('search');
  let query = Article.findBySearch(this.getQueryParam('search')).with('author', 'mainPhoto');
  let provider = this.createDataProvider({
    query,
    pagination: {
      pageSize: 10
    },
    sort: {
      attrs: {
        [Article.PK]: true,
        status: true,
        title: true
      },
      defaultOrder: {
        [Article.PK]: -1
      }
      }
  });
  this.renderDataProvider(provider, 'index', {provider, searchText});
}<
Просмотр статьи Просмотр статьи

Метод actionView выводит объект статьи на просмотр. Вместе с ним загружаются все связанные модели author, photos, mainPhoto, tags. Из отношения relComments, через провайдер данных, формируется постраничный список комментариев, относящихся к статье.

module/admin/controllers/ArticleController.js

actionView () {
  this.getModel({
    with: ['author', 'category', 'photos', 'mainPhoto', 'tags']
  }, model => {
    let comments = this.createDataProvider({
      query: model.relComments(),
      sort: {
        attrs: {
          [model.PK]: true
        },
        defaultOrder: {
          [model.PK]: -1
        }
      }
    });
    this.renderDataProvider(comments, 'view', {model, comments});
  });
}<
Создание статьи

Метод actionCreate отвечает за действие по созданию новой статьи. Атрибут authorId, отвечающий за автора статьи, устанавливается по текущему пользователю.

module/admin/controllers/ArticleController.js

actionCreate () {
  let model = new Article;
  if (this.isGet()) {
    return this.renderForm('create', {model});
  }
  model.load(this.getBodyParams());
  model.set('authorId', this.user.getId());
  async.series([
    cb => model.save(cb),
    cb => model.hasError()
      ? this.renderForm('create', {model})
      : this.backToRef()
  ], err => this.throwError(err));
}<
Редактирование статьи

Метод actionUpdate отвечает за действие по редактированию статьи. После того как статья найдена, проверяется разрешение для текущего пользователя. В асинхронный метод can последним аргументом передаются параметры, используемые для инициализации бизнес-правила доступа.

module/admin/controllers/ArticleController.js

actionUpdate () {
  this.getModel({
    with: ['photos', 'tags']
  }, model => async.waterfall([
    cb => this.user.can('updateArticle', cb, {
      authorId: model.get('authorId')
    }),
    (access, cb)=> access
      ? cb()
      : this.throwForbidden(),
    cb => this.isGet()
      ? this.renderForm('update', {model})
      : model.load(this.getBodyParams()).save(cb),
    cb => model.hasError()
      ? this.renderForm('update', {model})
      : this.backToRef()
  ], err => this.throwError(err)));
}<