HTTPQuery =& $this->Application->recallObject('HTTPQuery'); } function SetDefaultValues() { $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); } } } function ProcessLanguage(&$url_parts) { if (!isset($url_parts[0])) return false; $res = false; $url_part = array_shift($url_parts); $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); $res = true; } $this->Application->VerifyLanguageId(); if (!$res) { array_unshift($url_parts, $url_part); } return $res; } function ProcessTheme(&$url_parts) { if (!isset($url_parts[0])) return false; $res = false; $url_part = array_shift($url_parts); $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); $res = true; } $this->Application->VerifyThemeId(); // verify anyway - will set default if not found!!! if (!$res) { array_unshift($url_parts, $url_part); } return $res; } function ProcessCategory(&$url_parts) { if (!isset($url_parts[0])) return false; $res = false; $url_part = array_shift($url_parts); $category_id = 0; $last_category_id = 0; $category_path = ''; 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]); } $category_id = $this->Conn->GetOne( 'SELECT CategoryId FROM '.TABLE_PREFIX.'Category WHERE NamedParentPath = '.$this->Conn->qstr($category_path)); if ($category_id !== false) { $last_category_id = $category_id; $url_part = array_shift($url_parts); $res = true; } } while ($category_id !== false && $url_part); $this->HTTPQuery->Set('m_cat_id', $last_category_id); if ($url_part) { array_unshift($url_parts, $url_part); } return $res; } function ProcessModuleIndex(&$url_parts) { if ( count($url_parts) > 1) return false; // if no more parts or only 1 part left if ( $url_parts && $url_parts[0] == 'index') { // treat index same as no parts array_shift($url_parts); } if( $url_parts ) { // if parts are left, it can only be module page if (!is_numeric($url_parts[0])) return false; // set module pages for all modules, since we don't know which module will need it foreach ($this->Application->ModuleInfo as $module_name => $module_data) { $this->Application->SetVar( $module_data['Var'].'_id', 0); $this->Application->SetVar( $module_data['Var'].'_Page', $url_parts[0]); $this->Application->SetVar( $module_data['Var'].'_Reviews_Page', 0); } } // try to find CMS index page of the category if ($this->Application->isModuleEnabled('In-CMS')) { $sql = 'SELECT p.Path, ci.CategoryId FROM '.TABLE_PREFIX.'Pages AS p LEFT JOIN '.TABLE_PREFIX.'CategoryItems AS ci ON ci.ItemResourceId = p.ResourceId WHERE p.IsIndex = 1 AND CategoryId = '.$this->Application->GetVar('m_cat_id').' AND ci.PrimaryCat = 1'; $template_found = $this->Conn->GetRow($sql); if ($template_found !== false) { $this->HTTPQuery->Set('t', $template_found['Path']); return true; } } $sql = 'SELECT CachedCategoryTemplate FROM '.TABLE_PREFIX.'Category WHERE CategoryId = '.$this->Application->GetVar('m_cat_id'); $this->HTTPQuery->Set('t', $this->HTTPQuery->getDefaultTemplate( $this->Conn->GetOne($sql) ) ); return true; } function ProcessModuleItem(&$url_parts, $set_t=true) { if (!isset($url_parts[0])) return false; if ( count($url_parts) != 1 ) return false; $url_part = array_shift($url_parts); // match module reviews page $page = 1; if( preg_match('/(.*)_([\d]+)$/', $url_part, $rets) ) { $url_part = $rets[1]; $page = $rets[2]; } // locating the item in CategoryItems by filename to detect its ItemPrefix and its category ParentPath $cat_item = $this->Conn->GetRow(' SELECT ci.ItemResourceId, ci.ItemPrefix, c.ParentPath, ci.CategoryId FROM '.TABLE_PREFIX.'CategoryItems AS ci LEFT JOIN '.TABLE_PREFIX.'Category AS c ON c.CategoryId = ci.CategoryId WHERE ci.CategoryId = '.$this->Application->GetVar('m_cat_id').' AND ci.Filename = '.$this->Conn->qstr($url_part)); if ($cat_item !== false) { // item found $module_prefix = $cat_item['ItemPrefix']; $parent_path = implode(',',explode('|', substr($cat_item['ParentPath'], 1, -1))); // item template is stored in module' system custom field - need to get that field Id $item_template_field_id = $this->Conn->GetOne( 'SELECT CustomFieldId FROM '.TABLE_PREFIX.'CustomField WHERE FieldName = '.$this->Conn->qstr($module_prefix.'_ItemTemplate')); // looking for item template through cats hierarchy sorted by parent path $query = 'SELECT ccd.l1_cust_'.$item_template_field_id.', FIND_IN_SET(c.CategoryId, '.$this->Conn->qstr($parent_path).') AS Ord1, c.CategoryId, c.Name, ccd.l1_cust_15 FROM inp_Category AS c LEFT JOIN inp_CategoryCustomData AS ccd ON ccd.ResourceId = c.ResourceId WHERE c.CategoryId IN ('.$parent_path.') AND ccd.l1_cust_'.$item_template_field_id.' != \'\' ORDER BY FIND_IN_SET(c.CategoryId, '.$this->Conn->qstr($parent_path).') DESC'; $item_template = $this->Conn->GetOne($query); // converting ResourceId to correpsonding Item id $module_config = $this->Application->getUnitOptions($module_prefix); $item_id = $this->Conn->GetOne( 'SELECT '.$module_config['IDField'].' FROM '.$module_config['TableName'].' WHERE ResourceId = '.$cat_item['ItemResourceId'] ); if ($item_template && $item_id) { if ($set_t) { $this->HTTPQuery->Set('t', $item_template); } $this->Application->SetVar($module_prefix.'_id', $item_id); $this->Application->SetVar($module_prefix.'_Reviews_Page', $page); return $module_prefix; } } array_unshift($url_parts, $url_part); return false; } function ProcessPhisycalTemplate(&$url_parts) { if (!isset($url_parts[0])) return false; $remaining = array(); do { $template_path = implode('/', $url_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($remaining, array_pop($url_parts)); } } while (!$template_found && $url_parts); $url_parts = $remaining; if ($template_found) { $this->HTTPQuery->Set('t', $template_path ); return true; } return false; } /** * Checks if whole url_parts matches a whole In-CMS page * * @param array $url_parts * @return boolean */ function ProcessVirtualTemplate(&$url_parts) { if (!isset($url_parts[0]) || !$this->Application->isModuleEnabled('In-CMS')) return false; $template_path = implode('/', $url_parts); $sql = 'SELECT p.PageId, ci.CategoryId FROM '.TABLE_PREFIX.'Pages AS p LEFT JOIN '.TABLE_PREFIX.'CategoryItems AS ci ON ci.ItemResourceId = p.ResourceId WHERE Path = '.$this->Conn->qstr($template_path).' AND ci.PrimaryCat = 1'; $template_found = $this->Conn->GetRow($sql); if ($template_found) { $this->Application->SetVar('m_cat_id', $template_found['CategoryId']); $this->HTTPQuery->Set('t', $template_path ); return true; } return false; } function processRewriteURL() { $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) { $this->SetDefaultValues(); } 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', ''); } $passed = Array('m'); $this->ProcessLanguage($url_parts); $this->ProcessTheme($url_parts); if ( $this->ProcessVirtualTemplate($url_parts) ) { $this->HTTPQuery->finalizeParsing($passed, $module_params); return true; } $this->ProcessCategory($url_parts); if ( $this->ProcessModuleIndex($url_parts) ) { foreach ($this->Application->ModuleInfo as $module_name => $info) { $passed[] = $info['Var']; } $this->HTTPQuery->finalizeParsing($passed, $module_params); return ; } if ( $module_prefix = $this->ProcessModuleItem($url_parts) ) { $passed[] = $module_prefix; $this->HTTPQuery->finalizeParsing($passed, $module_params); return ; } /*// 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; } } }*/ if ( $this->ProcessPhisycalTemplate($url_parts) ) { if (!$url_parts) { $this->HTTPQuery->finalizeParsing($passed, $module_params); return true; } } if ( $module_prefix = $this->ProcessModuleItem($url_parts, false) ) { $passed[] = $module_prefix; $this->HTTPQuery->finalizeParsing($passed, $module_params); return ; } $this->HTTPQuery->finalizeParsing($passed, $module_params); // 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);*/ } } ?>