Index: trunk/core/units/general/helpers/mod_rewrite_helper.php =================================================================== diff -u -N --- trunk/core/units/general/helpers/mod_rewrite_helper.php (revision 8901) +++ trunk/core/units/general/helpers/mod_rewrite_helper.php (revision 0) @@ -1,554 +0,0 @@ -HTTPQuery =& $this->Application->recallObject('HTTPQuery'); - } - - function SetDefaultValues(&$vars) - { - $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) { - $vars[$default_key] = $default_value; - } - } - } - - function ProcessLanguage(&$url_parts, &$vars) - { - 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) - { - $vars['m_lang'] = $language_id; - $res = true; - } - -// $this->Application->VerifyLanguageId(); - if (!$res) { - array_unshift($url_parts, $url_part); - } - return $res; - } - - function ProcessTheme(&$url_parts, &$vars) - { - 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) - { - $vars['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, &$vars) - { - 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('/^bb_[\d]+/', $url_part) && preg_match('/(.*)_([\d]+)$/', $category_path, $rets) ) - { - $category_path = $rets[1]; - $vars['m_cat_page'] = $rets[2]; - } - - $category_id = $this->Conn->GetOne( - 'SELECT CategoryId - FROM '.TABLE_PREFIX.'Category - WHERE Status = 1 AND 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); - $vars['m_cat_id'] = $last_category_id; - - if ($url_part) { - array_unshift($url_parts, $url_part); - } - return $res; - } - - function ProcessPage(&$url_parts, &$vars) - { - if (!is_numeric($url_parts[0]) || count($url_parts) > 1) 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) - { - $vars[ $module_data['Var'].'_id'] = 0; - $vars[ $module_data['Var'].'_Page'] = $url_parts[0]; - $vars[ $module_data['Var'].'_Reviews_Page'] = 0; - } - return true; - } - - function ProcessModuleIndex(&$url_parts, &$vars) - { - 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; - $this->ProcessPage($url_parts, $vars); - } - - // 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 - p.Status = 1 - AND - CategoryId = '.$vars['m_cat_id'].' - AND - ci.PrimaryCat = 1'; - $template_found = $this->Conn->GetRow($sql); - if ($template_found !== false) { - $vars['t'] = $template_found['Path']; - return true; - } - } - - $sql = 'SELECT CachedCategoryTemplate - FROM '.TABLE_PREFIX.'Category - WHERE CategoryId = '.$vars['m_cat_id']; - $vars['t'] = $this->Conn->GetOne($sql); - if (!$vars['t']) $vars['t'] = 'index'; - return true; - } - - function ProcessModuleItem(&$url_parts, &$vars, $set_t=true) - { - if (preg_match('/^bb_.*/', $url_parts[0])) { - $cat_item = $this->Conn->GetRow(' - SELECT c.ParentPath, c.CategoryId FROM '.TABLE_PREFIX.'Category AS c - WHERE - c.CategoryId = '.$vars['m_cat_id']); - - if ($set_t) { - $item_template = $this->GetItemTemplate($cat_item, 'bb'); - $vars['t'] = $item_template; - } - - $this->Application->HandleEvent($bb_event, 'bb:ParseEnv', Array('url_parts' => $url_parts, 'vars' => $vars)); - $vars = $bb_event->getEventParam('vars'); - return 'bb'; - } - - 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 = '.$vars['m_cat_id'].' - AND - ci.Filename = '.$this->Conn->qstr($url_part)); - - if ($cat_item !== false) { // item found - $module_prefix = $cat_item['ItemPrefix']; - $item_template = $this->GetItemTemplate($cat_item, $module_prefix); - - // 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 ((!$set_t || $item_template) && $item_id) { - if ($set_t) { - $vars['t'] = $item_template; - } - $vars[ $module_prefix.'_id' ] = $item_id; - $vars[ $module_prefix.'_Reviews_Page' ] = $page; - return $module_prefix; - } - } - array_unshift($url_parts, $url_part); - return false; - } - - function GetItemTemplate($category, $module_prefix) - { - if (!is_array($category)) { - $category = $this->Conn->GetRow(' - SELECT c.ParentPath, c.CategoryId FROM '.TABLE_PREFIX.'Category AS c - WHERE - c.CategoryId = '.$category); - } - $parent_path = implode(',',explode('|', substr($category['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_'.$item_template_field_id.' - FROM '.TABLE_PREFIX.'Category AS c - LEFT JOIN '.TABLE_PREFIX.'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); - return $item_template; - } - - function ProcessPhisycalTemplate(&$url_parts, &$vars) - { - 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) { - $vars['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, &$vars) - { - if (!isset($url_parts[0])) return false; - - if ($this->Application->isModuleEnabled('Proj-CMS')) { - $friendly = $this->Conn->GetRow( - ' SELECT CategoryId, NamedParentPath FROM '.TABLE_PREFIX.'Category - WHERE FriendlyURL = '.$this->Conn->qstr(implode('/', $url_parts))); - if ($friendly) { - $vars['m_cat_id'] = $friendly['CategoryId']; - $vars['t'] = preg_replace('/^content\//i', '', $friendly['NamedParentPath']); - return true; - } - - - $template_path = 'content/'.implode('/', $url_parts); - - $sql = 'SELECT CategoryId, IsIndex, NamedParentPath FROM '.TABLE_PREFIX.'Category - WHERE - LOWER(NamedParentPath) = '.$this->Conn->qstr($template_path).' - AND - Status IN (1,4) '; - $template_found = $this->Conn->GetRow($sql); - - if ($template_found) { - // IsIndex = 2 is a Container-only page, meaning it should go to index-page child - if ($template_found['IsIndex'] == 2) { - $template_found = $this->Conn->GetRow(' - SELECT CategoryId, NamedParentPath FROM '.TABLE_PREFIX.'Category - WHERE ParentId = '.$template_found['CategoryId'].' AND IsIndex = 1 - '); - $vars['t'] = preg_replace('/^content\//i', '', $template_found['NamedParentPath']); - } - else { - $vars['t'] = implode('/', $url_parts); - } - $vars['m_cat_id'] = $template_found['CategoryId']; - $vars['is_virtual'] = true; // for template from POST - return true; - } - } - - if ($this->Application->isModuleEnabled('In-Edit')) { - $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 - AND - p.Status = 1'; - $template_found = $this->Conn->GetRow($sql); - - if ($template_found) { - $vars['m_cat_id'] = $template_found['CategoryId']; - $vars['t'] = $template_path; - return true; - } - } - - return false; - } - - function processRewriteURL() - { - $passed = array(); - $url = $this->HTTPQuery->Get('_mod_rw_url_'); - if( substr($url, -5) == '.html' ) $url = substr($url, 0, strlen($url) - 5 ); - - $restored = false; - $cache = $this->Conn->GetRow('SELECT Data, Cached FROM '.TABLE_PREFIX.'Cache WHERE VarName = "mod_rw_'.md5($url).'"'); - if (false && $cache && $cache['Cached'] > 0) { - $cache = unserialize($cache['Data']); - $vars = $cache['vars']; - $passed = $cache['passed']; - $restored = true; - } - else { - $passed = array(); - $vars = $this->parseRewriteURL($url,$passed); - $cache = array('vars'=>$vars,'passed'=>$passed); - $this->Conn->Query('REPLACE '.TABLE_PREFIX.'Cache (VarName, Data, Cached) VALUES ("mod_rw_'.md5($url).'", '.$this->Conn->qstr(serialize($cache)).', '.adodb_mktime().')'); - - if (isset($this->HTTPQuery->Post['t']) && $this->HTTPQuery->Post['t']) { - // template from POST overrides template from URL. - $vars['t'] = $this->HTTPQuery->Post['t']; - if (isset($vars['is_virtual']) && $vars['is_virtual']) { - $vars['m_cat_id'] = 0; // this is virtual template category (for Proj-CMS) - } - } - unset($vars['is_virtual']); - } - foreach ($vars as $name => $value) - { - $this->HTTPQuery->Set($name,$value); - } -// if ($restored) { - $this->InitAll(); -// } - $this->HTTPQuery->finalizeParsing($passed); - } - - function InitAll() - { -// $this->Application->Phrases = new PhrasesCache(); - $this->Application->VerifyLanguageId(); - $this->Application->Phrases->Init('phrases'); - $this->Application->VerifyThemeId(); - } - - function parseRewriteURL($url, &$passed) - { - $vars = $this->Conn->GetRow('SELECT Data, Cached FROM '.TABLE_PREFIX.'Cache WHERE VarName = "mod_rw_'.md5($url).'"'); - if (false && $vars && $vars['Cached'] > 0) { - $vars = unserialize($menu['Data']); - return $vars; - } - - $vars = array(); - $url_parts = $url ? explode('/', trim($url, '/')) : Array(); - - $process_module = true; - if($this->HTTPQuery->Get('rewrite') == 'on' || !$url_parts) - { - $this->SetDefaultValues($vars); - } - - if(!$url_parts) - { - $this->InitAll(); - - $vars['t'] = $this->HTTPQuery->getDefaultTemplate(''); - $passed[] = 'm'; - return $vars; - } - else - { - $vars['t'] = ''; - } - - $passed = Array('m'); - $this->ProcessLanguage($url_parts, $vars); - $this->ProcessTheme($url_parts, $vars); - - if ( $this->ProcessVirtualTemplate($url_parts, $vars) ) { - return $vars; - } - - $this->ProcessCategory($url_parts, $vars); - - if ( $this->ProcessModuleIndex($url_parts, $vars) ) { - foreach ($this->Application->ModuleInfo as $module_name => $info) { - $passed[] = $info['Var']; - } - return $vars; - } - if ( $module_prefix = $this->ProcessModuleItem($url_parts, $vars) ) { - $passed[] = $module_prefix; - return $vars; - } - - /*// 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, $vars) ) { - if (!$url_parts) { - return $vars; - } - } - - if ( $this->ProcessPage($url_parts, $vars) ) { - if (count($passed) == 1) {// passed contains only 1 value which is 'm' - // this may be search results page, so we need to find out the module, especially for old in-portal - foreach ($this->Application->ModuleInfo as $module_name => $module_data) - { - if (!$module_data['TemplatePath']) continue; - if( preg_match('/^'.preg_quote($module_data['TemplatePath'], '/').'/i', $vars['t']) ) - { - $module_prefix = $module_data['Var']; - break; - } - } - $passed[] = $module_prefix; - } - return $vars; - } - - if ( $module_prefix = $this->ProcessModuleItem($url_parts, $vars, false) ) { - $passed[] = $module_prefix; - return $vars; - } - - if ( $this->Application->isModuleEnabled('In-Edit') && $this->Application->GetVar('admin') == 1) { - $adm_ses =& $this->Application->recallObject('Session.admin'); - $user = $adm_ses->RecallVar('user_id'); - $perm_helper =& $this->Application->recallObject('PermissionsHelper'); - if ($perm_helper->CheckUserPermission($user, 'PAGE.ADD', 0)) { - $vars['t'] = implode('/', $url_parts); - return $vars; - } - } - - $not_found = $this->Application->ConfigValue('ErrorTemplate'); - $vars['t'] = $not_found ? $not_found : 'error_notfound'; - - header('HTTP/1.0 404 Not Found'); - - return $vars; - -// $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);*/ - } - - - } - -?> \ No newline at end of file