ktutil.inc.svn-base

来自「PHP 知识管理系统(基于树结构的知识管理系统), 英文原版的PHP源码。」· SVN-BASE 代码 · 共 1,334 行 · 第 1/3 页

SVN-BASE
1,334
字号
    			{    				$script = $stackPath . '/java/jre/bin/java.exe';    			}    			else    			{    				$script = $stackPath . '/java/jre/bin/java';    			}    			break;    		case 'externalBinary/df':    			if (OS_WINDOWS)    			{    				$script = $stackPath . '/bin/gnuwin32/df.exe';    			}    			else    			{    				$script = $stackPath . '/common/bin/df';    			}    			break;    		case 'externalBinary/php':    			if (OS_WINDOWS)    			{    				$script = $stackPath . '/php/php.exe';    			}    			else    			{    				$script = $stackPath . '/php/bin/php';    			}    			break;    		default:    			return null;    	}    	if (is_file($script))		{			return $script;		}    	return false;    }    // now accepts strings OR arrays!    // {{{ addQueryString    static function addQueryString($url, $qs) {        require_once(KT_DIR . '/thirdparty/pear/Net/URL.php');        $oUrl = new Net_URL($url);        $oKTConfig =& KTConfig::getSingleton();        if ($oKTConfig->get("KnowledgeTree/sslEnabled")) {            $oUrl->protocol = 'https';            if ($oUrl->port == 80) {                $oUrl->port = 443;            }        }        $host = $oKTConfig->get("KnowledgeTree/serverName");        $host = explode(':', $host);        $oUrl->host = $host[0];	if(!is_array($qs)) {	    $aQs = $oUrl->_parseRawQuerystring($qs);	} else {	    $aQs =& $qs;	}        foreach ($aQs as $k => $v) {            $oUrl->addQueryString($k, $v, true);        }        return $oUrl->getUrl();    }    // }}}    // {{{ ktLink    function ktLink($base, $subpath='', $qs='') {        $KTConfig =& KTConfig::getSingleton();        $root = $KTConfig->get("KnowledgeTree/rootUrl");        $url = generateLink($base);        if (!empty($subpath)) {            $hasPathInfo = $KTConfig->get("KnowledgeTree/pathInfoSupport");            if ($hasPathInfo) {                $url .= $subpath;            } else {                $url = KTUtil::addQueryString($url, "kt_path_info=" . $subpath);            }        }        return KTUtil::addQueryString($url, $qs);    }    // }}}    // {{{ addQueryStringSelf    static function addQueryStringSelf($qs) {        return KTUtil::addQueryString($_SERVER['PHP_SELF'], $qs);    }    // }}}    // {{{ isAbsolutePath    static function isAbsolutePath($sPath) {        $sPath = str_replace('\\', '/', $sPath);        $sReal = str_replace('\\', '/', realpath($sPath));        if(substr($sPath, -1, 1) == '/' && substr($sReal, -1, 1) != '/'){            $sReal .= '/';        }        return (strtolower($sReal) == strtolower($sPath));        if (substr($sPath, 0, 1) == '/') {            return true;        }        if (OS_WINDOWS && (substr($sPath, 1, 2) == ':/')) {            return true;        }        if (OS_WINDOWS && (substr($sPath, 1, 2) == ':\\')) {            return true;        }        return false;    }    // }}}    // {{{ formatPlainText    /* formats input text for discussion body. replaces newlines    with <br/> tags to allow for paragraphing. should also strip    html elements.    */    function formatPlainText($sText) {        return str_replace("\n", '<br/>', str_replace("\r\n", '<br/>', trim($sText)));    }    // }}}    // getBenchmarkTime    function getBenchmarkTime () {        $microtime_simple = explode(' ', microtime());        return ((float) $microtime_simple[1] + (float) $microtime_simple[0]);    }    function phraseSplit($sSearchString) {	// this should probably be moved to a DBUtil method	$sMinWord = DBUtil::getOneResultKey("SHOW VARIABLES LIKE 'ft_min_word_len'", "Value");	if(is_numeric($sMinWord)) {	    $iMinWord = (int)$sMinWord;	} else {	    $iMinWord = 4;	}        $a = preg_split('#"#', $sSearchString);        $i = 0;        $phrases = array();        $word_parts = array();        foreach ($a as $part) {            if ($i%2 == 0) {                $word_parts[] = $part;            } else {                $phrases[] = $part;            }            $i += 1;        }	$oStopwords =& KTStopwords::getSingleton();        $words = array();        foreach ($word_parts as $part) {            $w = (array) explode(' ', $part);            foreach ($w as $potential) {		if (strlen($potential) >= $iMinWord && !$oStopwords->isStopword($potential)) {		    $words[] = $potential;		}	    }        }        return array(            'words' => $words,            'phrases' => $phrases,        );    }    function phraseQuote($sQuery) {	foreach(KTUtil::phraseSplit($sQuery) as $k => $v) {	    $t = array();	    foreach ($v as $part) {		$t[] = sprintf('+"%s"', $part);	    }	    $q_set[$k] = join(' ', $t);	}	return  implode(' ',$q_set);    }    static function running_user() {        if (substr(PHP_OS, 0, 3) == "WIN") {            return null;        }        if (extension_loaded("posix")) {            $uid = posix_getuid();            $userdetails = posix_getpwuid($uid);            return $userdetails['name'];        }        if (file_exists('/usr/bin/whoami')) {            return exec('/usr/bin/whoami');        }        if (file_exists('/usr/bin/id')) {            return exec('/usr/bin/id -nu');        }        return null;    }    static function getSystemSetting($name, $default = null) {        // XXX make this use a cache layer?        $sTable = KTUtil::getTableName('system_settings');        $aQuery = array(            sprintf('SELECT value FROM %s WHERE name = ?', $sTable),            array($name),        );        $res = DBUtil::getOneResultKey($aQuery, 'value');        if (PEAR::isError($res)) {            if(!is_null($default)){                return $default;            }            return PEAR::raiseError(sprintf(_kt('Unable to retrieve system setting %s: %s'), $name, $res->getMessage()));        }        if (is_null($res)) { return $default; }        return $res;    }    function setSystemSetting($name, $value) {        // we either need to insert or update:        $sTable = KTUtil::getTableName('system_settings');        $current_value = KTUtil::getSystemSetting($name);        if (is_null($current_value)) {            // insert            $res = DBUtil::autoInsert(                $sTable,                array(                    'name' => $name,                    'value' => $value,                ),                null // opts            );            if (PEAR::isError($res)) { return $res; }            else { return true; }        } else {            // update            $aQuery = array(                sprintf('UPDATE %s SET value = ? WHERE name = ?', $sTable),                array($value, $name),            );            $res = DBUtil::runQuery($aQuery);            if (PEAR::isError($res)) { return $res; }            return true;        }    }    function getSystemIdentifier() {        $sIdentifier = KTUtil::getSystemSetting('kt_system_identifier');        if (empty($sIdentifier)) {            $sIdentifier = md5(uniqid(mt_rand(), true));            KTUtil::setSystemSetting('kt_system_identifier', $sIdentifier);        }        return $sIdentifier;    }    function getKTVersions() {        $aVersions = array();        $sProfessionalFile = KT_DIR . '/docs/VERSION-PRO.txt';        $sOssFile = KT_DIR . '/docs/VERSION-OSS.txt';        $sDevProfessionalFile = KT_DIR . '/docs/VERSION-PRO-DEV.txt';        $sDevOssFile = KT_DIR . '/docs/VERSION-OSS-DEV.txt';        if (file_exists($sDevProfessionalFile)) {            $sVersion = trim(file_get_contents($sDevProfessionalFile));            $aVersions['Development Commercial'] = $sVersion;        } elseif (file_exists($sDevOssFile)) {            $sVersion = trim(file_get_contents($sDevOssFile));            $aVersions['Development OSS'] = $sVersion;        } elseif (file_exists($sProfessionalFile)) {            $sVersion = trim(file_get_contents($sProfessionalFile));            $aVersions['Commercial Edition'] = $sVersion;        } elseif (file_exists($sOssFile)) {            $sVersion = trim(file_get_contents($sOssFile));            $aVersions['OSS'] = $sVersion;        } else {            $aVersions['ERR'] = "Unknown version";        }        return $aVersions;    }    // this will have to move somewhere else    function buildSelectOptions($aVocab, $cur = null) {	$sRet = '';	foreach($aVocab as $k=>$v) {	    $sRet .= '<option value="' . $k . '"';	    if($k == $cur) $sRet .= ' selected="selected"';	    $sRet .= '>' . $v . '</option>';	}	return $sRet;    }    function keyArray($aEntities, $sIdFunc = 'getId') {        $aRet = array();        foreach ($aEntities as $oEnt) {            $meth = array(&$oEnt, $sIdFunc);            $id = call_user_func($meth);            $aRet[$id] = $oEnt;        }        return $aRet;    }    /**     * Generates breadcrumbs for a browsable collection     *     * @param object $oFolder The folder being browsed to     * @param integer $iFolderId The id of the folder     * @param array $aURLParams The url parameters for each folder/breadcrumb link     * @return unknown     */    function generate_breadcrumbs($oFolder, $iFolderId, $aURLParams) {        static $aFolders = array();        static $aBreadcrumbs = array();        // Check if selected folder is a parent of the current folder        if(in_array($iFolderId, $aFolders)){            $temp = array_flip($aFolders);            $key = $temp[$iFolderId];            array_splice($aFolders, $key);            array_splice($aBreadcrumbs, $key);            return $aBreadcrumbs;        }        // Check for the parent of the selected folder unless its the root folder        $iParentId = $oFolder->getParentID();        if(is_null($iParentId)){            // folder is root            return '';        }        if($iFolderId != 1 && in_array($iParentId, $aFolders)){            $temp = array_flip($aFolders);            $key = $temp[$iParentId];            array_splice($aFolders, $key);            array_splice($aBreadcrumbs, $key);            array_push($aFolders, $iFolderId);            $aParams = $aURLParams;            $aParams['fFolderId'] = $iFolderId;            $url = KTUtil::addQueryString($_SERVER['PHP_SELF'], $aParams);            $aBreadcrumbs[] = array('url' => $url, 'name' => $oFolder->getName());            return $aBreadcrumbs;        }        // Get the root folder name        $oRootFolder = Folder::get(1);        $sRootFolder =$oRootFolder->getName();        // Create the breadcrumbs        $folder_path_names = $oFolder->getPathArray();        array_unshift($folder_path_names, $sRootFolder);        $folder_path_ids = explode(',', $oFolder->getParentFolderIds());        $folder_path_ids[] = $oFolder->getId();        if ($folder_path_ids[0] == 0) {            array_shift($folder_path_ids);            array_shift($folder_path_names);        }        $iCount = count($folder_path_ids);        $range = range(0, $iCount - 1);        foreach ($range as $index) {            $id = $folder_path_ids[$index];            $name = $folder_path_names[$index];            $aParams = $aURLParams;            $aParams['fFolderId'] = $id;            $url = KTUtil::addQueryString($_SERVER['PHP_SELF'], $aParams);            $aBreadcrumbs[] = array('url' => $url, 'name' => $name);        }        $aFolders = $folder_path_ids;        return $aBreadcrumbs;    }    /**     * Generates the correct headers for downloading a document     */    function download($path, $mimeType, $fileSize, $fileName, $displayType = 'attachment')    {        if (file_exists($path)) {            // IE7 adds underscores to filenames: fix            // IE6 displays characters incorrectly            $browser = $_SERVER['HTTP_USER_AGENT'];            if ( strpos( strtoupper( $browser), 'MSIE') !== false) {                $fileName = rawurlencode($fileName);            }            // Set the correct headers            header("Content-Type: {$mimeType}");            header("Content-Length: {$fileSize}");            header("Content-Disposition: {$displayType}; filename=\"{$fileName}\"");            header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");            header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");            // Document must be cached in order to open it            header("Cache-Control: must-revalidate");            // Allows the file to be downloaded, otherwise it attempts the download as "action.php?..."            header("Pragma: public");            readfile($path);        }else {            return false;        }    }}/** * * Merges two arrays using array_merge * * array_merge in PHP5 got more strict about its parameter handling, * forcing arrays. * */if (version_compare(phpversion(), '5.0') === -1) {    function kt_array_merge() {        $args = func_get_args();        return call_user_func_array("array_merge",$args);    }} else {    eval('    function kt_array_merge() {        $args = func_get_args();        foreach ($args as &$arg)  {            $arg = (array)$arg;        }        return call_user_func_array("array_merge",$args);    }    ');}?>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?