HTTPQuery =& $this->Application->recallObject('HTTPQuery'); } function processRewriteURL() { // directory_1_2_3/sc1/inlink/detail/3/l1_ka_asd.html $url = $this->HTTPQuery->Get('_mod_rw_url_'); if( substr($url, -5) == '.html' ) $url = substr($url, 0, strlen($url) - 5 ); $url_parts = $url ? explode('/', $url) : Array(); $process_module = true; if($this->HTTPQuery->Get('rewrite') == 'on' || !$url_parts) { // set default values $defaults = Array('m_cat_id' => 0, 'm_cat_page' => 1, 'm_opener' => 's'); foreach ($defaults as $default_key => $default_value) { if ($this->HTTPQuery->Get($default_key) == null) { $this->HTTPQuery->Set($default_key, $default_value); } } } if(!$url_parts) { $this->Application->Phrases = new PhrasesCache(); $this->Application->VerifyLanguageId(); $this->Application->Phrases->Init('phrases'); $this->Application->VerifyThemeId(); $this->HTTPQuery->Set('t', $this->HTTPQuery->getDefaultTemplate('') ); $this->HTTPQuery->finalizeParsing(Array('m')); return false; } else { $this->HTTPQuery->Set('t', ''); } $url_part = array_shift($url_parts); // match language $sql = 'SELECT LanguageId FROM '.TABLE_PREFIX.'Language WHERE LOWER(PackName) = '.$this->Conn->qstr($url_part).' AND Enabled = 1'; $language_id = $this->Conn->GetOne($sql); $this->Application->Phrases = new PhrasesCache(); if($language_id) { $this->HTTPQuery->Set('m_lang', $language_id); $url_part = $url_parts ? array_shift($url_parts) : ''; // prepare next url part for parsing } $this->Application->VerifyLanguageId(); // $this->HTTPQuery->Get('m_lang') ); // match theme if($url_part) { $sql = 'SELECT ThemeId FROM '.TABLE_PREFIX.'Theme WHERE LOWER(Name) = '.$this->Conn->qstr($url_part).' AND Enabled = 1'; $theme_id = $this->Conn->GetOne($sql); if($theme_id) { $this->HTTPQuery->Set('m_theme', $theme_id); $url_part = $url_parts ? array_shift($url_parts) : ''; // prepare next url part for parsing } } $this->Application->VerifyThemeId(); // verify anyway - will set default if not found!!! // match category $category_id = 0; if($url_part) { $category_stack = Array(); $category_found = false; $category_path = ''; $rets = Array(); // just in case someone has used this variable before do { $category_path = trim($category_path.'/'.$url_part, '/'); if( preg_match('/(.*)_([\d]+)$/', $category_path, $rets) ) { $category_path = $rets[1]; $this->HTTPQuery->Set('m_cat_page', $rets[2]); } if ($category_path == '') { // this is "Home" virtual category array_push($category_stack, 0); } else { $sql = 'SELECT CategoryId FROM '.TABLE_PREFIX.'Category WHERE NamedParentPath = '.$this->Conn->qstr($category_path); array_push($category_stack, $this->Conn->GetOne($sql) ); } $category_found = end($category_stack); if ($category_found !== false) $url_part = array_shift($url_parts); }while ($category_found && $url_part); if (count($category_stack)) { $category_id = array_pop($category_stack); // remove last not found category if($category_id === false) { $category_id = array_pop($category_stack); } if($category_id !== false) { $this->HTTPQuery->Set('m_cat_id', $category_id); } } elseif (!$category_found && getArrayValue($rets, 2)) { $url_part = array_shift($url_parts); } } if (!$url_part) { // no more parts left in url $process_module = false; $sql = 'SELECT CachedCategoryTemplate FROM '.TABLE_PREFIX.'Category WHERE CategoryId = '.$category_id; $category_template = $this->Conn->GetOne($sql); if ($category_template) { $category_template = explode('/', $category_template); $url_part = array_shift($category_template); $url_parts = $category_template; } else { $url_part = 'index'; } } elseif ($url_part && count($url_parts) <= 1 && $category_id) { // only filename left, no other parts $process_module = false; $sql = 'SELECT ParentPath, CachedItemTemplate, CachedCategoryTemplate FROM '.TABLE_PREFIX.'Category WHERE CategoryId = '.$category_id; $category_data = $this->Conn->GetRow($sql); $root_category_id = array_shift( explode('|', substr($category_data['ParentPath'], 1, -1)) ); $module_info = $this->Application->findModule('RootCat', $root_category_id); if ($module_info) { $module_prefix = $module_info['Var']; $module_event = new kEvent($module_prefix.':ParseEnv', Array('url_parts' => array_merge(Array($url_part), $url_parts)) ); $this->Application->HandleEvent($module_event); if ($module_event->status == erSUCCESS && $this->HTTPQuery->Get($module_prefix.'_id')) { $item_template = $category_data['CachedItemTemplate']; if ($item_template) { $url_parts = explode('/', $item_template); array_push($url_parts, $url_part); // save item's filename as not processed $url_part = array_shift($url_parts); } } elseif (!$module_event->getEventParam('url_parts')) { // parseEnv has processed that param $url_part = ''; $category_template = $category_data['CachedCategoryTemplate']; if ($category_template) { $category_template = explode('/', $category_template); $url_part = array_shift($category_template); $url_parts = $category_template; } else { $url_part = 'index'; } } } } // match module $next_template = $this->HTTPQuery->Get('next_template'); if($url_part || $next_template) { if($next_template) { $next_template_parts = explode('/', $next_template); $module_folder = array_shift($next_template_parts); } else { $module_folder = $url_part; } foreach ($this->Application->ModuleInfo as $module_name => $module_data) { if( trim($module_data['TemplatePath'], '/') == $module_folder ) { $module_prefix = $module_data['Var']; break; } } } // match template $template_path = ''; $template_found = false; if($url_part) { // search for template in real template records array_unshift($url_parts, $url_part); $template_parts = $url_parts; $url_parts = Array(); do { $template_path = implode('/', $template_parts); $t_parts['path'] = dirname($template_path) == '.' ? '' : '/'.dirname($template_path); $t_parts['file'] = basename($template_path); $sql = 'SELECT FileId FROM '.TABLE_PREFIX.'ThemeFiles WHERE (FilePath = '.$this->Conn->qstr($t_parts['path']).') AND (FileName = '.$this->Conn->qstr($t_parts['file'].'.tpl').')'; // $sql = 'SELECT FileId FROM '.TABLE_PREFIX.'ThemeFiles WHERE CONCAT(FilePath, "/", FileName) = '.$this->Conn->qstr('/'.$template_path.'.tpl'); $template_found = $this->Conn->GetOne($sql); if(!$template_found) { array_unshift( $url_parts, array_pop($template_parts) ); } }while (!$template_found && $template_parts); // try to find template in virtual templates in case if such ability exists if ($this->Application->isModuleEnabled('In-CMS') && !$template_found) { $template_parts = $url_parts; $url_parts = Array(); do { $template_path = implode('/', $template_parts); $sql = 'SELECT PageId FROM '.TABLE_PREFIX.'Pages WHERE Path = '.$this->Conn->qstr($template_path); $template_found = $this->Conn->GetOne($sql); if(!$template_found) { array_unshift( $url_parts, array_pop($template_parts) ); } }while (!$template_found && $template_parts); } } // guess template if no existing template found if(!$template_found && isset($module_folder) && $module_folder) { // 1. try index template of module $sql = 'SELECT FileId FROM '.TABLE_PREFIX.'ThemeFiles WHERE CONCAT(FilePath, "/", FileName) = '.$this->Conn->qstr('/'.$module_folder.'/index.tpl'); $template_found = $this->Conn->GetOne($sql); if($template_found) { $template_path = $module_folder.'/index'; array_shift($url_parts); } else { // 2. return error template then $template_found = true; $template_path = $this->Application->ConfigValue('ErrorTemplate'); if(!$template_path) $template_path = 'error_notfound'; header('HTTP/1.0 404 Not Found'); } } $this->HTTPQuery->Set('t', $this->HTTPQuery->getDefaultTemplate($template_found ? $template_path : '') ); // pass params left to module $this->Application->Phrases->Init('phrases'); $passed = Array('m'); $module_params = Array(); if ( isset($module_prefix) ) { $passed[] = $module_prefix; $module_event = new kEvent($module_prefix.':ParseEnv', Array('url_parts' => $url_parts) ); if ($process_module) { $this->Application->HandleEvent($module_event); } $item_id = $this->HTTPQuery->Get($module_prefix.'_id'); $module_params = Array($module_prefix.'_id' => $item_id ? $item_id : '0' ); if ($module_event->status == erFAIL) { $not_found = $this->Application->ConfigValue('ErrorTemplate'); $this->HTTPQuery->Set('t', $not_found ? $not_found : 'error_notfound' ); } } $this->HTTPQuery->finalizeParsing($passed, $module_params); } } ?>