Ajax.php

浏览该文件的文档。
00001 <?php
00003 // FleaPHP Framework
00004 //
00005 // Copyright (c) 2005 - 2008 QeeYuan China Inc. (http://www.qeeyuan.com)
00006 //
00007 // 许可协议,请查看源代码中附带的 LICENSE.txt 文件,
00008 // 或者访问 http://www.fleaphp.org/ 获得详细信息。
00010 
00050 class FLEA_Ajax
00051 {
00057     var $events;
00058 
00064     var $paramsType = array(
00065         'async'         => 'boolean',
00066         'beforeSend'    => 'function',
00067         'complete'      => 'function',
00068         'contentType'   => 'string',
00069         'params'        => 'pair',
00070         'data'          => 'object',
00071         'dataType'      => 'string',
00072         'error'         => 'function',
00073         'global'        => 'boolean',
00074         'ifModified'    => 'boolean',
00075         'processData'   => 'boolean',
00076         'success'       => 'function',
00077         'timeout'       => 'number',
00078         'type'          => 'string',
00079         'url'           => 'string',
00080 
00081         'beforeSubmit'  => 'function',
00082         'semantic'      => 'boolean',
00083         'clearForm'     => 'boolean',
00084         'resetForm'     => 'boolean',
00085 
00086         'target'        => 'object',
00087         'targetValue'   => 'object',
00088         'clearTarget'   => 'boolean',
00089     );
00090 
00096     function FLEA_Ajax()
00097     {
00098         $this->_events = array();
00099     }
00100 
00114     function dumpJs($return = false, $wrapper = true)
00115     {
00116         $out = '';
00117         if ($wrapper) {
00118             $out .= "<script language=\"JavaScript\" type=\"text/javascript\">\n";
00119         }
00120 
00121         // 输出检查 JavaScript 库是否已经正确加载的 JavaScript 代码
00122         $out .= $this->returnCheckJs();
00123 
00124         // 为已经在服务端注册的事件输出需要的 JavaScript 代码
00125         $out .= $this->returnEventJs($this->_events);
00126 
00127         if ($wrapper) {
00128             $out .= "</script>\n";
00129         }
00130 
00131         if ($return) {
00132             return $out;
00133         } else {
00134             echo $out;
00135             return null;
00136         }
00137     }
00138 
00174     function registerEvent($control, $event, $url, $attribs = null)
00175     {
00176         $control2 = preg_replace('/[^a-z0-9_]+/i', '', $control);
00177         $functionName = "ajax_{$control2}_on{$event}";
00178         $this->_events[] = array($control, $event, $url, $attribs, $functionName);
00179         return $functionName;
00180     }
00181 
00187     function returnCheckJs()
00188     {
00189         $version = FLEA_VERSION;
00190         return <<<EOT
00191 // generated by FleaPHP {$version}
00192 if (typeof window.jQuery == "undefined") {
00193   alert('ERROR: jQuery JavaScript framework failed.');
00194 }
00195 
00196 
00197 EOT;
00198     }
00199 
00207     function returnEventJs(& $eventList)
00208     {
00209         $bindEvents = array();
00210         $out = '';
00211         foreach ($eventList as $event) {
00212             $out .= $this->_insertAjaxRequest($event, $bindEvents) . "\n";
00213         }
00214         $bindEvents = implode("\n", $bindEvents);
00215         return $out . "\n$(function() {\n{$bindEvents}\n});\n";
00216     }
00217 
00226     function _insertAjaxRequest($eventArr, & $bindEvents)
00227     {
00228         list($control, $event, $url, $attribs, $functionName) = $eventArr;
00229         $this->_formatAttribs($attribs);
00230         $bindEvents[] = "    $(\"{$control}\").bind(\"{$event}\", function() { return {$functionName}(); });";
00231 
00235         $beforeRequest = array();
00236         $call = $event == 'submit' ? "$(\"{$control}\").ajaxSubmit" : "$.ajax";
00237 
00241         if (isset($attribs['params'])) {
00242             $params = array();
00243             parse_str($attribs['params'], $params);
00244             $params = (array)$params;
00245             if (!empty($params)) {
00246                 $params = encode_url_args($params, FLEA::getAppInf('urlMode'));
00247                 switch (FLEA::getAppInf('urlMode')) {
00248                 case URL_PATHINFO:
00249                 case URL_REWRITE:
00250                     $url .= '/' . $params;
00251                     break;
00252                 default:
00253                     if (strpos($url, '?') === false) {
00254                         $url .= '?';
00255                     } else {
00256                         $url .= '&';
00257                     }
00258                     $url .= $params;
00259                 }
00260             }
00261             unset($attribs['params']);
00262         }
00263         $attribs['url'] = '"' . t2js($url) . '"';
00264 
00268         if (!isset($attribs['type'])) {
00269             $attribs['type'] = '"post"';
00270         }
00271 
00275         if (isset($attribs['target']) || isset($attribs['targetValue'])) {
00276             $targetType = isset($attribs['target']) ? 'html' : 'val';
00277             $target = ($targetType == 'html') ? $attribs['target'] : $attribs['targetValue'];
00278 
00279             if (isset($attribs['clearTarget']) && $attribs['clearTarget']) {
00280                 $beforeRequest[] = "    {$target}.{$targetType}(\"\");";
00281             }
00282 
00283             $success = isset($attribs['success']) ? trim($attribs['success']) : '';
00284             if ($success) {
00285                 $success = preg_replace('/function.+{/i', '{', $success);
00286                 if (substr($success, -1) != ';') { $success .= ';'; }
00287                 $success = "            {$success}\n";
00288             }
00289 
00290             $attribs['success'] = <<<EOT
00291 function(data) {
00292             {$target}.{$targetType}(data);
00293 {$success}        }
00294 EOT;
00295 
00296             unset($attribs['target']);
00297             unset($attribs['targetValue']);
00298             unset($attribs['clearTarget']);
00299         }
00300 
00301         $options = '';
00302         foreach ($attribs as $option => $value) {
00303             $options .= "        {$option}: {$value},\n";
00304         }
00305         $options = substr($options, 0, -2);
00306 
00307         $beforeRequest = implode("\n", $beforeRequest);
00308         if ($beforeRequest) {
00309             $beforeRequest = "\n{$beforeRequest}";
00310         }
00311         $function = <<<EOT
00312 function {$functionName}()
00313 {{$beforeRequest}
00314     {$call}({
00315 {$options}
00316     });
00317 
00318     return false;
00319 }
00320 
00321 EOT;
00322 
00323         return $function;
00324     }
00325 
00331     function _formatAttribs(& $attribs)
00332     {
00333         // 格式化参数
00334         foreach ($attribs as $option => $value) {
00335             if (!isset($this->paramsType[$option])) {
00336                 $type = 'object';
00337             } else {
00338                 $type = $this->paramsType[$option];
00339             }
00340 
00341             switch ($type) {
00342             case 'raw':
00343             case 'function':
00344             case 'number':
00345                 break;
00346             case 'pair':
00347                 if (is_array($value)) {
00348                     $value = t2js(encode_url_args($value));
00349                 }
00350                 break;
00351             case 'boolean':
00352                 $value = $value ? 'true' : 'false';
00353                 break;
00354             case 'object':
00355                 $value = "$(\"{$value}\")";
00356                 break;
00357             case 'string':
00358             default:
00359                 $value = '"' . t2js($value) . '"';
00360             }
00361 
00362             $attribs[$option] = $value;
00363         }
00364     }
00365 }

Generated at Sat Feb 2 15:18:50 2008 for FleaPHP by  doxygen 1.5.3