00001 <?php
00011 final class request {
00012
00018 private static $cfg;
00019
00039 private static $requestedUriInfo;
00040
00060 private static $uriInfo;
00061
00067 private static $module;
00068
00074 private static $scaffold;
00075
00081 private static $mobileStatus = false;
00082
00086 private function __construct() {}
00087
00092 public static function init() {
00093 if (!empty(self::$requestArray))
00094 return;
00095
00096 self::$cfg = new config(factory::loadCfg(__CLASS__));
00097
00098 $alias = array();
00099 $outs = '(\.('.implode('|', array_keys(self::$cfg->outCfg)).'))';
00100 foreach(self::$cfg->alias as $k=>$v) {
00101 if ($k == '/') {
00102 $alias['(/.{2})?/?'] = '\1'.$v;
00103 $alias['(/.{2})?'.$outs] = '\1'.$v.'\2';
00104 } else {
00105 $k = '(/.{2})?'.$k;
00106 $tmp = explode('\\', $v);
00107 $t = '\\1'.$tmp[0];
00108 unset($tmp[0]);
00109 $i = 2;
00110 foreach($tmp as $tt) {
00111 $t.='\\'.(intval(substr($tt, 0, 1))+1).substr($tt, 1);
00112 $i++;
00113 }
00114 if (!preg_match($outs, $k))
00115 $alias[$k.'(.*)'] = $t.'\\'.$i;
00116 $alias[$k] = $t;
00117 }
00118 }
00119 $alias = array_reverse($alias, true);
00120 self::$cfg->alias = $alias;
00121
00122
00123 $avlLangsTmp = self::$cfg->avlLang;
00124 $avlLangs = array();
00125 foreach($avlLangsTmp as $k=>$v) {
00126 if ($k == self::$cfg->lang) {
00127 $avlLangs[$k] = $v;
00128 unset($avlLangsTmp[$k]);
00129 }
00130 }
00131 self::$cfg->avlLang = array_merge($avlLangs, $avlLangsTmp);
00132
00133 $secure = (array_key_exists('HTTPS', $_SERVER) && $_SERVER['HTTPS'] == 'on');
00134
00135 $protocol = $secure? 'https' : 'http';
00136
00137 $controller = basename($_SERVER['SCRIPT_FILENAME']);
00138
00139 $serverName = array_key_exists('HTTP_HOST', $_SERVER) ? $_SERVER['HTTP_HOST'] : (array_key_exists('SERVER_NAME', $_SERVER) ? $_SERVER['SERVER_NAME'] : self::$cfg->defaultServerName);
00140 $stdPort = $secure ? '443' : '80';
00141 $port = (array_key_exists('SERVER_PORT', $_SERVER) && $_SERVER['SERVER_PORT'] != $stdPort && $_SERVER['SERVER_PORT'])? ':'.$_SERVER['SERVER_PORT'] : '';
00142 $domain = $protocol.'://'.$serverName.$port;
00143
00144 $scriptName = $_SERVER['SCRIPT_NAME'];
00145 $requestUri = urldecode(array_key_exists('REQUEST_URI', $_SERVER) ? $_SERVER['REQUEST_URI'] : ('/'.$scriptName.(array_key_exists(1, $_SERVER['argv']) ? $_SERVER['argv'][1] : '')));
00146
00147 $redir = null;
00148 $forceServerName = null;
00149 if (self::$cfg->forceServerName
00150 && strpos($serverName, 'localhost') === false
00151 && strtolower(self::$cfg->forceServerName) != strtolower($serverName)) {
00152 $forceServerName = self::$cfg->forceServerName;
00153 $redir = $protocol.'://'.$forceServerName.$port.$requestUri;
00154 }
00155 if (self::$cfg->forceNoOut
00156 && self::$cfg->noOut
00157 && ($pos = strpos($requestUri, self::$cfg->noOut))
00158 && $pos + strlen(self::$cfg->noOut) == strlen($requestUri)
00159 ) {
00160 if ($redir)
00161 $redir = substr($redir, 0, -1*(strlen(self::$cfg->noOut)+1));
00162 else
00163 $redir = $domain.substr($requestUri, 0, $pos-1);
00164 }
00165 if (self::$cfg->noController && strpos($requestUri, self::$cfg->noController) !== false) {
00166 if (!$redir)
00167 $redir = $domain.$requestUri;
00168 $redir = str_replace(self::$cfg->noController.'/', '', $redir);
00169 if ($pos = strpos($redir, self::$cfg->noController))
00170 $redir = substr($redir, 0, $pos);
00171 }
00172
00173 $path = '/';
00174 $requestUriTmp = explode('/', substr($requestUri, 1));
00175 $scriptNameTmp = explode('/', substr($scriptName, 1));
00176 $min = min(count($requestUriTmp), count($scriptNameTmp));
00177 $i = 0;
00178 while ($i < $min && $requestUriTmp[$i] == $scriptNameTmp[$i]) {
00179 $path.= $requestUriTmp[$i].'/';
00180 $i++;
00181 }
00182
00183 $pathWithController = (strpos($requestUri, $controller) !== false);
00184
00185 if ($pathWithController) {
00186 if (strpos($path, $controller) !== false)
00187 $path = substr($path, 0, -strlen($controller)-1);
00188 $len = strlen($path.$controller);
00189 $request = (isset($requestUri[$len]) && $requestUri[$len] == '?') ? '' : substr($requestUri, $len+1);
00190 } else
00191 $request = substr($requestUri, strlen($path));
00192
00193 if (self::$cfg->forceNoLang) {
00194 $forceNoLang = self::$cfg->forceNoLang === true ? self::$cfg->lang : self::$cfg->forceNoLang;
00195 if ($requestUri != $path && strpos($requestUri, '/'.$forceNoLang.'/') !== false && $request) {
00196 $redir = str_replace('/'.$forceNoLang.'/', '/', $redir ? $redir : $domain.$requestUri);
00197 }
00198 } else if (self::$cfg->forceLang) {
00199 $forceLang = self::$cfg->forceLang === true ? self::$cfg->lang : self::$cfg->forceLang;
00200 if ($requestUri != $path && strpos($requestUri, '/'.$forceLang.'/') === false
00201 && $request) {
00202 $continue = true;
00203 $i = 0;
00204 $cpt = count(self::$cfg->noForceLang);
00205 while($continue && $i < $cpt) {
00206 if (strpos($request, self::$cfg->noForceLang[$i]) === 0)
00207 $continue = false;
00208 $i++;
00209 }
00210 if ($continue) {
00211
00212 $redirWork = $redir ? $redir : $domain.$requestUri;
00213 $search = ($forceServerName ? $forceServerName : $domain).$path.($pathWithController? $controller.'/' : null);
00214 $pos = strpos($redirWork, $search) + strlen($search);
00215 $end = $pos < strlen($redirWork) ? strpos($redirWork, '/', $pos+1) : false;
00216 $end = $end ? $end-$pos : strlen($redirWork);
00217 $curLang = substr($redirWork, $pos, $end);
00218 if (!self::isLang($curLang))
00219 $redir = substr($redirWork, 0, $pos).$forceLang.'/'.substr($redirWork, $pos);
00220 }
00221 }
00222 }
00223
00224 if ($redir) {
00225 header('HTTP/1.0 301 Moved Permanently');
00226 header('Location: '.$redir);
00227 exit;
00228 }
00229
00230 self::extractGet($request, true);
00231
00232 self::$requestedUriInfo = self::analyseRequest($request);
00233
00234 self::$uriInfo = array_merge(array(
00235 'secure'=>$secure,
00236 'protocol'=>$protocol,
00237 'controller'=>$controller,
00238 'serverName'=>$serverName,
00239 'domain'=>$domain,
00240 'path'=>$path,
00241 'pathWithController'=>$pathWithController,
00242 'request'=>$request,
00243 'lang'=>self::$cfg->lang,
00244 'module'=>self::$cfg->module,
00245 'moduleScaffold'=>null,
00246 'action'=>self::$cfg->action,
00247 'param'=>self::$cfg->param,
00248 'text'=>self::$cfg->text,
00249 'out'=>self::$cfg->out
00250 ), self::$requestedUriInfo);
00251
00252 if (self::$cfg->forceSecure)
00253 request::forceSecure();
00254
00255 self::fixFiles();
00256 }
00257
00261 private static function fixFiles() {
00262 if (!empty($_FILES)) {
00263 $tmp = array();
00264 foreach($_FILES as $k=>$p) {
00265 if (is_array($p['name'])) {
00266 if (is_array(current($p['name']))) {
00267
00268 $tmp[$k] = array();
00269 foreach($p['name'] as $i=>$v) {
00270 foreach($v as $kk=>$vv) {
00271 $tmp[$k][$i][$kk] = array(
00272 'name'=>$vv,
00273 'type'=>$_FILES[$k]['type'][$i][$kk],
00274 'tmp_name'=>$_FILES[$k]['tmp_name'][$i][$kk],
00275 'error'=>$_FILES[$k]['error'][$i][$kk],
00276 'size'=>$_FILES[$k]['size'][$i][$kk],
00277 );
00278 }
00279 }
00280 } else {
00281
00282 $tmp[$k] = array();
00283 foreach($p['name'] as $i=>$v) {
00284 $tmp[$k][$i] = array(
00285 'name'=>$v,
00286 'type'=>$_FILES[$k]['type'][$i],
00287 'tmp_name'=>$_FILES[$k]['tmp_name'][$i],
00288 'error'=>$_FILES[$k]['error'][$i],
00289 'size'=>$_FILES[$k]['size'][$i],
00290 );
00291 }
00292 }
00293 } else
00294 $tmp[$k] = $p;
00295 }
00296 $_FILES = $tmp;
00297 }
00298 }
00299
00306 public static function parseParam($param) {
00307 $ret = array();
00308 $tmp = explode(self::$cfg->sepParam, $param);
00309 foreach($tmp as $t) {
00310 if (strpos($t, self::$cfg->sepParamSub)) {
00311 list($key, $val) = explode(self::$cfg->sepParamSub, $t);
00312 $ret[$key] = $val;
00313 } else
00314 $ret[] = $t;
00315 }
00316 return $ret;
00317 }
00318
00325 public static function createParam($param, $urlify = true) {
00326 $ret = null;
00327 if (is_array($param)) {
00328 $tmp = array();
00329 foreach($param as $key=>$val) {
00330 if ($urlify)
00331 $val = utils::urlify($val);
00332 if (!is_numeric($key))
00333 $tmp[] = $key.self::$cfg->sepParamSub.$val;
00334 else
00335 $tmp[] = $val;
00336 }
00337 $ret = implode(self::$cfg->sepParam, $tmp);
00338 } else
00339 $ret = $param;
00340
00341 return $ret;
00342 }
00343
00350 public static function forward($request) {
00351 self::$uriInfo = array_merge(self::$uriInfo, self::analyseRequest($request));
00352 self::$module = factory::getModule(self::$uriInfo['module']);
00353 return self::execModule();
00354 }
00355
00359 public static function forceSecure() {
00360 if (!self::get('secure'))
00361 response::getInstance()->redirect(str_replace('http://', 'https://', self::uriDef(array('absolute'=>1))));
00362 }
00363
00387 public static function get($get = null) {
00388 if ($get == 'uri')
00389 return self::get('domain').self::getPathControllerUri().self::get('request');
00390 if ($get == 'localUri')
00391 return self::getPathControllerUri().self::get('request');
00392 if ($get == 'pathUri')
00393 return self::getPathControllerUri().self::get('request');
00394 if ($get == 'rootUri')
00395 return self::get('domain').self::get('path');
00396 else if ($get == null)
00397 return self::$uriInfo;
00398 else
00399 return self::$uriInfo[$get];
00400 }
00401
00409 public static function getRequested($get = null) {
00410 if (is_null($get)) {
00411 $uriInfo = self::$requestedUriInfo;
00412 unset($uriInfo['paramA']);
00413 return $uriInfo;
00414 } else if (array_key_exists($get, self::$requestedUriInfo))
00415 return self::$requestedUriInfo[$get];
00416 else
00417 return null;
00418 }
00419
00426 public static function getCfg($key = null) {
00427 if ($key === null)
00428 return self::$cfg->getVars();
00429 else
00430 return self::$cfg->get($key);
00431 }
00432
00439 public static function hasPrm($key) {
00440 return array_key_exists($key, self::get('paramA'));
00441 }
00442
00450 public static function getPrm($key, $default = null) {
00451 $prmA = self::get('paramA');
00452 return array_key_exists($key, $prmA)? $prmA[$key] : $default;
00453 }
00454
00461 public static function getPathControllerUri($forceController = false) {
00462 $controller = ($forceController || self::get('pathWithController'))? self::get('controller').'/': null;
00463 return self::get('path').$controller;
00464 }
00465
00483 public static function uri($prm = array()) {
00484 if (!is_array($prm))
00485 $prm = self::uriString($prm);
00486
00487 if (self::isAbsolutizeAllUris() && !isset($prm['absolute']))
00488 $prm['absolute'] = true;
00489
00490 $sep = array_key_exists('sep', $prm)? $prm['sep'] : self::$cfg->sep;
00491
00492 $tmp = array_fill(0, 4, self::$cfg->empty);
00493
00494 if (array_key_exists('moduleScaffold', $prm) && !empty($prm['moduleScaffold']))
00495 $tmp[0] = utils::urlify($prm['moduleScaffold']);
00496 else if (array_key_exists('module', $prm) && !empty($prm['module']))
00497 $tmp[0] = utils::urlify($prm['module']);
00498
00499 if (array_key_exists('action', $prm) && !empty($prm['action']))
00500 $tmp[1] = utils::urlify($prm['action']);
00501
00502 if (array_key_exists('paramA', $prm) && is_array($prm['paramA']))
00503 $tmp[2] = self::createParam($prm['paramA'], false);
00504 else if (array_key_exists('param', $prm) && !empty($prm['param']))
00505 $tmp[2] = $prm['param'];
00506
00507 if (array_key_exists('text', $prm) && !empty($prm['text']))
00508 $tmp[3] = utils::urlify($prm['text']);
00509
00510 while(count($tmp) > 0 && (empty($tmp[count($tmp) - 1]) || $tmp[count($tmp) - 1] == self::$cfg->empty))
00511 array_pop($tmp);
00512
00513 $out = (array_key_exists('out', $prm) ?
00514 (self::isOut($prm['out'])? $prm['out'] : null)
00515 : self::getRequested('out'));
00516 if ($out) {
00517 if (false && empty($tmp))
00518 $tmp[] = self::$cfg->empty.'.'.$out;
00519 else if (!empty($tmp) && $out != self::$cfg->noOut)
00520 $tmp[count($tmp) - 1] .= '.'.$out;
00521 }
00522
00523 $forceLang = self::$cfg->forceLang ? (self::$cfg->forceLang === true ? self::$cfg->lang : self::$cfg->forceLang) : null;
00524 if (array_key_exists('lang', $prm)) {
00525 if (self::isLang($prm['lang']))
00526 array_unshift($tmp, $prm['lang']);
00527 else if ($forceLang)
00528 array_unshift($tmp, $forceLang);
00529 } else if (self::getRequested('lang'))
00530 array_unshift($tmp, self::getRequested('lang'));
00531 else if (self::$cfg->lang != self::get('lang'))
00532 array_unshift($tmp, self::get('lang'));
00533 else if ($forceLang && count($tmp))
00534 array_unshift($tmp, $forceLang);
00535 if ($forceLang && count($tmp) == 1 && $tmp[0] == $forceLang)
00536 $tmp = array();
00537
00538 $prefix = array_key_exists('absolute', $prm) && $prm['absolute']? request::get('domain') : null;
00539 $prefix.= self::get('path');
00540 if (array_key_exists('controller', $prm)) {
00541 if ($prm['controller'])
00542 array_unshift($tmp, $prm['controller']);
00543 } else if (self::get('pathWithController'))
00544 $prefix.= request::get('controller').'/';
00545
00546 foreach($tmp as &$t)
00547 $t = str_replace(array(' ', '/'), self::$cfg->empty, $t);
00548
00549 return $prefix.implode($sep, $tmp);
00550 }
00551
00559 public static function uploadedUri($file, array $prm = array()) {
00560 return self::uri(array_merge(array(
00561 'lang'=>false,
00562 'module'=>'nyroUtils',
00563 'action'=>'uploadedFiles',
00564 'param'=>str_replace(array('/', '\\'), array(request::getCfg('sepParam'), request::getCfg('sepParam')), $file),
00565 'out'=>null
00566 ), $prm));
00567 }
00568
00577 public static function uriDef(array $prm = array(), array $use = array('lang', 'module', 'action', 'param', 'out')) {
00578 $tmp = array();
00579
00580 foreach($use as $u)
00581 $tmp[$u] = self::getRequested($u);
00582
00583 return self::uri(array_merge($tmp, $prm));
00584 }
00585
00594 public static function uriString($uri) {
00595 $uriA = array_values(array_filter(explode(self::$cfg->sep, $uri)));
00596
00597 if (empty($uriA)) {
00598 if ($uri == '//')
00599 return array('controller'=>false);
00600 else if ($uri == '
00601 return array('absolute'=>true, 'controller'=>false);
00602 else
00603 return array();
00604 }
00605
00606 $tmp = array();
00607 if (strpos($uriA[0], '.php'))
00608 $tmp['controller'] = array_shift($uriA);
00609
00610 if (!empty($uriA)) {
00611 if (self::isLang($uriA[0]))
00612 $tmp['lang'] = array_shift($uriA);
00613 if (!empty($uriA)) {
00614 $last = $uriA[count($uriA)-1];
00615 if ((($pos = strrpos($last, '.')) !== false) && self::isOut($out = substr($last, $pos+1))) {
00616 $tmp['out'] = $out;
00617 $uriA[count($uriA)-1] = substr($last, 0, $pos);
00618 }
00619 $keys = array('module', 'action', 'param', 'text');
00620 $min = min(count($keys), count($uriA));
00621 $keys = array_slice($keys, 0, $min);
00622 $uriA = array_slice($uriA, 0, $min);
00623 $tmp = array_merge($tmp, array_combine($keys, $uriA));
00624 }
00625 }
00626
00627 if (substr($uri, 0, 2) == '
00628 $tmp['controller'] = false;
00629 if (substr($uri, 0, 3) == '
00630 $tmp['absolute'] = true;
00631
00632 return $tmp;
00633 }
00634
00641 public static function webUri($uri) {
00642 return (self::isAbsolutizeAllUris() ? self::get('domain') : null).self::get('path').$uri;
00643 }
00644
00650 public static function isAbsolutizeAllUris() {
00651 return self::$cfg->absolutizeAllUris;
00652 }
00653
00659 public static function getIp() {
00660 return $_SERVER['REMOTE_ADDR'];
00661 }
00662
00668 public static function isPost() {
00669 return !empty($_POST);
00670 }
00671
00677 public static function isLocal() {
00678 return self::get('serverName') == 'localhost';
00679 }
00680
00686 public static function isAjax() {
00687 return array_key_exists('HTTP_X_REQUESTED_WITH', $_SERVER);
00688 }
00689
00699 public static function isMobile($test = null) {
00700 if (self::$mobileStatus === false) {
00701 // code from http://detectmobilebrowsers.mobi/
00702 // Modified to be simpler and suite the nyroFwk need
00703 // many comments removed
00704
00705 $user_agent = $_SERVER['HTTP_USER_AGENT'];
00706 $accept = $_SERVER['HTTP_ACCEPT'];
00707 self::$mobileStatus = null;
00708
00709 switch(true) {
00710 case (preg_match('/ipad/i',$user_agent));
00711 self::$mobileStatus = 'ipad';
00712 break;
00713 case (preg_match('/ipod/i',$user_agent)||preg_match('/iphone/i',$user_agent));
00714 self::$mobileStatus = 'iphone';
00715 break;
00716 case (preg_match('/android/i',$user_agent));
00717 self::$mobileStatus = 'android';
00718 break;
00719 case (preg_match('/opera mini/i',$user_agent));
00720 self::$mobileStatus = 'opera';
00721 break;
00722 case (preg_match('/blackberry/i',$user_agent));
00723 self::$mobileStatus = 'blackberry';
00724 break;
00725 case (preg_match('/(pre\/|palm os|palm|hiptop|avantgo|plucker|xiino|blazer|elaine)/i',$user_agent));
00726 self::$mobileStatus = 'palm';
00727 break;
00728 case (preg_match('/(iris|3g_t|windows ce|opera mobi|windows ce; smartphone;|windows ce; iemobile)/i',$user_agent));
00729 self::$mobileStatus = 'windows';
00730 break;
00731 case (preg_match('/(mini 9.5|vx1000|lge |m800|e860|u940|ux840|compal|wireless| mobi|ahong|lg380|lgku|lgu900|lg210|lg47|lg920|lg840|lg370|sam-r|mg50|s55|g83|t66|vx400|mk99|d615|d763|el370|sl900|mp500|samu3|samu4|vx10|xda_|samu5|samu6|samu7|samu9|a615|b832|m881|s920|n210|s700|c-810|_h797|mob-x|sk16d|848b|mowser|s580|r800|471x|v120|rim8|c500foma:|160x|x160|480x|x640|t503|w839|i250|sprint|w398samr810|m5252|c7100|mt126|x225|s5330|s820|htil-g1|fly v71|s302|-x113|novarra|k610i|-three|8325rc|8352rc|sanyo|vx54|c888|nx250|n120|mtk |c5588|s710|t880|c5005|i;458x|p404i|s210|c5100|teleca|s940|c500|s590|foma|samsu|vx8|vx9|a1000|_mms|myx|a700|gu1100|bc831|e300|ems100|me701|me702m-three|sd588|s800|8325rc|ac831|mw200|brew |d88|htc\/|htc_touch|355x|m50|km100|d736|p-9521|telco|sl74|ktouch|m4u\/|me702|8325rc|kddi|phone|lg |sonyericsson|samsung|240x|x320|vx10|nokia|sony cmd|motorola|up.browser|up.link|mmp|symbian|smartphone|midp|wap|vodafone|o2|pocket|kindle|mobile|psp|treo)/i',$user_agent));
00732 case ((strpos($accept,'text/vnd.wap.wml')>0)||(strpos($accept,'application/vnd.wap.xhtml+xml')>0));
00733 case (isset($_SERVER['HTTP_X_WAP_PROFILE'])||isset($_SERVER['HTTP_PROFILE']));
00734 case (in_array(strtolower(substr($user_agent,0,4)),array('1207'=>'1207','3gso'=>'3gso','4thp'=>'4thp','501i'=>'501i','502i'=>'502i','503i'=>'503i','504i'=>'504i','505i'=>'505i','506i'=>'506i','6310'=>'6310','6590'=>'6590','770s'=>'770s','802s'=>'802s','a wa'=>'a wa','acer'=>'acer','acs-'=>'acs-','airn'=>'airn','alav'=>'alav','asus'=>'asus','attw'=>'attw','au-m'=>'au-m','aur '=>'aur ','aus '=>'aus ','abac'=>'abac','acoo'=>'acoo','aiko'=>'aiko','alco'=>'alco','alca'=>'alca','amoi'=>'amoi','anex'=>'anex','anny'=>'anny','anyw'=>'anyw','aptu'=>'aptu','arch'=>'arch','argo'=>'argo','bell'=>'bell','bird'=>'bird','bw-n'=>'bw-n','bw-u'=>'bw-u','beck'=>'beck','benq'=>'benq','bilb'=>'bilb','blac'=>'blac','c55/'=>'c55/','cdm-'=>'cdm-','chtm'=>'chtm','capi'=>'capi','cond'=>'cond','craw'=>'craw','dall'=>'dall','dbte'=>'dbte','dc-s'=>'dc-s','dica'=>'dica','ds-d'=>'ds-d','ds12'=>'ds12','dait'=>'dait','devi'=>'devi','dmob'=>'dmob','doco'=>'doco','dopo'=>'dopo','el49'=>'el49','erk0'=>'erk0','esl8'=>'esl8','ez40'=>'ez40','ez60'=>'ez60','ez70'=>'ez70','ezos'=>'ezos','ezze'=>'ezze','elai'=>'elai','emul'=>'emul','eric'=>'eric','ezwa'=>'ezwa','fake'=>'fake','fly-'=>'fly-','fly_'=>'fly_','g-mo'=>'g-mo','g1 u'=>'g1 u','g560'=>'g560','gf-5'=>'gf-5','grun'=>'grun','gene'=>'gene','go.w'=>'go.w','good'=>'good','grad'=>'grad','hcit'=>'hcit','hd-m'=>'hd-m','hd-p'=>'hd-p','hd-t'=>'hd-t','hei-'=>'hei-','hp i'=>'hp i','hpip'=>'hpip','hs-c'=>'hs-c','htc '=>'htc ','htc-'=>'htc-','htca'=>'htca','htcg'=>'htcg','htcp'=>'htcp','htcs'=>'htcs','htct'=>'htct','htc_'=>'htc_','haie'=>'haie','hita'=>'hita','huaw'=>'huaw','hutc'=>'hutc','i-20'=>'i-20','i-go'=>'i-go','i-ma'=>'i-ma','i230'=>'i230','iac'=>'iac','iac-'=>'iac-','iac/'=>'iac/','ig01'=>'ig01','im1k'=>'im1k','inno'=>'inno','iris'=>'iris','jata'=>'jata','java'=>'java','kddi'=>'kddi','kgt'=>'kgt','kgt/'=>'kgt/','kpt '=>'kpt ','kwc-'=>'kwc-','klon'=>'klon','lexi'=>'lexi','lg g'=>'lg g','lg-a'=>'lg-a','lg-b'=>'lg-b','lg-c'=>'lg-c','lg-d'=>'lg-d','lg-f'=>'lg-f','lg-g'=>'lg-g','lg-k'=>'lg-k','lg-l'=>'lg-l','lg-m'=>'lg-m','lg-o'=>'lg-o','lg-p'=>'lg-p','lg-s'=>'lg-s','lg-t'=>'lg-t','lg-u'=>'lg-u','lg-w'=>'lg-w','lg/k'=>'lg/k','lg/l'=>'lg/l','lg/u'=>'lg/u','lg50'=>'lg50','lg54'=>'lg54','lge-'=>'lge-','lge/'=>'lge/','lynx'=>'lynx','leno'=>'leno','m1-w'=>'m1-w','m3ga'=>'m3ga','m50/'=>'m50/','maui'=>'maui','mc01'=>'mc01','mc21'=>'mc21','mcca'=>'mcca','medi'=>'medi','meri'=>'meri','mio8'=>'mio8','mioa'=>'mioa','mo01'=>'mo01','mo02'=>'mo02','mode'=>'mode','modo'=>'modo','mot '=>'mot ','mot-'=>'mot-','mt50'=>'mt50','mtp1'=>'mtp1','mtv '=>'mtv ','mate'=>'mate','maxo'=>'maxo','merc'=>'merc','mits'=>'mits','mobi'=>'mobi','motv'=>'motv','mozz'=>'mozz','n100'=>'n100','n101'=>'n101','n102'=>'n102','n202'=>'n202','n203'=>'n203','n300'=>'n300','n302'=>'n302','n500'=>'n500','n502'=>'n502','n505'=>'n505','n700'=>'n700','n701'=>'n701','n710'=>'n710','nec-'=>'nec-','nem-'=>'nem-','newg'=>'newg','neon'=>'neon','netf'=>'netf','noki'=>'noki','nzph'=>'nzph','o2 x'=>'o2 x','o2-x'=>'o2-x','opwv'=>'opwv','owg1'=>'owg1','opti'=>'opti','oran'=>'oran','p800'=>'p800','pand'=>'pand','pg-1'=>'pg-1','pg-2'=>'pg-2','pg-3'=>'pg-3','pg-6'=>'pg-6','pg-8'=>'pg-8','pg-c'=>'pg-c','pg13'=>'pg13','phil'=>'phil','pn-2'=>'pn-2','pt-g'=>'pt-g','palm'=>'palm','pana'=>'pana','pire'=>'pire','pock'=>'pock','pose'=>'pose','psio'=>'psio','qa-a'=>'qa-a','qc-2'=>'qc-2','qc-3'=>'qc-3','qc-5'=>'qc-5','qc-7'=>'qc-7','qc07'=>'qc07','qc12'=>'qc12','qc21'=>'qc21','qc32'=>'qc32','qc60'=>'qc60','qci-'=>'qci-','qwap'=>'qwap','qtek'=>'qtek','r380'=>'r380','r600'=>'r600','raks'=>'raks','rim9'=>'rim9','rove'=>'rove','s55/'=>'s55/','sage'=>'sage','sams'=>'sams','sc01'=>'sc01','sch-'=>'sch-','scp-'=>'scp-','sdk/'=>'sdk/','se47'=>'se47','sec-'=>'sec-','sec0'=>'sec0','sec1'=>'sec1','semc'=>'semc','sgh-'=>'sgh-','shar'=>'shar','sie-'=>'sie-','sk-0'=>'sk-0','sl45'=>'sl45','slid'=>'slid','smb3'=>'smb3','smt5'=>'smt5','sp01'=>'sp01','sph-'=>'sph-','spv '=>'spv ','spv-'=>'spv-','sy01'=>'sy01','samm'=>'samm','sany'=>'sany','sava'=>'sava','scoo'=>'scoo','send'=>'send','siem'=>'siem','smar'=>'smar','smit'=>'smit','soft'=>'soft','sony'=>'sony','t-mo'=>'t-mo','t218'=>'t218','t250'=>'t250','t600'=>'t600','t610'=>'t610','t618'=>'t618','tcl-'=>'tcl-','tdg-'=>'tdg-','telm'=>'telm','tim-'=>'tim-','ts70'=>'ts70','tsm-'=>'tsm-','tsm3'=>'tsm3','tsm5'=>'tsm5','tx-9'=>'tx-9','tagt'=>'tagt','talk'=>'talk','teli'=>'teli','topl'=>'topl','hiba'=>'hiba','up.b'=>'up.b','upg1'=>'upg1','utst'=>'utst','v400'=>'v400','v750'=>'v750','veri'=>'veri','vk-v'=>'vk-v','vk40'=>'vk40','vk50'=>'vk50','vk52'=>'vk52','vk53'=>'vk53','vm40'=>'vm40','vx98'=>'vx98','virg'=>'virg','vite'=>'vite','voda'=>'voda','vulc'=>'vulc','w3c '=>'w3c ','w3c-'=>'w3c-','wapj'=>'wapj','wapp'=>'wapp','wapu'=>'wapu','wapm'=>'wapm','wig '=>'wig ','wapi'=>'wapi','wapr'=>'wapr','wapv'=>'wapv','wapy'=>'wapy','wapa'=>'wapa','waps'=>'waps','wapt'=>'wapt','winc'=>'winc','winw'=>'winw','wonu'=>'wonu','x700'=>'x700','xda2'=>'xda2','xdag'=>'xdag','yas-'=>'yas-','your'=>'your','zte-'=>'zte-','zeto'=>'zeto','acs-'=>'acs-','alav'=>'alav','alca'=>'alca','amoi'=>'amoi','aste'=>'aste','audi'=>'audi','avan'=>'avan','benq'=>'benq','bird'=>'bird','blac'=>'blac','blaz'=>'blaz','brew'=>'brew','brvw'=>'brvw','bumb'=>'bumb','ccwa'=>'ccwa','cell'=>'cell','cldc'=>'cldc','cmd-'=>'cmd-','dang'=>'dang','doco'=>'doco','eml2'=>'eml2','eric'=>'eric','fetc'=>'fetc','hipt'=>'hipt','http'=>'http','ibro'=>'ibro','idea'=>'idea','ikom'=>'ikom','inno'=>'inno','ipaq'=>'ipaq','jbro'=>'jbro','jemu'=>'jemu','java'=>'java','jigs'=>'jigs','kddi'=>'kddi','keji'=>'keji','kyoc'=>'kyoc','kyok'=>'kyok','leno'=>'leno','lg-c'=>'lg-c','lg-d'=>'lg-d','lg-g'=>'lg-g','lge-'=>'lge-','libw'=>'libw','m-cr'=>'m-cr','maui'=>'maui','maxo'=>'maxo','midp'=>'midp','mits'=>'mits','mmef'=>'mmef','mobi'=>'mobi','mot-'=>'mot-','moto'=>'moto','mwbp'=>'mwbp','mywa'=>'mywa','nec-'=>'nec-','newt'=>'newt','nok6'=>'nok6','noki'=>'noki','o2im'=>'o2im','opwv'=>'opwv','palm'=>'palm','pana'=>'pana','pant'=>'pant','pdxg'=>'pdxg','phil'=>'phil','play'=>'play','pluc'=>'pluc','port'=>'port','prox'=>'prox','qtek'=>'qtek','qwap'=>'qwap','rozo'=>'rozo','sage'=>'sage','sama'=>'sama','sams'=>'sams','sany'=>'sany','sch-'=>'sch-','sec-'=>'sec-','send'=>'send','seri'=>'seri','sgh-'=>'sgh-','shar'=>'shar','sie-'=>'sie-','siem'=>'siem','smal'=>'smal','smar'=>'smar','sony'=>'sony','sph-'=>'sph-','symb'=>'symb','t-mo'=>'t-mo','teli'=>'teli','tim-'=>'tim-','tosh'=>'tosh','treo'=>'treo','tsm-'=>'tsm-','upg1'=>'upg1','upsi'=>'upsi','vk-v'=>'vk-v','voda'=>'voda','vx52'=>'vx52','vx53'=>'vx53','vx60'=>'vx60','vx61'=>'vx61','vx70'=>'vx70','vx80'=>'vx80','vx81'=>'vx81','vx83'=>'vx83','vx85'=>'vx85','wap-'=>'wap-','wapa'=>'wapa','wapi'=>'wapi','wapp'=>'wapp','wapr'=>'wapr','webc'=>'webc','whit'=>'whit','winw'=>'winw','wmlb'=>'wmlb','xda-'=>'xda-',)));
00735 self::$mobileStatus = 'other';
00736 break;
00737 }
00738 }
00739
00740 if (!is_null(self::$mobileStatus)) {
00741 if (!is_null($test)) {
00742 if (is_array($test)) {
00743 $test = array_map('strtolower', $test);
00744 return in_array(self::$mobileStatus, $test);
00745 } else {
00746 return self::$mobileStatus == strtolower($test);
00747 }
00748 }
00749 return true;
00750 }
00751 return false;
00752 }
00753
00759 public static function isScaffolded() {
00760 return self::$scaffold;
00761 }
00762
00771 public static function extractGet(&$request, $affectGet = false) {
00772 $req = explode('?', $request);
00773 $request = $req[0];
00774 $get = array_key_exists(1, $req) ? $req[1] : null;
00775 $ret = array();
00776 if ($get) {
00777 $tmp = array_filter(explode('&', $get));
00778 foreach($tmp as $elm) {
00779 if (strpos($elm, '=')) {
00780 list($name, $val) = explode('=', $elm);
00781 $ret[$name] = $val;
00782 if ($affectGet)
00783 $_GET[$name] = $val;
00784 }
00785 }
00786 }
00787 return $ret;
00788 }
00789
00797 public static function analyseRequest($request, $alias = true) {
00798 if ($alias)
00799 $request = self::alias($request);
00800 else
00801 $request = trim($request, self::$cfg->sep);
00802
00803 $ret = array();
00804
00805 $out = strtolower(file::getExt($request));
00806 if ($out && self::isOut($out)) {
00807 $ret['out'] = $out;
00808 $request = substr($request, 0, strlen($request) - (strlen($out) + 1));
00809 }
00810
00811 $tmp = explode(self::$cfg->sep, $request);
00812 if (self::isLang($tmp[0]))
00813 $ret['lang'] = array_shift($tmp);
00814
00815 if (($t = array_shift($tmp)) && $t != self::$cfg->empty)
00816 $ret['module'] = $t;
00817
00818 if (($t = array_shift($tmp)) && $t != self::$cfg->empty)
00819 $ret['action'] = $t;
00820
00821 $ret['paramA'] = array();
00822 if (($t = array_shift($tmp)) && $t != self::$cfg->empty) {
00823 $ret['param'] = $t;
00824 $ret['paramA'] = self::parseParam($ret['param']);
00825 }
00826
00827 if (($t = array_shift($tmp)) && $t != self::$cfg->empty)
00828 $ret['text'] = $t;
00829
00830 return $ret;
00831 }
00832
00839 public static function alias($request) {
00840 if (substr($request, 0, 1) != '/')
00841 $request = '/'.$request;
00842 foreach(self::$cfg->alias as $k=>$v) {
00843 $req = preg_replace('`^'.$k.'$`', $v, $request);
00844 if ($req != $request)
00845 return substr($req, 1);
00846 }
00847 return substr($request, 1);
00848 }
00849
00856 public static function removeLangOutUrl($request) {
00857 return preg_replace('`(.*)(\.'.implode('|\.', array_keys(self::$cfg->outCfg)).')`', '$1',
00858 preg_replace('`(/'.implode('|/', self::avlLang()).')?(/.*)`', '$2', $request));
00859 }
00860
00864 private static function initModule() {
00865 if (!self::$module) {
00866 self::$module = factory::getModule(self::$uriInfo['module'], array(), self::$scaffold, self::$cfg->allowScaffold);
00867 if (self::$module instanceof module_scaffold_controller && !self::$cfg->allowScaffold) {
00868 // Need to test if the action was expressly defined
00869 $ref = new nReflection();
00870 $className = 'module_'.self::$uriInfo['module'].'_controller';
00871
00872 $prefix = null;
00873 $action = self::$uriInfo['action'];
00874 if (array_key_exists(NYROENV, self::$module->getCfg()->basicPrefixExec) &&
00875 in_array($action, self::$module->getCfg()->getInArray('basicPrefixExec', NYROENV)))
00876 $prefix = ucfirst(NYROENV);
00877 else if (self::$module->getCfg()->prefixExec && !in_array($action, self::$module->getCfg()->noPrefixExec))
00878 $prefix = self::$module->getCfg()->prefixExec;
00879
00880 $exec = 'exec'.$prefix.ucFirst($action);
00881 if ($ref->rebuild($className)) {
00882 if ($ref->getMethod($exec)->getDeclaringClass()->name != $className)
00883 throw new module_exception('Request - initModule: '.self::$uriInfo['module'].'.'.$exec.' not found.');
00884 }
00885 }
00886 if (self::$scaffold) {
00887 self::$uriInfo['moduleScaffold'] = self::$uriInfo['module'];
00888 self::$uriInfo['module'] = 'scaffold';
00889 }
00890 }
00891 }
00892
00898 public static function getModule() {
00899 self::initModule();
00900 return self::$module;
00901 }
00902
00908 public static function execModule() {
00909 self::initModule();
00910 return self::$module->exec(self::$uriInfo);
00911 }
00912
00918 public static function publishModule() {
00919 self::initModule();
00920 return self::$module->publish();
00921 }
00922
00929 public static function isLang($lang) {
00930 return in_array($lang, self::avlLang());
00931 }
00932
00939 public static function avlLang($withName = false) {
00940 if ($withName)
00941 return self::$cfg->avlLang;
00942 return array_keys(self::$cfg->avlLang);
00943 }
00944
00950 public static function getDefaultLang() {
00951 return self::$cfg->lang;
00952 }
00953
00960 public static function isOut($out) {
00961 return $out && array_key_exists($out, self::$cfg->outCfg);
00962 }
00963
00969 public static function getResponseName() {
00970 return self::get('out') ? self::$cfg->outCfg[self::get('out')] : 'http';
00971 }
00972
00973 }