Index: branches/5.2.x/core/kernel/managers/plain_url_processor.php =================================================================== diff -u -N -r15137 -r15165 --- branches/5.2.x/core/kernel/managers/plain_url_processor.php (.../plain_url_processor.php) (revision 15137) +++ branches/5.2.x/core/kernel/managers/plain_url_processor.php (.../plain_url_processor.php) (revision 15165) @@ -1,295 +1,295 @@ - $this->manager->getTemplateName()); - } - - $vars = Array (); - $more_vars = strpos($env_var, '&'); - - if ( $more_vars !== false ) { - parse_str(substr($env_var, $more_vars + 1), $vars); - $env_var = substr($env_var, 0, $more_vars); - } - - // replace escaped ":" symbol not to explode by it - $env_var = str_replace('\:', '_&+$$+&_', $env_var); // replace escaped "=" with spec-chars :) - $parts = explode(':', $env_var); - - if ( !$this->Application->RewriteURLs() || ($this->Application->RewriteURLs() && $this->Application->GetVar('rewrite') != 'on') ) { - $vars = array_merge($vars, $this->extractSIDAndTemplate($parts)); - } - - if ( $parts ) { - $passed = Array (); - - foreach ($parts as $mixed_part) { - list ($passed[], $processed_vars) = $this->_parseEnvPart($mixed_part); - $vars = array_merge($vars, $processed_vars); - } - - $vars[$pass_name] = implode(',', array_unique($passed)); - } - - return $vars; - } - - /** - * Retrieves SessionID and current template from given ENV parts - * - * @param Array $parts - * @return array - * @access protected - */ - protected function extractSIDAndTemplate(&$parts) - { - $template = ''; - $vars = Array (); - - if ( preg_match('/^([\d]+|)-(.*)$/', $parts[0], $regs) ) { - // first "env" component matches "sid-template" format - // (will be false, when mod-rewrite url to home page is built) - $sid = $regs[1]; - $template = $regs[2]; - array_shift($parts); - - if ( $sid ) { - // Save Session ID - $this->Application->SetVar('sid', $sid); - $vars['sid'] = $sid; - } - } - - // Save Template Name - $vars['t'] = $this->manager->getTemplateName($template); - - return $vars; - } - - /** - * Converts environment part into variable array (based on query map for given prefix) - * - * @param string $mixed_part - * @return Array - * @access protected - */ - protected function _parseEnvPart($mixed_part) - { - // In-portal old style env conversion - adds '-' between prefix and first var - $mixed_part = str_replace('_&+$$+&_', ':', $mixed_part); - $mixed_part = preg_replace("/^([a-zA-Z]+)([0-9]+)-(.*)/", "$1-$2-$3", $mixed_part); - - // replace escaped "-" symbol not to explode by it - $escaped_part = str_replace('\-', '_&+$$+&_', $mixed_part); - $escaped_part = explode('-', $escaped_part); - - $mixed_part = Array(); - foreach ($escaped_part as $escaped_val) { - $mixed_part[] = str_replace('_&+$$+&_', '-', $escaped_val); - } - - $vars = Array (); - $prefix_special = array_shift($mixed_part); // l.pick, l - - $http_query = $this->Application->recallObject('HTTPQuery'); - /* @var $http_query kHTTPQuery */ - - $query_map = $http_query->discoverUnit($prefix_special); // from $_GET['env'] - - // if config is not defined for prefix in QueryString, then don't process it - if ($query_map) { - foreach ($query_map as $index => $var_name) { - // l_id, l_page, l_bla-bla-bla - $val = $mixed_part[$index - 1]; - if ($val == '') $val = false; - $vars[$prefix_special.'_'.$var_name] = $val; - } - } - - return Array ($prefix_special, $vars); - } - - /** - * Builds url - * - * @param string $t - * @param Array $params - * @param string $pass - * @param bool $pass_events - * @param bool $env_var - * @return string - * @access public - */ - public function build($t, $params, $pass='all', $pass_events = false, $env_var = true) - { - if ( $this->Application->GetVar('admin') || (array_key_exists('admin', $params) && $params['admin']) ) { - $params['admin'] = 1; - - if ( !array_key_exists('editing_mode', $params) ) { - $params['editing_mode'] = EDITING_MODE; - } - } - - $session = $this->Application->recallObject('Session'); - /* @var $session Session */ - - $ssl = isset($params['__SSL__']) ? $params['__SSL__'] : 0; - $sid = $session->NeedQueryString() && !$this->Application->RewriteURLs($ssl) ? $this->Application->GetSID() : ''; - - $ret = ''; - if ( $env_var ) { - $ret = ENV_VAR_NAME . '='; - } - - $ret .= $sid . '-'; // SID-TEMPLATE - - $encode = false; - if ( isset($params['__URLENCODE__']) ) { - $encode = $params['__URLENCODE__']; - unset($params['__URLENCODE__']); - } - - if ( isset($params['__SSL__']) ) { - unset($params['__SSL__']); - } - - $env_string = ''; - $category_id = isset($params['m_cat_id']) ? $params['m_cat_id'] : $this->Application->GetVar('m_cat_id'); - - $item_id = false; - $pass_info = $this->getPassInfo($pass); - - if ( $pass_info ) { - if ( $pass_info[0] == 'm' ) { - array_shift($pass_info); - } - - foreach ($pass_info as $pass_element) { - list($prefix) = explode('.', $pass_element); - $require_rewrite = $this->Application->findModule('Var', $prefix); - - if ( $require_rewrite ) { - $item_id = isset($params[$pass_element . '_id']) ? $params[$pass_element . '_id'] : $this->Application->GetVar($pass_element . '_id'); - } - - $env_string .= ':' . $this->BuildModuleEnv($pass_element, $params, $pass_events); - } - } - - if ( strtolower($t) == '__default__' ) { - if ( is_numeric($item_id) ) { - $this->manager->initRewrite(); - $t = $this->manager->rewrite->GetItemTemplate($category_id, $pass_element); // $pass_element should be the last processed element - // $t = $this->Application->getCategoryCache($category_id, 'item_templates'); - } - elseif ( $category_id ) { - $t = strtolower(preg_replace('/^Content\//i', '', $this->Application->getCategoryCache($category_id, 'filenames'))); - } - else { - $t = 'index'; - } - } - - $ret .= $t . ':' . $this->BuildModuleEnv('m', $params, $pass_events) . $env_string; - - unset($params['pass'], $params['opener'], $params['m_event']); - - if ( array_key_exists('escape', $params) && $params['escape'] ) { - $ret = addslashes($ret); - unset($params['escape']); - } - - if ( $params ) { - $params_str = ''; - $join_string = $encode ? '&' : '&'; - - foreach ($params as $param => $value) { - $params_str .= $join_string . $param . '=' . $value; - } - - $ret .= $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 - * @return string - * @access public - */ - public function BuildModuleEnv($prefix_special, &$params, $pass_events = false) - { - list($prefix) = explode('.', $prefix_special); - $query_vars = $this->Application->getUnitOption($prefix, 'QueryString', Array ()); - /* @var $query_vars Array */ - - //if pass events is off and event is not implicitly 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->Application->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->Application->getUnitOption($prefix, 'PortalStyleEnv') == true ) { - $ret = preg_replace('/^([a-zA-Z]+)-([0-9]+)-(.*)/', '\\1\\2-\\3', $ret); - } - - return $ret; - } + $this->manager->getTemplateName()); + } + + $vars = Array (); + $more_vars = strpos($env_var, '&'); + + if ( $more_vars !== false ) { + parse_str(substr($env_var, $more_vars + 1), $vars); + $env_var = substr($env_var, 0, $more_vars); + } + + // replace escaped ":" symbol not to explode by it + $env_var = str_replace('\:', '_&+$$+&_', $env_var); // replace escaped "=" with spec-chars :) + $parts = explode(':', $env_var); + + if ( !$this->Application->RewriteURLs() || ($this->Application->RewriteURLs() && $this->Application->GetVar('rewrite') != 'on') ) { + $vars = array_merge($vars, $this->extractSIDAndTemplate($parts)); + } + + if ( $parts ) { + $passed = Array (); + + foreach ($parts as $mixed_part) { + list ($passed[], $processed_vars) = $this->_parseEnvPart($mixed_part); + $vars = array_merge($vars, $processed_vars); + } + + $vars[$pass_name] = implode(',', array_unique($passed)); + } + + return $vars; + } + + /** + * Retrieves SessionID and current template from given ENV parts + * + * @param Array $parts + * @return array + * @access protected + */ + protected function extractSIDAndTemplate(&$parts) + { + $template = ''; + $vars = Array (); + + if ( preg_match('/^([\d]+|)-(.*)$/', $parts[0], $regs) ) { + // first "env" component matches "sid-template" format + // (will be false, when mod-rewrite url to home page is built) + $sid = $regs[1]; + $template = $regs[2]; + array_shift($parts); + + if ( $sid ) { + // Save Session ID + $this->Application->SetVar('sid', $sid); + $vars['sid'] = $sid; + } + } + + // Save Template Name + $vars['t'] = $this->manager->getTemplateName($template); + + return $vars; + } + + /** + * Converts environment part into variable array (based on query map for given prefix) + * + * @param string $mixed_part + * @return Array + * @access protected + */ + protected function _parseEnvPart($mixed_part) + { + // In-portal old style env conversion - adds '-' between prefix and first var + $mixed_part = str_replace('_&+$$+&_', ':', $mixed_part); + $mixed_part = preg_replace("/^([a-zA-Z]+)([0-9]+)-(.*)/", "$1-$2-$3", $mixed_part); + + // replace escaped "-" symbol not to explode by it + $escaped_part = str_replace('\-', '_&+$$+&_', $mixed_part); + $escaped_part = explode('-', $escaped_part); + + $mixed_part = Array(); + foreach ($escaped_part as $escaped_val) { + $mixed_part[] = str_replace('_&+$$+&_', '-', $escaped_val); + } + + $vars = Array (); + $prefix_special = array_shift($mixed_part); // l.pick, l + + $http_query = $this->Application->recallObject('HTTPQuery'); + /* @var $http_query kHTTPQuery */ + + $query_map = $http_query->discoverUnit($prefix_special); // from $_GET['env'] + + // if config is not defined for prefix in QueryString, then don't process it + if ($query_map) { + foreach ($query_map as $index => $var_name) { + // l_id, l_page, l_bla-bla-bla + $val = $mixed_part[$index - 1]; + if ($val == '') $val = false; + $vars[$prefix_special.'_'.$var_name] = $val; + } + } + + return Array ($prefix_special, $vars); + } + + /** + * Builds url + * + * @param string $t + * @param Array $params + * @param string $pass + * @param bool $pass_events + * @param bool $env_var + * @return string + * @access public + */ + public function build($t, $params, $pass='all', $pass_events = false, $env_var = true) + { + if ( $this->Application->GetVar('admin') || (array_key_exists('admin', $params) && $params['admin']) ) { + $params['admin'] = 1; + + if ( !array_key_exists('editing_mode', $params) ) { + $params['editing_mode'] = EDITING_MODE; + } + } + + $session = $this->Application->recallObject('Session'); + /* @var $session Session */ + + $ssl = isset($params['__SSL__']) ? $params['__SSL__'] : 0; + $sid = $session->NeedQueryString() && !$this->Application->RewriteURLs($ssl) ? $this->Application->GetSID() : ''; + + $ret = ''; + if ( $env_var ) { + $ret = ENV_VAR_NAME . '='; + } + + $ret .= $sid . '-'; // SID-TEMPLATE + + $encode = false; + if ( isset($params['__URLENCODE__']) ) { + $encode = $params['__URLENCODE__']; + unset($params['__URLENCODE__']); + } + + if ( isset($params['__SSL__']) ) { + unset($params['__SSL__']); + } + + $env_string = ''; + $category_id = isset($params['m_cat_id']) ? $params['m_cat_id'] : $this->Application->GetVar('m_cat_id'); + + $item_id = false; + $pass_info = $this->getPassInfo($pass); + + if ( $pass_info ) { + if ( $pass_info[0] == 'm' ) { + array_shift($pass_info); + } + + foreach ($pass_info as $pass_element) { + list($prefix) = explode('.', $pass_element); + $require_rewrite = $this->Application->findModule('Var', $prefix); + + if ( $require_rewrite ) { + $item_id = isset($params[$pass_element . '_id']) ? $params[$pass_element . '_id'] : $this->Application->GetVar($pass_element . '_id'); + } + + $env_string .= ':' . $this->BuildModuleEnv($pass_element, $params, $pass_events); + } + } + + if ( strtolower($t) == '__default__' ) { + if ( is_numeric($item_id) ) { + $this->manager->initRewrite(); + $t = $this->manager->rewrite->GetItemTemplate($category_id, $pass_element); // $pass_element should be the last processed element + // $t = $this->Application->getCategoryCache($category_id, 'item_templates'); + } + elseif ( $category_id ) { + $t = strtolower(preg_replace('/^Content\//i', '', $this->Application->getCategoryCache($category_id, 'filenames'))); + } + else { + $t = 'index'; + } + } + + $ret .= $t . ':' . $this->BuildModuleEnv('m', $params, $pass_events) . $env_string; + + unset($params['pass'], $params['opener'], $params['m_event']); + + if ( array_key_exists('escape', $params) && $params['escape'] ) { + $ret = addslashes($ret); + unset($params['escape']); + } + + if ( $params ) { + $params_str = ''; + $join_string = $encode ? '&' : '&'; + + foreach ($params as $param => $value) { + $params_str .= $join_string . $param . '=' . $value; + } + + $ret .= $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 + * @return string + * @access public + */ + public function BuildModuleEnv($prefix_special, &$params, $pass_events = false) + { + list($prefix) = explode('.', $prefix_special); + $query_vars = $this->Application->getUnitOption($prefix, 'QueryString', Array ()); + /* @var $query_vars Array */ + + //if pass events is off and event is not implicitly 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->Application->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->Application->getUnitOption($prefix, 'PortalStyleEnv') == true ) { + $ret = preg_replace('/^([a-zA-Z]+)-([0-9]+)-(.*)/', '\\1\\2-\\3', $ret); + } + + return $ret; + } } \ No newline at end of file