public function saveResource(JosAdminResource $resource)
 {
     $data = array('resource_name' => $resource->getResourceName(), 'parent_id' => $resource->getParentId(), 'resource' => $resource->getResource(), 'resource_type' => $resource->getResourceType(), 'resource_object' => $resource->getResourceObject(), 'is_white_list' => $resource->getIsWhiteList(), 'is_hidden' => $resource->getIsHidden());
     $resource_id = (int) $resource->getResourceId();
     if ($resource_id == 0) {
         $this->tableGateway->insert($data);
     } else {
         if ($this->getResourceByResourceId($resource_id)) {
             $this->tableGateway->update($data, array('resource_id' => $resource_id));
         } else {
             return false;
         }
     }
     return true;
 }
 public function updateAction()
 {
     // cập nhật lại tất cả các role theo usertype trong bảng user
     $jos_users_table = $this->getServiceLocator()->get('Permission\\Model\\JosUsersTable');
     $role_names = $jos_users_table->getGiangVienByArrayConditionAndArrayColumns(array(), array(new Expression('DISTINCT(usertype) as role')));
     $jos_role_table = $this->getServiceLocator()->get('Permission\\Model\\JosAdminRoleTable');
     $roles = $jos_role_table->getRoleByArrayConditionAndArrayColumn(array(), array());
     $array_roles = array();
     foreach ($roles as $key => $value) {
         $array_roles[$value['role_name']] = $value;
     }
     // kiểm tra nếu có usertype mới mà trong bảng role hỏng tồn tại thì thêm vào bảng role
     foreach ($role_names as $key => $value) {
         if (!isset($array_roles[$value['role']])) {
             $role_new = new JosAdminRole();
             $role_new->setRoleName($value['role']);
             $jos_role_table->saveRole($role_new);
         }
     }
     //Auto Save All Controller and Action
     //truy cập tablegateway resource
     $resource_table = $this->getServiceLocator()->get('Permission\\Model\\JosAdminResourceTable');
     //Lấy danh sách module
     $manager = $this->getServiceLocator()->get('ModuleManager');
     $modules = $manager->getLoadedModules();
     $loaded_modules = array();
     $valmodule = array_keys($modules);
     //Xác định action bỏ qua
     $skip_actions_list = array('notFoundAction', 'getMethodFromAction');
     foreach ($valmodule as $loaded_module) {
         $module_class = '\\' . $loaded_module . '\\Module';
         $module_object = new $module_class();
         //truy cập phần cấu hình getConfig của từng module
         $config = $module_object->getConfig();
         //Lấy ra danh sách controller
         if (isset($config['controllers'])) {
             $controllers = $config['controllers']['invokables'];
             foreach ($controllers as $key => $module_class) {
                 //Trả về danh sách các hàm trong class controller, bao gồm cả các hàm kế thừa
                 $tmp_array = get_class_methods($module_class);
                 //Lấy ra danh sách các hàm là action
                 foreach ($tmp_array as $action) {
                     if (substr($action, strlen($action) - 6) === 'Action' && !in_array($action, $skip_actions_list)) {
                         //Chèn tên action vào mảng action controller
                         $array_modules[$loaded_module][$key][] = substr($action, 0, strlen($action) - 6);
                     }
                 }
             }
         }
     }
     // lưu lại những id đã sử dụng, để kiểm tra những id không sử dụng để xóa bỏ
     $array_id_used = array();
     $array_action_is_white_list = array();
     foreach ($array_modules as $key => $array_module) {
         // kiểm tra tên module có tồn tại trong csdl chưa
         $module = $resource_table->getResourceByArrayConditionAndArrayColumn(array('resource_type' => 'Module', 'resource' => $key, 'resource_object' => 'ACL'), array('resource_id'));
         // nếu chưa có thì lưu mới module
         if (!$module) {
             $jos_admin_resource = new JosAdminResource();
             $jos_admin_resource->setParentId(0);
             $jos_admin_resource->setResource($key);
             $jos_admin_resource->setResourceName($key . ' Module');
             $jos_admin_resource->setResourceType('Module');
             $jos_admin_resource->setResourceObject('ACL');
             $jos_admin_resource->setIsWhiteList(0);
             $jos_admin_resource->setIsHidden(0);
             $resource_table->saveResource($jos_admin_resource);
             // đảm bảo module đã tồn tại trong csdl rồi
             $module = $resource_table->getResourceByArrayConditionAndArrayColumn(array('resource_type' => 'Module', 'resource' => $key, 'resource_object' => 'ACL'), array('resource_id'));
         }
         $module_id = $module[0]['resource_id'];
         // id này đã được sử dụng
         $array_id_used[] = $module_id;
         // luu controller
         $array_controllers = $array_module;
         foreach ($array_controllers as $ctrl_key => $array_controller) {
             // get id controller
             $controller = $resource_table->getResourceByArrayConditionAndArrayColumn(array('resource_type' => 'Controller', 'resource' => $ctrl_key, 'resource_object' => 'ACL', 'parent_id' => $module_id), array('resource_id'));
             // nếu chưa có controller
             if (!$controller) {
                 $jos_admin_resource = new JosAdminResource();
                 $jos_admin_resource->setParentId($module_id);
                 $jos_admin_resource->setResource($ctrl_key);
                 $jos_admin_resource->setResourceName($ctrl_key . ' Controller');
                 $jos_admin_resource->setResourceType('Controller');
                 $jos_admin_resource->setResourceObject('ACL');
                 $jos_admin_resource->setIsWhiteList(0);
                 $jos_admin_resource->setIsHidden(0);
                 $resource_table->saveResource($jos_admin_resource);
                 // đảm bảo lấy được id controller
                 $controller = $resource_table->getResourceByArrayConditionAndArrayColumn(array('resource_type' => 'Controller', 'resource' => $ctrl_key, 'resource_object' => 'ACL', 'parent_id' => $module_id), array('resource_id'));
             }
             $controller_id = $controller[0]['resource_id'];
             // id này đã được sử dụng
             $array_id_used[] = $controller_id;
             $array_actions = $array_controller;
             foreach ($array_actions as $array_action) {
                 $action = $resource_table->getResourceByArrayConditionAndArrayColumn(array('resource' => $array_action, 'parent_id' => $controller_id, 'resource_type' => 'Action', 'resource_object' => 'ACL'), array('resource_id'));
                 if (!$action) {
                     $jos_admin_resource = new JosAdminResource();
                     $jos_admin_resource->setParentId($controller_id);
                     $jos_admin_resource->setResource($array_action);
                     $jos_admin_resource->setResourceName($array_action . ' Action');
                     $jos_admin_resource->setResourceType('Action');
                     $jos_admin_resource->setResourceObject('ACL');
                     $jos_admin_resource->setIsWhiteList(0);
                     $jos_admin_resource->setIsHidden(0);
                     $resource_table->saveResource($jos_admin_resource);
                     $action = $resource_table->getResourceByArrayConditionAndArrayColumn(array('resource' => $array_action, 'parent_id' => $controller_id, 'resource_type' => 'Action', 'resource_object' => 'ACL'), array('resource_id'));
                 }
                 if ($action) {
                     // id này đã được sử dụng
                     $array_id_used[] = $action[0]['resource_id'];
                 }
             }
         }
     }
     $array_id_not_used = $resource_table->getAllResourceIdUnexistResourceIdInArray($array_id_used);
     if ($array_id_not_used) {
         $resource_table->deleteResourceByResourceId($array_id_not_used);
     }
     return $this->redirect()->toRoute('permission/permission');
 }