Index: trunk/core/units/general/helpers/mod_rewrite_helper.php =================================================================== diff -u -N -r5558 -r6093 --- trunk/core/units/general/helpers/mod_rewrite_helper.php (.../mod_rewrite_helper.php) (revision 5558) +++ trunk/core/units/general/helpers/mod_rewrite_helper.php (.../mod_rewrite_helper.php) (revision 6093) @@ -8,18 +8,18 @@ $this->HTTPQuery =& $this->Application->recallObject('HTTPQuery'); } - function SetDefaultValues() + 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) { - $this->HTTPQuery->Set($default_key, $default_value); + $vars[$default_key] = $default_value; } } } - function ProcessLanguage(&$url_parts) + function ProcessLanguage(&$url_parts, &$vars) { if (!isset($url_parts[0])) return false; $res = false; @@ -30,7 +30,7 @@ $this->Application->Phrases = new PhrasesCache(); if($language_id) { - $this->HTTPQuery->Set('m_lang', $language_id); + $vars['m_lang'] = $language_id; $res = true; } @@ -41,7 +41,7 @@ return $res; } - function ProcessTheme(&$url_parts) + function ProcessTheme(&$url_parts, &$vars) { if (!isset($url_parts[0])) return false; $res = false; @@ -51,7 +51,7 @@ $theme_id = $this->Conn->GetOne($sql); if($theme_id) { - $this->HTTPQuery->Set('m_theme', $theme_id); + $vars['m_theme'] = $theme_id; $res = true; } $this->Application->VerifyThemeId(); // verify anyway - will set default if not found!!! @@ -61,7 +61,7 @@ return $res; } - function ProcessCategory(&$url_parts) + function ProcessCategory(&$url_parts, &$vars) { if (!isset($url_parts[0])) return false; $res = false; @@ -77,40 +77,92 @@ if( preg_match('/(.*)_([\d]+)$/', $category_path, $rets) ) { $category_path = $rets[1]; - $this->HTTPQuery->Set('m_cat_page', $rets[2]); + $vars['m_cat_page'] = $rets[2]; } $category_id = $this->Conn->GetOne( 'SELECT CategoryId FROM '.TABLE_PREFIX.'Category - WHERE NamedParentPath = '.$this->Conn->qstr($category_path)); + 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); - $this->HTTPQuery->Set('m_cat_id', $last_category_id); + $vars['m_cat_id'] = $last_category_id; if ($url_part) { array_unshift($url_parts, $url_part); } return $res; } - function ProcessModuleIndex(&$url_parts) + function ProcessModuleIndex(&$url_parts, &$vars) { - if ( count($url_parts) != 0 ) return false; + 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) + { + $vars[ $module_data['Var'].'_id'] = 0; + $vars[ $module_data['Var'].'_Page'] = $url_parts[0]; + $vars[ $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 + 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 = '.$this->Application->GetVar('m_cat_id'); - $this->HTTPQuery->Set('t', $this->HTTPQuery->getDefaultTemplate( $this->Conn->GetOne($sql) ) ); + WHERE CategoryId = '.$vars['m_cat_id']; + $vars['t'] = $this->Conn->GetOne($sql); + if (!$vars['t']) $vars['t'] = 'index'; return true; } - function ProcessModuleItem(&$url_parts) + 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); @@ -123,59 +175,71 @@ $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.ItemPrefix, c.ParentPath, ci.CategoryId FORM '.TABLE_PREFIX.'CategoryItems AS ci + 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 - CategoryId = '.$this->Application->GetVar('m_cat_id').' + ci.CategoryId = '.$vars['m_cat_id'].' AND - Filename = '.$this->Conn->qstr($url_part)); - if ($cat_item !== false) { + ci.Filename = '.$this->Conn->qstr($url_part)); + + if ($cat_item !== false) { // item found $module_prefix = $cat_item['ItemPrefix']; - $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); - } - $this->Application->SetVar($cat_item['ItemPrefix'].'_id', $item_id); - } + $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'] + ); - - $this->Application->SetVar( $event->getPrefixSpecial().'_Reviews_Page', $page); - - // only filename left, no other parts - $process_module = false; - $sql = 'SELECT ParentPath, CachedItemTemplate, CachedCategoryTemplate - FROM '.TABLE_PREFIX.'Category - WHERE CategoryId = '.$this->Application->GetVar('m_cat_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) { - $this->HTTPQuery->Set('t', $item_template ); - return true; + 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 ProcessPhisycalTemplate(&$url_parts) + 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(); @@ -201,7 +265,7 @@ $url_parts = $remaining; if ($template_found) { - $this->HTTPQuery->Set('t', $template_path ); + $vars['t'] = $template_path; return true; } return false; @@ -213,7 +277,7 @@ * @param array $url_parts * @return boolean */ - function ProcessVirtualTemplate(&$url_parts) + function ProcessVirtualTemplate(&$url_parts, &$vars) { if (!isset($url_parts[0]) || !$this->Application->isModuleEnabled('In-CMS')) return false; @@ -224,12 +288,14 @@ WHERE Path = '.$this->Conn->qstr($template_path).' AND - ci.PrimaryCat = 1'; + ci.PrimaryCat = 1 + AND + p.Status = 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 ); + $vars['m_cat_id'] = $template_found['CategoryId']; + $vars['t'] = $template_path; return true; } @@ -238,45 +304,93 @@ 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().')'); + } + 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('/', $url) : Array(); $process_module = true; if($this->HTTPQuery->Get('rewrite') == 'on' || !$url_parts) { - $this->SetDefaultValues(); + $this->SetDefaultValues($vars); } if(!$url_parts) { - $this->Application->Phrases = new PhrasesCache(); - $this->Application->VerifyLanguageId(); - $this->Application->Phrases->Init('phrases'); - $this->Application->VerifyThemeId(); + $this->InitAll(); - $this->HTTPQuery->Set('t', $this->HTTPQuery->getDefaultTemplate('') ); - $this->HTTPQuery->finalizeParsing(Array('m')); - return false; + $vars['t'] = $this->HTTPQuery->getDefaultTemplate(''); + $passed[] = 'm'; + return $vars; } else { - $this->HTTPQuery->Set('t', ''); + $vars['t'] = ''; } - $this->ProcessLanguage($url_parts); - $this->ProcessTheme($url_parts); + $passed = Array('m'); + $this->ProcessLanguage($url_parts, $vars); + $this->ProcessTheme($url_parts, $vars); - if ( $this->ProcessVirtualTemplate($url_parts) ) { - return true; + if ( $this->ProcessVirtualTemplate($url_parts, $vars) ) { + return $vars; } - $this->ProcessCategory($url_parts); - if ( $this->ProcessModuleIndex($url_parts) ) { - return ; + $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 ( $this->ProcessModuleItem($url_parts) ) { - return ; + if ( $module_prefix = $this->ProcessModuleItem($url_parts, $vars) ) { + $passed[] = $module_prefix; + return $vars; } /*// match module @@ -303,15 +417,29 @@ } }*/ - if ( $this->ProcessPhisycalTemplate($url_parts) ) { + if ( $this->ProcessPhisycalTemplate($url_parts, $vars) ) { if (!$url_parts) { - return true; + return $vars; } } + if ( $module_prefix = $this->ProcessModuleItem($url_parts, $vars, false) ) { + $passed[] = $module_prefix; + 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'); + /*$this->Application->Phrases->Init('phrases'); $passed = Array('m'); $module_params = Array(); if ( isset($module_prefix) ) { @@ -329,7 +457,7 @@ } } - $this->HTTPQuery->finalizeParsing($passed, $module_params); + $this->HTTPQuery->finalizeParsing($passed, $module_params);*/ }