functions ) ) $this->functions[] = $val; } else { echo JS::showError ( $val . 'function does not exist!' ); } } reset ( $this->functions ); $this->execute(); return $this; } /** * Prepares specified class methods for ajax requests * * @param Array $functions: array of objects to Ajaxify. The format is * array ( 'objectName1' => array ( 'ref' => object1Reference, 'methods' => array ( 'methodName1' .. 'N' ) ), // Selected Methods * 'objectName2' => array ( 'ref' => object2Reference ) // All methods * ... * */ public function ajaxifyObjects ( $objectList = array() ){ foreach ( $objectList as $objectName => $objectInfo ){ if ( ! isset ( $objectInfo['ref'] ) ) $objectInfo['ref'] = $objectName; // What is the name of this class $objectInfo['className'] = ( is_string ( $objectInfo['ref'] ) ) ? $objectInfo['ref'] : get_class ( $objectInfo['ref'] ); // Save the method proxys if ( ! isset ( $objectInfo['methods'] ) ) $objectInfo['methods'] = get_class_methods ( $objectInfo['className'] ); else if ( ! is_array( $objectInfo['methods'] ) ) $objectInfo['methods'] = array ( $objectInfo['methods'] ); // Set up property proxies $objectInfo['properties'] = get_class_vars ( $objectInfo['className'] ); // Save this for later $this->objectMethods[$objectName] = $objectInfo; } $this->execute(); return $this; } public static function decode($string, $encoding){ return iconv ( "UTF-8", $encoding . "//IGNORE", urldecode ( $string ) ); } /** * Calls the function specified by the incoming ajax request * */ public function execute(){ if ( $this->executed ) return; $this->executed = true; if ( ( $function = Request::get ( 'plxf' ) ) == '' ) return; $args = Request::get ( 'plxa', array () ); if ( function_exists ( "json_decode" ) ){ foreach ( $args as &$val ){ if ( preg_match('/]*>(.|\n|\t|\r)*?<\/plxobj>/', $val, $matches ) ){ $val = json_decode ( substr ( $matches[0], 8, -9 ) ); } } } $response = ''; $parts = explode ( "::", $function ); switch ( count ( $parts ) ) { // Function Call case 1: $response = call_user_func_array ( $function, $args ); break; // Object Call case 2: if ( isset ( $this->objectMethods[$parts[0]] ) ) { $objectInfo = $this->objectMethods[$parts[0]]; $response = call_user_func_array ( array ( $objectInfo['ref'], $parts[1] ), $args ); } else { $response = call_user_func_array ( array ( $parts[0], $parts[1] ), $args ); } break; default: $response = ''; break; } if ( is_bool ( $response ) ) { $response = (int)$response; } else if ( function_exists ( "json_encode" ) && ( is_array ( $response ) || is_object ( $response ) ) ) { $response = json_encode($response); } echo Tag::hTag ( 'phplivex' ), $response, Tag::_hTag ( 'phplivex' ); exit(); } /** * Creates the javascript reflections of the ajaxified php functions * * @param String $function * @return String JS code */ private function createFunction($function){ return "function " . $function . "(){ return new PHPLiveX().Callback('" . $function . "', " . $function . ".arguments); }\n"; } /** * Creates the javascript reflections of the ajaxified php objects * * @return String JS code */ private function createClass( $objectName, $objectInfo ){ $methods = $objectInfo['methods']; $properties = $objectInfo['properties']; $elements = array (); foreach ( $properties as $property => $value ) { if ( is_string ( $value ) ) $value = "'$value'"; else if ( is_array ( $value ) || is_object ( $value ) && function_exists ( "json_encode" ) ) $value = json_encode ( $value ); if ( !isset( $value ) || $value == false ) $value = "null"; $elements[] = "'{$property}': {$value}"; } foreach ( $methods as $method ) { if ( in_array ( $method, self::$ignoredMethods ) ) continue; $elements[] = "'{$method}': function(){ return new PHPLiveX().Callback({'obj': '{$objectName}', 'method': '{$method}'}, {$objectName}.{$method}.arguments); }"; } return "var {$objectName} = {\n" . join(",\n", $elements ) . "\n" . "};\n"; } /** * Organizes the created javascript code for the page * * @param Boolean $includeJS: False to create js class here and True to include the js class file */ public function run ( $echoJS=true ){ if ( $this->ran ) return; $this->ran = true; $js = ''; foreach ( $this->functions as $function ) { $js .= $this->createFunction ( $function ); } foreach ( $this->objectMethods as $objectName => $objectInfo ) { $js .= $this->createClass ( $objectName, $objectInfo ); } if ( $echoJS ) echo JS::javaScript ( $js ); else return $js; } }