/** * 删除指定的贴吧信息 * * @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; }
/** * 载入 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 { /** * 构造函数
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; }
/** * 获取自增字段的最后一个值 * * 如果没有可返回的值,则抛出异常。 * * @return mixed */ function insertId() { require_once FLEA_DIR . '/Exception/NotImplemented.php'; __THROW(new FLEA_Exception_NotImplemented('insertId()', 'FLEA_Db_Driver_Pgsql')); return false; }
/** * 处理图片上传 */ 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; } }
/** * 执行一个查询,返回一个 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; }
/** * 统计关联记录数 * * @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')); }
/** * 载入指定语言的字典文件 * * 所有的语言文件均按照“语言/字典名.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)); } } } }
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 { /** * 构造函数
/** * 返回指定名字的上传文件对象 * * @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; }
/** * 执行一个查询,返回一个 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; }
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; }
/** * 执行指定的 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; }