Example #1
0
 /**
  * 删除指定的贴吧信息
  *
  * @param int $postId
  *
  * @return boolean
  */
 function removePost($postId)
 {
     $postId = (int) $postId;
     $post = $this->_tbPosts->find($postId);
     if (!$post) {
         FLEA::loadClass('Exception_DataNotFound');
         __THROW(new Exception_DataNotFound($postId));
         return false;
     }
     return $this->_tbPosts->removeByPkv($postId);
 }
 /**
  * 从指定文件创建 Image 对象
  *
  * 对于上传的文件,由于其临时文件名中并没有包含扩展名。因此需要采用下面的方法创建 Image 对象:
  *
  * <code>
  * $ext = pathinfo($_FILES['postfile']['name'], PATHINFO_EXTENSION);
  * $image =& FLEA_Helper_Image::createFromFile($_FILES['postfile']['tmp_name'], $ext);
  * </code>
  *
  * @param string $filename
  * @param string $fileext
  *
  * @return FLEA_Helper_Image
  */
 function &createFromFile($filename, $fileext = null)
 {
     if (is_null($fileext)) {
         $fileext = pathinfo($filename, PATHINFO_EXTENSION);
     }
     $fileext = strtolower($fileext);
     $ext2functions = array('jpg' => 'imagecreatefromjpeg', 'jpeg' => 'imagecreatefromjpeg', 'png' => 'imagecreatefrompng', 'gif' => 'imagecreatefromgif');
     if (!isset($ext2functions[$fileext])) {
         FLEA::loadClass('FLEA_Exception_NotImplemented');
         __THROW(new FLEA_Exception_NotImplemented('imagecreatefrom' . $fileext));
         return false;
     }
     $handle = $ext2functions[$fileext]($filename);
     $img =& new FLEA_Helper_Image($handle);
     return $img;
 }
Example #3
0
/**
 * 载入 YAML 文件,返回分析结果
 *
 * load_yaml() 会自动使用缓存,只有当 YAML 文件被改变后,缓存才会更新。
 *
 * 关于 YAML 的详细信息,请参考 www.yaml.org 。
 *
 * 用法:
 * <code>
 * $data = load_yaml('myData.yaml');
 * </code>
 *
 * 注意:为了安全起见,不要使用 YAML 存储敏感信息,例如密码。
 * 或者将 YAML 文件的扩展名设置为 .yaml.php,并且在每一个 YAML 文件开头添加“exit()”。
 * 例如:
 * <code>
 * # <?php exit(); ?>
 *
 * invoice: 34843
 * date   : 2001-01-23
 * bill-to: &id001
 * ......
 * </code>
 *
 * 这样可以确保即便浏览器直接访问该 .yaml.php 文件,也无法看到内容。
 *
 * @param string $filename
 * @param boolean $cacheEnabled 是否缓存分析内容
 * @param array $replace
 *
 * @return array
 */
function load_yaml($filename, $cacheEnabled = true, $replace = null)
{
    static $objects = array();
    if (!file_exists($filename)) {
        FLEA::loadClass('FLEA_Exception_ExpectedFile');
        return __THROW(new FLEA_Exception_ExpectedFile($filename));
    }
    if ($cacheEnabled) {
        $arr = FLEA::getCache('yaml-' . $filename, filemtime($filename), false);
        if ($arr) {
            return $arr;
        }
    }
    if (!isset($objects[0])) {
        require_once FLEA_3RD_DIR . '/Spyc/spyc.php';
        $objects[0] =& new Spyc();
    }
    $arr = $objects[0]->load($filename, $replace);
    if ($cacheEnabled) {
        FLEA::writeCache('yaml-' . $filename, $arr);
    }
    return $arr;
}
            break;
        }
    } else {
        if (class_exists('Template_Lite')) {
            break;
        }
    }
    $viewConfig = FLEA::getAppInf('viewConfig');
    if (!isset($viewConfig['liteDir'])) {
        FLEA::loadClass('FLEA_View_Exception_NotConfigurationLite');
        return __THROW(new FLEA_View_Exception_NotConfigurationLite());
    }
    $filename = $viewConfig['liteDir'] . '/class.template.php';
    if (!file_exists($filename)) {
        FLEA::loadClass('FLEA_View_Exception_InitLiteFailed');
        return __THROW(new FLEA_View_Exception_InitLiteFailed($filename));
    }
    require $filename;
} while (false);
// }}}
/**
 * FLEA_View_Lite 提供了对 TemplateLite 模板引擎的支持
 *
 * @package Core
 * @author 起源科技 (www.qeeyuan.com)
 * @version 1.0
 */
class FLEA_View_Lite extends Template_Lite
{
    /**
     * 构造函数
Example #5
0
 function execute($sql, $inputarr = null, $throw = true)
 {
     if (is_array($inputarr)) {
         $sql = $this->bind($sql, $inputarr);
     }
     if ($this->enableLog) {
         $this->log[] = $sql;
         log_message("sql: {$sql}", 'debug');
     }
     $this->querycount++;
     $result = mysql_query($sql, $this->conn);
     if ($result !== false) {
         $this->lasterr = null;
         $this->lasterrcode = null;
         return $result;
     }
     $this->lasterr = mysql_error($this->conn);
     $this->lasterrcode = mysql_errno($this->conn);
     if ($throw) {
         FLEA::loadClass('FLEA_Db_Exception_SqlQuery');
         __THROW(new FLEA_Db_Exception_SqlQuery($sql, $this->lasterr, $this->lasterrcode));
     }
     return false;
 }
 /**
  * 载入 ACT 文件
  *
  * @param string $actFilename
  *
  * @return mixed
  */
 function _loadACTFile($actFilename)
 {
     static $files = array();
     if (isset($files[$actFilename])) {
         return $files[$actFilename];
     }
     $ACT = (require $actFilename);
     if (is_array($ACT)) {
         $files[$actFilename] = $ACT;
         return $ACT;
     }
     // 当控制器的 ACT 文件没有返回 ACT 时抛出异常
     FLEA::loadClass('FLEA_Rbac_Exception_InvalidACTFile');
     __THROW(new FLEA_Rbac_Exception_InvalidACTFile($actFilename, $ACT));
     return false;
 }
Example #7
0
 /**
  * 获取自增字段的最后一个值
  *
  * 如果没有可返回的值,则抛出异常。
  *
  * @return mixed
  */
 function insertId()
 {
     require_once FLEA_DIR . '/Exception/NotImplemented.php';
     __THROW(new FLEA_Exception_NotImplemented('insertId()', 'FLEA_Db_Driver_Pgsql'));
     return false;
 }
Example #8
0
 /**
  * 处理图片上传
  */
 function _uploadPicture($memberid, $imgfile, $pictureType)
 {
     $uploader =& FLEA::getSingleton('FLEA_Helper_FileUploader');
     /* @var $uploader FLEA_Helper_FileUploader */
     // 检查上传文件是否存在
     if (!$uploader->isFileExist($imgfile)) {
         $errorMessage = _T('ui_p_upload_failed');
         return;
     }
     // 检查文件扩展名是否是允许上传的类型
     $file =& $uploader->getFile($imgfile);
     if (!$file->check(FLEA::getAppInf('imageFileExts'))) {
         $errorMessage = _T('ui_p_invalid_filetype');
         return;
     }
     $member = $this->getMember($memberid, false);
     if (!$member) {
         FLEA::loadClass('Exception_DataNotFound');
         __THROW(new Exception_DataNotFound($memberid));
         return false;
     }
     // 上传图像
     if ($pictureType == 'headimage') {
         $this->_uploadThumb($member, $file);
     } else {
         $this->_uploadPhoto($member, $file);
     }
     $ex = __CATCH();
     if (__IS_EXCEPTION($ex)) {
         $errorMessage = $ex->getMessage();
         return;
     }
 }
 /**
  * 准备当前数据表的元数据
  *
  * @param boolean $flushCache
  *
  * @return boolean
  */
 function _prepareMeta($flushCache = false)
 {
     $cached = FLEA::getAppInf('dbMetaCached');
     $cacheId = $this->dbo->dsn['id'] . '/' . $this->fullTableName;
     $readFromCache = $cached != false && $flushCache == false;
     if ($readFromCache) {
         /**
          * 尝试从缓存读取
          */
         $meta = FLEA::getCache($cacheId, FLEA::getAppInf('dbMetaLifetime'));
         if (is_array($meta)) {
             $this->meta = $meta;
             return true;
         }
     }
     /**
      * 从数据库获得 meta
      */
     $this->meta = $this->dbo->metaColumns($this->qtableName);
     if (!is_array($this->meta) || empty($this->meta)) {
         FLEA::loadClass('FLEA_Db_Exception_MetaColumnsFailed');
         return __THROW(new FLEA_Db_Exception_MetaColumnsFailed($this->qtableName));
     }
     if ($cached) {
         return FLEA::writeCache($cacheId, $this->meta);
     } else {
         return true;
     }
 }
Example #10
0
 /**
  * 执行一个查询,返回一个 resource 或者 boolean 值
  *
  * @param string $sql
  * @param array $inputarr
  * @param boolean $throw 指示查询出错时是否抛出异常
  *
  * @return resource|boolean
  */
 function execute($sql, $inputarr = null, $throw = true)
 {
     if (substr($sql, 0, 11) == "INSERT INTO") {
         // 删除SQL中的指定的表,SQLITE不支持在插入中语句有表名在前面
         $len1 = strpos($sql, '(');
         $len2 = strpos($sql, ')');
         $len3 = strpos($sql, 'VALUES');
         $temp = array();
         if ($len2 < $len3) {
             $temp[] = substr($sql, 0, $len1);
             $temp[] = substr($sql, $len1, $len2 - $len1);
             $temp[] = substr($sql, $len2);
             $temp[1] = eregi_replace("[a-z_0-9]+\\.", "", $temp[1]);
             $sql = implode($temp);
         }
     }
     if (is_array($inputarr)) {
         $sql = $this->_prepareSql($sql, $inputarr);
     }
     if ($this->enableLog) {
         $this->log[] = $sql;
         log_message("sql:\n{$sql}", 'debug');
     }
     $result = @sqlite_query($sql, $this->conn);
     if ($result !== false) {
         $this->lasterr = null;
         $this->lasterrcode = null;
         return $result;
     }
     $this->lasterrcode = sqlite_last_error($this->conn);
     $this->lasterr = sqlite_error_string($this->lasterrcode);
     if (!$throw) {
         return false;
     }
     FLEA::loadClass('FLEA_Db_Exception_SqlQuery');
     __THROW(new FLEA_Db_Exception_SqlQuery($sql, $this->lasterr, $this->lasterrcode));
     return false;
 }
Example #11
0
 /**
  * 统计关联记录数
  *
  * @param array $assocRowset
  * @param string $mappingName
  * @param string $in
  *
  * @return int
  */
 function calcCount(&$assocRowset, $mappingName, $in)
 {
     FLEA::loadClass('FLEA_Exception_NotImplemented');
     return __THROW(new FLEA_Exception_NotImplemented('calcCount()', 'FLEA_Db_TableLink'));
 }
Example #12
0
 /**
  * 载入指定语言的字典文件
  *
  * 所有的语言文件均按照“语言/字典名.php”的形式保存在由应用程序设置
  * 'languageFilesDir' 指定的目录中。默认的保存目录为 FLEA/Languages。
  *
  * 如果没有指定 $language 参数,则载入由应用程序设置 'defaultLanguage'
  * 指定的语言目录下的文件。
  *
  * $language 和 $dicname 参数均只能使用 26 个字母、10 个数字
  * 和 “-”、“_” 符号。并且为全小写。
  *
  * @param string $dictname 字典名,例如 'fleaphp'、'rbac'
  * @param string $language 指定为 '' 时表示将字典载入默认语言包中
  * @param boolena $noException
  */
 function load($dictname, $language = '', $noException = false)
 {
     $dictnames = explode(',', $dictname);
     foreach ($dictnames as $dictname) {
         $dictname = trim($dictname);
         if ($dictname == '') {
             continue;
         }
         $dictname = preg_replace('/[^a-z0-9\\-_]+/i', '', strtolower($dictname));
         $language = preg_replace('/[^a-z0-9\\-_]+/i', '', strtolower($language));
         if ($language == '') {
             $language = FLEA::getAppInf('defaultLanguage');
             $default = true;
         } else {
             $default = false;
         }
         $filename = FLEA::getAppInf('languageFilesDir') . DS . $language . DS . $dictname . '.php';
         if (isset($this->_loadedFiles[$filename])) {
             continue;
         }
         if (is_readable($filename)) {
             $dict = (require $filename);
             $this->_loadedFiles[$filename] = true;
             if (isset($this->_dict[$language])) {
                 $this->_dict[$language] = array_merge($this->_dict[$language], $dict);
             } else {
                 $this->_dict[$language] = $dict;
             }
             if ($default) {
                 $this->_dict[0] =& $this->_dict[$language];
             }
         } else {
             if (!$noException) {
                 FLEA::loadClass('FLEA_Exception_ExpectedFile');
                 return __THROW(new FLEA_Exception_ExpectedFile($filename));
             }
         }
     }
 }
Example #13
0
            break;
        }
    } else {
        if (class_exists('Smarty')) {
            break;
        }
    }
    $viewConfig = FLEA::getAppInf('viewConfig');
    if (!isset($viewConfig['smartyDir']) && !defined('SMARTY_DIR')) {
        FLEA::loadClass('FLEA_View_Exception_NotConfigurationSmarty');
        return __THROW(new FLEA_View_Exception_NotConfigurationSmarty());
    }
    $filename = $viewConfig['smartyDir'] . '/Smarty.class.php';
    if (!is_readable($filename)) {
        FLEA::loadClass('FLEA_View_Exception_InitSmartyFailed');
        return __THROW(new FLEA_View_Exception_InitSmartyFailed($filename));
    }
    require $filename;
} while (false);
// }}}
/**
 * FLEA_View_Smarty 提供了对 Smarty 模板引擎的支持
 *
 * @package Core
 * @author 起源科技 (www.qeeyuan.com)
 * @version 1.0
 */
class FLEA_View_Smarty extends Smarty
{
    /**
     * 构造函数
Example #14
0
 /**
  * 返回指定名字的上传文件对象
  *
  * @param string $name
  *
  * @return FLEA_Helper_FileUploader_File
  */
 function &getFile($name)
 {
     if (!isset($this->_files[$name])) {
         FLEA::loadClass('FLEA_Exception_ExpectedFile');
         return __THROW(new FLEA_Exception_ExpectedFile('$_FILES[' . $name . ']'));
     }
     return $this->_files[$name];
 }
 /**
  * 用指定规则验证值,验证通过返回 ture,否则返回没有通过的验证规则名
  *
  * @param mixed $value
  * @param array $rule
  *
  * @return boolean
  */
 function check($value, &$rule)
 {
     // 首先使用 simpleType 验证值(如果 simpleType 属性存在)
     $checkLength = false;
     $checkMinMax = false;
     $ret = 'simpleType';
     if (isset($rule['simpleType'])) {
         switch ($rule['simpleType']) {
             case 'C':
                 // 长度小于等于 250 的字符串
                 if (strlen($value) > 250) {
                     return $ret;
                 }
                 $checkLength = true;
                 break;
             case 'N':
                 // 数值或者浮点数
                 if (!is_numeric($value)) {
                     return $ret;
                 }
                 $checkMinMax = true;
                 break;
             case 'D':
                 // 日期
                 $test = @strtotime($value);
                 if ($test === false || $test === -1) {
                     return $ret;
                 }
                 break;
             case 'I':
                 // 整数
                 if (!is_numeric($value)) {
                     return $ret;
                 }
                 if (intval($value) != $value) {
                     return $ret;
                 }
                 $checkMinMax = true;
                 break;
             case 'X':
                 // 长度大于 250 的字符串
             // 长度大于 250 的字符串
             case 'B':
                 // 二进制数据
                 $checkLength = true;
                 break;
             case 'T':
                 // TimeStamp
             // TimeStamp
             case 'L':
                 // 逻辑布尔值
                 break;
             case 'R':
                 // 自动增量或计数器
                 $checkMinMax = true;
                 break;
             default:
         }
     } else {
         $checkLength = true;
         $checkMinMax = true;
     }
     // 接着使用 complexType 验证值(如果 complexType 属性存在)
     $ret = 'complexType';
     if (isset($rule['complexType'])) {
         $func = 'is' . $rule['complexType'];
         if (!method_exists($this, $func)) {
             FLEA::loadClass('FLEA_Exception_InvalidArguments');
             __THROW(new FLEA_Exception_InvalidArguments('$rule[\'complexType\']', $rule['complexType']));
             return null;
         }
         if (!$this->{$func}($value)) {
             return $ret;
         }
     }
     // min/max/minLength/maxLength 验证
     if ($checkMinMax) {
         $ret = 'min';
         if (isset($rule['min']) && $value < $rule['min']) {
             return $ret;
         }
         $ret = 'max';
         if (isset($rule['max']) && $value > $rule['max']) {
             return $ret;
         }
     }
     $ret = 'length';
     if ($checkLength) {
         $ret = 'minLength';
         if (isset($rule['minLength']) && $rule['minLength'] > 0 && strlen($value) < $rule['minLength']) {
             return $ret;
         }
         $ret = 'maxLength';
         if (isset($rule['maxLength']) && $rule['maxLength'] > 0 && strlen($value) > $rule['maxLength']) {
             return $ret;
         }
     }
     $ret = null;
     return true;
 }
 /**
  * 检查访问控制表是否允许指定的角色访问
  *
  * @param array $roles
  * @param array $ACT
  *
  * @return boolean
  */
 function check(&$roles, &$ACT)
 {
     $roles = array_map('strtoupper', $roles);
     if ($ACT['allow'] == RBAC_EVERYONE) {
         // 如果 allow 允许所有角色,deny 没有设置,则检查通过
         if ($ACT['deny'] == RBAC_NULL) {
             return true;
         }
         // 如果 deny 为 RBAC_NO_ROLE,则只要用户具有角色就检查通过
         if ($ACT['deny'] == RBAC_NO_ROLE) {
             if (empty($roles)) {
                 return false;
             }
             return true;
         }
         // 如果 deny 为 RBAC_HAS_ROLE,则只有用户没有角色信息时才检查通过
         if ($ACT['deny'] == RBAC_HAS_ROLE) {
             if (empty($roles)) {
                 return true;
             }
             return false;
         }
         // 如果 deny 也为 RBAC_EVERYONE,则表示 ACT 出现了冲突
         if ($ACT['deny'] == RBAC_EVERYONE) {
             FLEA::loadClass('FLEA_Rbac_Exception_InvalidACT');
             __THROW(new FLEA_Rbac_Exception_InvalidACT($ACT));
             return false;
         }
         // 只有 deny 中没有用户的角色信息,则检查通过
         foreach ($roles as $role) {
             if (in_array($role, $ACT['deny'], true)) {
                 return false;
             }
         }
         return true;
     }
     do {
         // 如果 allow 要求用户具有角色,但用户没有角色时直接不通过检查
         if ($ACT['allow'] == RBAC_HAS_ROLE) {
             if (!empty($roles)) {
                 break;
             }
             return false;
         }
         // 如果 allow 要求用户没有角色,但用户有角色时直接不通过检查
         if ($ACT['allow'] == RBAC_NO_ROLE) {
             if (empty($roles)) {
                 break;
             }
             return false;
         }
         if ($ACT['allow'] != RBAC_NULL) {
             // 如果 allow 要求用户具有特定角色,则进行检查
             $passed = false;
             foreach ($roles as $role) {
                 if (in_array($role, $ACT['allow'], true)) {
                     $passed = true;
                     break;
                 }
             }
             if (!$passed) {
                 return false;
             }
         }
     } while (false);
     // 如果 deny 没有设置,则检查通过
     if ($ACT['deny'] == RBAC_NULL) {
         return true;
     }
     // 如果 deny 为 RBAC_NO_ROLE,则只要用户具有角色就检查通过
     if ($ACT['deny'] == RBAC_NO_ROLE) {
         if (empty($roles)) {
             return false;
         }
         return true;
     }
     // 如果 deny 为 RBAC_HAS_ROLE,则只有用户没有角色信息时才检查通过
     if ($ACT['deny'] == RBAC_HAS_ROLE) {
         if (empty($roles)) {
             return true;
         }
         return false;
     }
     // 如果 deny 为 RBAC_EVERYONE,则检查失败
     if ($ACT['deny'] == RBAC_EVERYONE) {
         return false;
     }
     // 只有 deny 中没有用户的角色信息,则检查通过
     foreach ($roles as $role) {
         if (in_array($role, $ACT['deny'], true)) {
             return false;
         }
     }
     return true;
 }
Example #17
0
 /**
  * 执行一个查询,返回一个 resource 或者 boolean 值
  *
  * @param string $sql
  * @param array $inputarr
  * @param boolean $throw 指示查询出错时是否抛出异常
  *
  * @return resource|boolean
  */
 function execute($sql, $inputarr = null, $throw = true)
 {
     if (is_array($inputarr)) {
         $sql = $this->_prepareSql($sql, $inputarr);
     }
     if ($this->enableLog) {
         $this->log[] = $sql;
         log_message("sql:\n{$sql}", 'debug');
     }
     $result = @mssql_query($sql, $this->conn);
     if ($result !== false) {
         $this->lasterr = null;
         $this->lasterrcode = null;
         return $result;
     }
     $this->lasterr = $this->mssql_error($this->conn);
     $this->lasterrcode = $this->mssql_errno($this->conn);
     if (!$throw) {
         return false;
     }
     FLEA::loadClass('FLEA_Db_Exception_SqlQuery');
     __THROW(new FLEA_Db_Exception_SqlQuery($sql, $this->lasterr, $this->lasterrcode));
     return false;
 }
Example #18
0
 function execute($sql, $inputarr = null, $throw = true)
 {
     if ($this->enableLog) {
         $this->log[] = $sql;
         log_message("sql: {$sql}", 'debug');
     }
     $this->querycount++;
     $stmt = ociparse($this->conn, $sql);
     if (is_array($inputarr)) {
         foreach (array_keys($inputarr) as $k) {
             ocibindbyname($stmt, $k, $inputarr[$k], -1);
         }
     }
     if ($stmt && ociexecute($stmt, $this->_commitMode)) {
         $this->_lastrs = $stmt;
         $this->lasterr = null;
         $this->lasterrcode = null;
         return $stmt;
     }
     $err = ocierror($stmt);
     $this->lasterr = $err['message'];
     $this->lasterrcode = $err['code'];
     if ($throw) {
         FLEA::loadClass('FLEA_Db_Exception_SqlQuery');
         __THROW(new FLEA_Db_Exception_SqlQuery($sql, $this->lasterr, $this->lasterrcode));
     }
     return false;
 }
Example #19
0
 /**
  * 执行指定的 Action 方法
  *
  * @param string $controllerName
  * @param string $actionName
  * @param string $controllerClass
  *
  * @return mixed
  */
 function _executeAction($controllerName, $actionName, $controllerClass)
 {
     $callback = FLEA::getAppInf('dispatcherFailedCallback');
     // 确定动作方法名
     $actionPrefix = FLEA::getAppInf('actionMethodPrefix');
     $actionMethod = $actionPrefix . $actionName . FLEA::getAppInf('actionMethodSuffix');
     $controller = null;
     $controllerClassFilename = null;
     do {
         // 载入控制对应的类定义
         if (!$this->_loadController($controllerClass)) {
             break;
         }
         // 构造控制器对象
         FLEA::setAppInf('FLEA.internal.currentControllerName', $controllerName);
         FLEA::setAppInf('FLEA.internal.currentActionName', $actionName);
         $controller =& new $controllerClass($controllerName);
         if (!method_exists($controller, $actionMethod)) {
             break;
         }
         if (method_exists($controller, '__setController')) {
             $controller->__setController($controllerName, $actionName);
         }
         if (method_exists($controller, '__setDispatcher')) {
             $controller->__setDispatcher($this);
         }
         // 调用 _beforeExecute() 方法
         if (method_exists($controller, '_beforeExecute')) {
             $controller->_beforeExecute($actionMethod);
         }
         // 执行 action 方法
         $ret = $controller->{$actionMethod}();
         // 调用 _afterExecute() 方法
         if (method_exists($controller, '_afterExecute')) {
             $controller->_afterExecute($actionMethod);
         }
         return $ret;
     } while (false);
     if ($callback) {
         // 检查是否调用应用程序设置的错误处理程序
         $args = array($controllerName, $actionName, $controllerClass);
         return call_user_func_array($callback, $args);
     }
     if (is_null($controller)) {
         FLEA::loadClass('FLEA_Exception_MissingController');
         __THROW(new FLEA_Exception_MissingController($controllerName, $actionName, $this->_requestBackup, $controllerClass, $actionMethod, $controllerClassFilename));
         return false;
     }
     FLEA::loadClass('FLEA_Exception_MissingAction');
     __THROW(new FLEA_Exception_MissingAction($controllerName, $actionName, $this->_requestBackup, $controllerClass, $actionMethod, $controllerClassFilename));
     return false;
 }
 /**
  * 删除一个用户组及其子用户组树
  *
  * @param int $groupId
  *
  * @return boolean
  */
 function removeByPkv($groupId)
 {
     $group = parent::find((int) $groupId);
     if (!$group) {
         FLEA::loadClass('FLEA_Acl_Exception_UserGroupNotFound');
         __THROW(new FLEA_Acl_Exception_UserGroupNotFound($groupId));
         return false;
     }
     $this->dbo->startTrans();
     $group['left_value'] = (int) $group['left_value'];
     $group['right_value'] = (int) $group['right_value'];
     $span = $group['right_value'] - $group['left_value'] + 1;
     $conditions = "WHERE left_value >= {$group['left_value']} AND right_value <= {$group['right_value']}";
     $rowset = $this->findAll($conditions, null, null, $this->primaryKey, false);
     foreach ($rowset as $row) {
         if (!parent::removeByPkv($row[$this->primaryKey])) {
             $this->dbo->completeTrans(false);
             return false;
         }
     }
     if (!parent::removeByPkv($groupId)) {
         $this->dbo->completeTrans(false);
         return false;
     }
     $sql = "UPDATE {$this->fullTableName} " . "SET left_value = left_value - {$span} " . "WHERE left_value > {$group['right_value']}";
     if (!$this->dbo->execute($sql)) {
         $this->dbo->completeTrans(false);
         return false;
     }
     $sql = "UPDATE {$this->fullTableName} " . "SET right_value = right_value - {$span} " . "WHERE right_value > {$group['right_value']}";
     if (!$this->dbo->execute($sql)) {
         $this->dbo->completeTrans(false);
         return false;
     }
     $this->dbo->completeTrans();
     return true;
 }