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

CRUD контроллер

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

modules/admin/components/CrudController.js

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

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

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

modules/admin/components/CrudController.js

...
actionCreate () {
  let model = new (this.getModelClass());
  model.scenario = 'create';
  if (this.isPost()) {
    model.load(this.getBodyParams()).save(err => {
      if (err) {
        this.throwError(err);
      } else if (model.hasError()) {
        this.render('create', {model});
      } else {
        this.backToRef();
      }
    });
  } else {
    this.render('create', {model});
  }
}
...

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

modules/admin/components/CrudController.js

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

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

modules/admin/components/CrudController.js

...
actionUpdate (...relations) {
  this.getModel(model => {
    model.scenario = 'update';
    if (this.isPost()) {
      model.load(this.getBodyParams()).save(err => {
        if (err) {
          this.throwError(err);
        } else if (model.hasError()) {
          this.render('update', {model});
        } else {
          this.backToRef();
        }
      });
    } else {
      this.render('update', {model});
    }  
  }, relations);
}
...

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

modules/admin/components/CrudController.js

...
actionDelete () {
  this.getModel(model => {
    model.remove(err => {
      if (err) {
        this.throwError();
      } else if (this.isAjax()) {
        this.send(model.getId());  
      } else {
        this.backToRef();
      }
    });
  });
}
...