📄 xajax.class.php
字号:
<?php
/**
* xajax.inc.php :: Main xajax class and setup file
*
* xajax version 0.2.4
* copyright (c) 2005 by Jared White & J. Max Wilson
* http://www.xajaxproject.org
*/
if (!defined ('XAJAX_DEFAULT_CHAR_ENCODING'))
{
define ('XAJAX_DEFAULT_CHAR_ENCODING', 'utf-8' );
}
####require_once(dirname(__FILE__)."/xajax_response.inc.php");
class xajaxResponse
{
var $xml;
var $sEncoding;
var $bOutputEntities;
function xajaxResponse($sEncoding=XAJAX_DEFAULT_CHAR_ENCODING, $bOutputEntities=false)
{
$this->setCharEncoding($sEncoding);
$this->bOutputEntities = $bOutputEntities;
}
function setCharEncoding($sEncoding)
{
$this->sEncoding = $sEncoding;
}
function outputEntitiesOn()
{
$this->bOutputEntities = true;
}
function outputEntitiesOff()
{
$this->bOutputEntities = false;
}
function addConfirmCommands($iCmdNumber, $sMessage)
{
$this->xml .= $this->_cmdXML(array("n"=>"cc","t"=>$iCmdNumber),$sMessage);
}
function addAssign($sTarget,$sAttribute,$sData)
{
$this->xml .= $this->_cmdXML(array("n"=>"as","t"=>$sTarget,"p"=>$sAttribute),$sData);
}
function addAppend($sTarget,$sAttribute,$sData)
{
$this->xml .= $this->_cmdXML(array("n"=>"ap","t"=>$sTarget,"p"=>$sAttribute),$sData);
}
function addPrepend($sTarget,$sAttribute,$sData)
{
$this->xml .= $this->_cmdXML(array("n"=>"pp","t"=>$sTarget,"p"=>$sAttribute),$sData);
}
function addReplace($sTarget,$sAttribute,$sSearch,$sData)
{
$sDta = "<s><![CDATA[$sSearch]]></s><r><![CDATA[$sData]]></r>";
$this->xml .= $this->_cmdXML(array("n"=>"rp","t"=>$sTarget,"p"=>$sAttribute),$sDta);
}
function addClear($sTarget,$sAttribute)
{
$this->addAssign($sTarget,$sAttribute,'');
}
function addAlert($sMsg)
{
$this->xml .= $this->_cmdXML(array("n"=>"al"),$sMsg);
}
function addRedirect($sURL)
{
$queryStart = strpos($sURL, '?', strrpos($sURL, '/'));
if ($queryStart !== FALSE)
{
$queryStart++;
$queryEnd = strpos($sURL, '#', $queryStart);
if ($queryEnd === FALSE)
$queryEnd = strlen($sURL);
$queryPart = substr($sURL, $queryStart, $queryEnd-$queryStart);
parse_str($queryPart, $queryParts);
$newQueryPart = "";
foreach($queryParts as $key => $value)
{
$newQueryPart .= rawurlencode($key).'='.rawurlencode($value).ini_get('arg_separator.output');
}
$sURL = str_replace($queryPart, $newQueryPart, $sURL);
}
$this->addScript('window.location = "'.$sURL.'";');
}
function addScript($sJS)
{
$this->xml .= $this->_cmdXML(array("n"=>"js"),$sJS);
}
function addScriptCall() {
$arguments = func_get_args();
$sFunc = array_shift($arguments);
$sData = $this->_buildObjXml($arguments);
$this->xml .= $this->_cmdXML(array("n"=>"jc","t"=>$sFunc),$sData);
}
function addRemove($sTarget)
{
$this->xml .= $this->_cmdXML(array("n"=>"rm","t"=>$sTarget),'');
}
function addCreate($sParent, $sTag, $sId, $sType="")
{
if ($sType)
{
trigger_error("The \$sType parameter of addCreate has been deprecated. Use the addCreateInput() method instead.", E_USER_WARNING);
return;
}
$this->xml .= $this->_cmdXML(array("n"=>"ce","t"=>$sParent,"p"=>$sId),$sTag);
}
function addInsert($sBefore, $sTag, $sId)
{
$this->xml .= $this->_cmdXML(array("n"=>"ie","t"=>$sBefore,"p"=>$sId),$sTag);
}
function addInsertAfter($sAfter, $sTag, $sId)
{
$this->xml .= $this->_cmdXML(array("n"=>"ia","t"=>$sAfter,"p"=>$sId),$sTag);
}
function addCreateInput($sParent, $sType, $sName, $sId)
{
$this->xml .= $this->_cmdXML(array("n"=>"ci","t"=>$sParent,"p"=>$sId,"c"=>$sType),$sName);
}
function addInsertInput($sBefore, $sType, $sName, $sId)
{
$this->xml .= $this->_cmdXML(array("n"=>"ii","t"=>$sBefore,"p"=>$sId,"c"=>$sType),$sName);
}
function addInsertInputAfter($sAfter, $sType, $sName, $sId)
{
$this->xml .= $this->_cmdXML(array("n"=>"iia","t"=>$sAfter,"p"=>$sId,"c"=>$sType),$sName);
}
function addEvent($sTarget,$sEvent,$sScript)
{
$this->xml .= $this->_cmdXML(array("n"=>"ev","t"=>$sTarget,"p"=>$sEvent),$sScript);
}
function addHandler($sTarget,$sEvent,$sHandler)
{
$this->xml .= $this->_cmdXML(array("n"=>"ah","t"=>$sTarget,"p"=>$sEvent),$sHandler);
}
function addRemoveHandler($sTarget,$sEvent,$sHandler)
{
$this->xml .= $this->_cmdXML(array("n"=>"rh","t"=>$sTarget,"p"=>$sEvent),$sHandler);
}
function addIncludeScript($sFileName)
{
$this->xml .= $this->_cmdXML(array("n"=>"in"),$sFileName);
}
function getXML()
{
$sXML = "<?xml version=\"1.0\"";
if ($this->sEncoding && strlen(trim($this->sEncoding)) > 0)
$sXML .= " encoding=\"".$this->sEncoding."\"";
$sXML .= " ?"."><xjx>" . $this->xml . "</xjx>";
return $sXML;
}
function loadXML($mXML)
{
if (is_a($mXML, "xajaxResponse")) {
$mXML = $mXML->getXML();
}
$sNewXML = "";
$iStartPos = strpos($mXML, "<xjx>") + 5;
$sNewXML = substr($mXML, $iStartPos);
$iEndPos = strpos($sNewXML, "</xjx>");
$sNewXML = substr($sNewXML, 0, $iEndPos);
$this->xml .= $sNewXML;
}
function _cmdXML($aAttributes, $sData)
{
if ($this->bOutputEntities) {
if (function_exists('mb_convert_encoding')) {
$sData = call_user_func_array('mb_convert_encoding', array(&$sData, 'HTML-ENTITIES', $this->sEncoding));
}
else {
trigger_error("The xajax XML response output could not be converted to HTML entities because the mb_convert_encoding function is not available", E_USER_NOTICE);
}
}
$xml = "<cmd";
foreach($aAttributes as $sAttribute => $sValue)
$xml .= " $sAttribute=\"$sValue\"";
if ($sData !== null && !stristr($sData,'<![CDATA['))
$xml .= "><![CDATA[$sData]]></cmd>";
else if ($sData !== null)
$xml .= ">$sData</cmd>";
else
$xml .= "></cmd>";
return $xml;
}
function _buildObjXml($var) {
if (gettype($var) == "object") $var = get_object_vars($var);
if (!is_array($var)) {
return "<![CDATA[$var]]>";
}
else {
$data = "<xjxobj>";
foreach ($var as $key => $value) {
$data .= "<e>";
$data .= "<k>" . htmlspecialchars($key) . "</k>";
$data .= "<v>" . $this->_buildObjXml($value) . "</v>";
$data .= "</e>";
}
$data .= "</xjxobj>";
return $data;
}
}
}
if (!defined ('XAJAX_GET'))
{
define ('XAJAX_GET', 0);
}
if (!defined ('XAJAX_POST'))
{
define ('XAJAX_POST', 1);
}
class xajax
{
var $aFunctions;
var $aObjects;
var $aFunctionRequestTypes;
var $aFunctionIncludeFiles;
var $sCatchAllFunction;
var $sPreFunction;
var $sRequestURI;
var $sWrapperPrefix;
var $bDebug;
var $bStatusMessages;
var $bExitAllowed;
var $bWaitCursor;
var $bErrorHandler;
var $sLogFile;
var $bCleanBuffer;
var $sEncoding;
var $bDecodeUTF8Input;
var $bOutputEntities;
var $aObjArray;
var $iPos;
function xajax($sRequestURI="",$sWrapperPrefix="xajax_",$sEncoding=XAJAX_DEFAULT_CHAR_ENCODING,$bDebug=false)
{
$this->aFunctions = array();
$this->aObjects = array();
$this->aFunctionIncludeFiles = array();
$this->sRequestURI = $sRequestURI;
if ($this->sRequestURI == "")
$this->sRequestURI = $this->_detectURI();
$this->sWrapperPrefix = $sWrapperPrefix;
$this->bDebug = $bDebug;
$this->bStatusMessages = false;
$this->bWaitCursor = true;
$this->bExitAllowed = true;
$this->bErrorHandler = false;
$this->sLogFile = "";
$this->bCleanBuffer = false;
$this->setCharEncoding($sEncoding);
$this->bDecodeUTF8Input = false;
$this->bOutputEntities = false;
}
function setRequestURI($sRequestURI)
{
$this->sRequestURI = $sRequestURI;
}
function setWrapperPrefix($sPrefix)
{
$this->sWrapperPrefix = $sPrefix;
}
function debugOn()
{
$this->bDebug = true;
}
function debugOff()
{
$this->bDebug = false;
}
function statusMessagesOn()
{
$this->bStatusMessages = true;
}
function statusMessagesOff()
{
$this->bStatusMessages = false;
}
function waitCursorOn()
{
$this->bWaitCursor = true;
}
function waitCursorOff()
{
$this->bWaitCursor = false;
}
function exitAllowedOn()
{
$this->bExitAllowed = true;
}
function exitAllowedOff()
{
$this->bExitAllowed = false;
}
function errorHandlerOn()
{
$this->bErrorHandler = true;
}
function errorHandlerOff()
{
$this->bErrorHandler = false;
}
function setLogFile($sFilename)
{
$this->sLogFile = $sFilename;
}
function cleanBufferOn()
{
$this->bCleanBuffer = true;
}
function cleanBufferOff()
{
$this->bCleanBuffer = false;
}
function setCharEncoding($sEncoding)
{
$this->sEncoding = $sEncoding;
}
function decodeUTF8InputOn()
{
$this->bDecodeUTF8Input = true;
}
function decodeUTF8InputOff()
{
$this->bDecodeUTF8Input = false;
}
function outputEntitiesOn()
{
$this->bOutputEntities = true;
}
function outputEntitiesOff()
{
$this->bOutputEntities = false;
}
function registerFunction($mFunction,$sRequestType=XAJAX_POST)
{
if (is_array($mFunction)) {
$this->aFunctions[$mFunction[0]] = 1;
$this->aFunctionRequestTypes[$mFunction[0]] = $sRequestType;
$this->aObjects[$mFunction[0]] = array_slice($mFunction, 1);
}
else {
$this->aFunctions[$mFunction] = 1;
$this->aFunctionRequestTypes[$mFunction] = $sRequestType;
}
}
function registerExternalFunction($mFunction,$sIncludeFile,$sRequestType=XAJAX_POST)
{
$this->registerFunction($mFunction, $sRequestType);
if (is_array($mFunction)) {
$this->aFunctionIncludeFiles[$mFunction[0]] = $sIncludeFile;
}
else {
$this->aFunctionIncludeFiles[$mFunction] = $sIncludeFile;
}
}
function registerCatchAllFunction($mFunction)
{
if (is_array($mFunction)) {
$this->sCatchAllFunction = $mFunction[0];
$this->aObjects[$mFunction[0]] = array_slice($mFunction, 1);
}
else {
$this->sCatchAllFunction = $mFunction;
}
}
function registerPreFunction($mFunction)
{
if (is_array($mFunction)) {
$this->sPreFunction = $mFunction[0];
$this->aObjects[$mFunction[0]] = array_slice($mFunction, 1);
}
else {
$this->sPreFunction = $mFunction;
}
}
function canProcessRequests()
{
if ($this->getRequestMode() != -1) return true;
return false;
}
function getRequestMode()
{
if (!empty($_GET["xajax"]))
return XAJAX_GET;
if (!empty($_POST["xajax"]))
return XAJAX_POST;
return -1;
}
function processRequests()
{
$requestMode = -1;
$sFunctionName = "";
$bFoundFunction = true;
$bFunctionIsCatchAll = false;
$sFunctionNameForSpecial = "";
$aArgs = array();
$sPreResponse = "";
$bEndRequest = false;
$sResponse = "";
$requestMode = $this->getRequestMode();
if ($requestMode == -1) return;
if ($requestMode == XAJAX_POST)
{
$sFunctionName = $_POST["xajax"];
if (!empty($_POST["xajaxargs"]))
$aArgs = $_POST["xajaxargs"];
}
else
{
header ("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header ("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header ("Cache-Control: no-cache, must-revalidate");
header ("Pragma: no-cache");
$sFunctionName = $_GET["xajax"];
if (!empty($_GET["xajaxargs"]))
$aArgs = $_GET["xajaxargs"];
}
if ($this->bErrorHandler) {
$GLOBALS['xajaxErrorHandlerText'] = "";
set_error_handler("xajaxErrorHandler");
}
if ($this->sPreFunction) {
if (!$this->_isFunctionCallable($this->sPreFunction)) {
$bFoundFunction = false;
$objResponse = new xajaxResponse();
$objResponse->addAlert("Unknown Pre-Function ". $this->sPreFunction);
$sResponse = $objResponse->getXML();
}
}
if (array_key_exists($sFunctionName,$this->aFunctionIncludeFiles))
{
ob_start();
include_once($this->aFunctionIncludeFiles[$sFunctionName]);
ob_end_clean();
}
if ($bFoundFunction) {
$sFunctionNameForSpecial = $sFunctionName;
if (!array_key_exists($sFunctionName, $this->aFunctions))
{
if ($this->sCatchAllFunction) {
$sFunctionName = $this->sCatchAllFunction;
$bFunctionIsCatchAll = true;
}
else {
$bFoundFunction = false;
$objResponse = new xajaxResponse();
$objResponse->addAlert("Unknown Function $sFunctionName.");
$sResponse = $objResponse->getXML();
}
}
else if ($this->aFunctionRequestTypes[$sFunctionName] != $requestMode)
{
$bFoundFunction = false;
$objResponse = new xajaxResponse();
$objResponse->addAlert("Incorrect Request Type.");
$sResponse = $objResponse->getXML();
}
}
if ($bFoundFunction)
{
for ($i = 0; $i < sizeof($aArgs); $i++)
{
if (get_magic_quotes_gpc() == 1 && is_string($aArgs[$i])) {
$aArgs[$i] = stripslashes($aArgs[$i]);
}
if (stristr($aArgs[$i],"<xjxobj>") != false)
{
$aArgs[$i] = $this->_xmlToArray("xjxobj",$aArgs[$i]);
}
else if (stristr($aArgs[$i],"<xjxquery>") != false)
{
$aArgs[$i] = $this->_xmlToArray("xjxquery",$aArgs[$i]);
}
else if ($this->bDecodeUTF8Input)
{
$aArgs[$i] = $this->_decodeUTF8Data($aArgs[$i]);
}
}
if ($this->sPreFunction) {
$mPreResponse = $this->_callFunction($this->sPreFunction, array($sFunctionNameForSpecial, $aArgs));
if (is_array($mPreResponse) && $mPreResponse[0] === false) {
$bEndRequest = true;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -