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

CRUD контроллер

В модуле администрирования многие действия с объектами разных классов (просмотр, редактирование, удаление) повторяются и могут быть обобщены в едином базовом контроллере.

module/admin/component/CrudController.js

const Base = require('./Controller');
module.exports = class CrudController extends Base {
  // place methods here
};

Метод actionCreate отвечает за действие по созданию нового объекта класса, полученного из getModelClass. При создании используется сценарий create, по которому могут быть отфильтрованы правила валидации модели.

На GET-запрос рендерится пустая форма модели. На POST-запрос происходит загрузка значений атрибутов, проверка и, в случае успеха, сохранение нового объекта. Если валидация провалилась, то форма снова заполняется переданными значениями с отмеченными ошибками. После сохранения происходит редирект на страницу, с которой привела ссылка на создание модели.

module/admin/component/CrudController.js

actionCreate () {
  let model = new (this.getModelClass());
  model.scenario = 'create';
  if (this.isGet()) {
    return this.render('create', {model});
  }
  async.series([
    cb => model.load(this.getBodyParams()).save(cb),
    cb => model.hasError()
      ? this.render('create', {model})
      : this.backToRef()
  ], err => this.throwError(err));
}

Действие actionView отображает объект. В целевом контроллере метод может быть переопределен для загрузки вместе с моделью связанных значений relations.

module/admin/component/CrudController.js

actionView (params) {
  this.getModel(params, model => {
    this.render('view', {model});
  });
}

Метод actionUpdate отличается от метода actionCreate только лишь сценарием валидации и начальным поиском модели для редактирования.

module/admin/component/CrudController.js

actionUpdate (params) {
  this.getModel(params, model => {
    model.scenario = 'update';
    if (this.isGet()) {
      return this.render('update', {model});
    }
    async.series([
      cb => model.load(this.getBodyParams()).save(cb),
      cb => model.hasError()
        ? this.render('update', {model})
        : this.backToRef()
    ], err => this.throwError(err));
  });
}

Метод actionDelete удаляет модель, идентификатор которой передан в GET-параметре. Если пришел ajax-запрос, то после удаления возвращается идентификатор удаленного объекта, иначе происходит переадресация на предыдущую страницу.

module/admin/component/CrudController.js

actionDelete (params) {
  this.getModel(params, model => {
    async.series([
      cb => model.remove(cb),
      cb => this.isAjax()
        ? this.send(model.getId())
        : this.backToRef()
    ], err => this.throwError(err));
  });
}