Index: trunk/core/kernel/application.php =================================================================== diff -u -r3177 -r3181 --- trunk/core/kernel/application.php (.../application.php) (revision 3177) +++ trunk/core/kernel/application.php (.../application.php) (revision 3181) @@ -125,6 +125,27 @@ } /** + * Returns module information. Searches module by requested field + * + * @param string $field + * @param mixed $value + * @return Array + */ + function findModule($field, $value) + { + $found = false; + foreach ($this->ModuleInfo as $module_name => $module_info) + { + if ($module_info[$field] == $value) + { + $found = true; + break; + } + } + return $found ? $module_info : false; + } + + /** * Initializes the Application * * @access public @@ -792,7 +813,7 @@ { $session =& $this->recallObject('Session'); if( $session->NeedQueryString() ) $params['sid'] = $this->GetSID(); - $url = $this->BuildEnv_NEW($t, $params, $pass, $pass_events, false); + $url = $this->BuildEnv_NEW($t, $params, $pass, $pass_events); $ret = $this->BaseURL($prefix, $ssl).$url.$map_link; } @@ -805,19 +826,15 @@ return $ret; } - function BuildEnv_NEW($t, $params, $pass='all', $pass_events=false, $env_var=true) + function BuildEnv_NEW($t, $params, $pass = 'all', $pass_events = false) { $session =& $this->recallObject('Session'); $force_admin = getArrayValue($params,'admin') || $this->GetVar('admin'); if($force_admin) $sid = $this->GetSID(); $ret = ''; - /*if ($env_var) { - $ret = ENV_VAR_NAME.'='; - } - $ret .= defined('INPORTAL_ENV') ? $sid.'-'.$t : $sid.':'.$t; - */ + $env = ''; $encode = false; if (isset($params['__URLENCODE__'])) @@ -834,13 +851,24 @@ $event_params = Array('t' => $t, 'pass_events' => $pass_events); foreach($pass_info as $pass_element) { - $event_params['url_params'] = $params; - $event = new kEvent($pass_element.':BuildEnv', $event_params); - $this->HandleEvent($event); - $ret .= '/'.trim( $event->getEventParam('env_string'), '/'); - $params = $event->getEventParam('url_params'); // save back unprocessed parameters + list($prefix) = explode('.', $pass_element); + $require_rewrite = $this->findModule('Var', $prefix); + if($require_rewrite) + { + $event_params['url_params'] = $params; + $event = new kEvent($pass_element.':BuildEnv', $event_params); + $this->HandleEvent($event); + $ret .= '/'.trim( $event->getEventParam('env_string'), '/'); + $params = $event->getEventParam('url_params'); // save back unprocessed parameters + } + else + { + $env .= ':'.$this->BuildModuleEnv($pass_element, $params, $pass_events); + } } + $ret = trim($ret, '/').'.html'; + if($env) $params[ENV_VAR_NAME] = ltrim($env, ':'); } unset($params['pass'], $params['opener'], $params['m_event']); @@ -852,15 +880,64 @@ unset($params['escape']); } + /*if( count($params) > 1 ) + { + echo ''; + }*/ + + $params_str = ''; foreach ($params as $param => $value) { - $ret .= '&'.$param.'='.$value; + $params_str .= '&'.$param.'='.$value; } - + $ret .= preg_replace('/^&(.*)/', '?\\1', $params_str); + if ($encode) $ret = str_replace('\\', '%5C', $ret); return $ret; } + /** + * Builds env part that corresponds prefix passed + * + * @param string $prefix_special item's prefix & [special] + * @param Array $params url params + * @param bool $pass_events + */ + function BuildModuleEnv($prefix_special, &$params, $pass_events = false) + { + list($prefix) = explode('.', $prefix_special); + $query_vars = $this->getUnitOption($prefix, 'QueryString'); + + //if pass events is off and event is not implicity passed + if( !$pass_events && !isset($params[$prefix_special.'_event']) ) { + $params[$prefix_special.'_event'] = ''; // remove event from url if requested + //otherwise it will use value from get_var + } + + if(!$query_vars) return ''; + + $tmp_string = Array(0 => $prefix_special); + foreach($query_vars as $index => $var_name) + { + //if value passed in params use it, otherwise use current from application + $var_name = $prefix_special.'_'.$var_name; + $tmp_string[$index] = isset( $params[$var_name] ) ? $params[$var_name] : $this->GetVar($var_name); + if ( isset($params[$var_name]) ) unset( $params[$var_name] ); + } + + $escaped = array(); + foreach ($tmp_string as $tmp_val) { + $escaped[] = str_replace(Array('-',':'), Array('\-','\:'), $tmp_val); + } + + $ret = implode('-', $escaped); + if ($this->getUnitOption($prefix, 'PortalStyleEnv') == true) + { + $ret = preg_replace('/^([a-zA-Z]+)-([0-9]+)-(.*)/','\\1\\2-\\3', $ret); + } + return $ret; + } + function BuildEnv($t, $params, $pass='all', $pass_events=false, $env_var=true) { $session =& $this->recallObject('Session'); @@ -886,40 +963,7 @@ $pass_info = array_unique( explode(',',$pass) ); // array( prefix[.special], prefix[.special] ... foreach($pass_info as $pass_element) { - $ret.=':'; - list($prefix)=explode('.',$pass_element); - $query_vars = $this->getUnitOption($prefix,'QueryString'); - - //if pass events is off and event is not implicity passed - if(!$pass_events && !isset($params[$pass_element.'_event'])) { - $params[$pass_element.'_event'] = ''; // remove event from url if requested - //otherwise it will use value from get_var - } - - if($query_vars) - { - $tmp_string=Array(0=>$pass_element); - foreach($query_vars as $index => $var_name) - { - //if value passed in params use it, otherwise use current from application - $tmp_string[$index] = isset( $params[$pass_element.'_'.$var_name] ) ? $params[$pass_element.'_'.$var_name] : $this->GetVar($pass_element.'_'.$var_name); - if ( isset($params[$pass_element.'_'.$var_name]) ) { - unset( $params[$pass_element.'_'.$var_name] ); - } - } - - $escaped = array(); - foreach ($tmp_string as $tmp_val) { - $escaped[] = str_replace(Array('-',':'), Array('\-','\:'), $tmp_val); - } - - if ($this->getUnitOption($prefix, 'PortalStyleEnv') == true) { - $ret.= array_shift($escaped).array_shift($escaped).'-'.implode('-',$escaped); - } - else { - $ret.=implode('-',$escaped); - } - } + $ret .= ':'.$this->BuildModuleEnv($pass_element, $params, $pass_events); } } unset($params['pass']); Index: trunk/core/kernel/event_handler.php =================================================================== diff -u -r3178 -r3181 --- trunk/core/kernel/event_handler.php (.../event_handler.php) (revision 3178) +++ trunk/core/kernel/event_handler.php (.../event_handler.php) (revision 3181) @@ -150,11 +150,12 @@ { $prefix_special = $event->getPrefixSpecial(); $url_params = $event->getEventParam('url_params'); + $pass_events = $event->getEventParam('pass_events'); $query_vars = $this->Application->getUnitOption($event->Prefix, 'QueryString'); // unset( $query_vars[ array_search('event', $query_vars) ] ); //if pass events is off and event is not implicity passed - if ( !$event->getEventParam('pass_events') && !isset($url_params[$prefix_special.'_event']) ) + if ( !$pass_events && !isset($url_params[$prefix_special.'_event']) ) { unset($url_params[$prefix_special.'_event']); // remove event from url if requested //otherwise it will use value from get_var