cakePHP: update aco table without command.

コマンドラインが使えない環境でacoテーブルを更新するには、以下のような関数を追加して実行する。

例えば、studentモデルを追加する。

まず、user/reitnitDBにアクセスすることでDBが更新されるよう、usersContorllerに下を追加する。
最初にStudentsのみ追加。


public function beforeFilter() {
    parent::beforeFilter();
    $this->Auth->allow('reinitDB'); 
}


public function reinitDB() {

  $this->Acl->Aco->create(array('parent_id' => 1, 'alias' => 'Students', 'model' => ''));
  $this->Acl->Aco->save();
  echo "all done";
  exit;

}

user/reitnitDBにアクセスする。

acoテーブルに一行追加されているはず。
今回追加した分のIDを93とする。

下層のページのために、下記を追加。
$aliasesの配列に含まれるページをacoテーブルに追加していくもの。

public function reinitDB() {
    $aliases = array(
      'admin_index',
      'admin_add',
      'admin_edit',
      'admin_delete',
      'admin_view',
      'admin_course_edit',
      'admin_couse_take',
      'index',
      'add',
      'edit',
      'view',
      );

    foreach ($aliases as $key => $value) {
        $this->Acl->Aco->create(array('parent_id' => 93, 'alias' => $value, 'model' => ''));
        $this->Acl->Aco->save();
    }
  echo "all done";
  exit;
}

そして再度user/reitnitDBにアクセス。

またテーブルの更新を確認出来るはず。

次にreinitDB() で、アクセス権限の編集を行う。
group_id = 1 or 2のときにStudentsすべて、
group_id = 3 のときはStudents/view, editへのアクセスを許可するので、こんな感じになる。

public function reinitDB() {
      $group = $this->User->Group;
      //Allow admins to everything
      $group->id = 1;
      $this->Acl->allow($group, 'controllers');

      //allow managers to posts and widgets
      $group->id = 2;
      $this->Acl->allow($group, 'controllers/Students');

      //allow users to only add and edit on posts and widgets
      $group->id = 3;
      $this->Acl->deny($group, 'controllers');
      $this->Acl->allow($group, 'controllers/Students/view');
      $this->Acl->allow($group, 'controllers/Students/edit');
      //we add an exit to avoid an ugly "missing views" error message
      echo "all done";
      exit;

}