Index: branches/5.2.x/core/units/categories/categories_event_handler.php =================================================================== diff -u -N -r15314 -r15354 --- branches/5.2.x/core/units/categories/categories_event_handler.php (.../categories_event_handler.php) (revision 15314) +++ branches/5.2.x/core/units/categories/categories_event_handler.php (.../categories_event_handler.php) (revision 15354) @@ -1,6 +1,6 @@ Application->GetSID() . '_' . TABLE_PREFIX . 'Search - search_result LEFT JOIN %1$s ON %1$s.ResourceId = search_result.ResourceId'; + search_result JOIN %1$s ON %1$s.ResourceId = search_result.ResourceId'; $sql = str_replace('FROM %1$s', $search_sql, $object->GetPlainSelectSQL()); $object->SetSelectSQL($sql); $object->addCalculatedField('Relevance', 'search_result.Relevance'); - $object->AddOrderField('search_result.Relevance', 'desc', true); $type_clauses['search']['include'] = '1'; $type_clauses['search']['except'] = '0'; @@ -1460,7 +1459,12 @@ protected function getPerPage(kEvent $event) { if ( !$this->Application->isAdmin ) { + $same_special = $event->getEventParam('same_special'); $event->setEventParam('same_special', true); + + $per_page = parent::getPerPage($event); + + $event->setEventParam('same_special', $same_special); } return parent::getPerPage($event); @@ -1577,6 +1581,51 @@ return true; } + /** + * Set's correct sorting for list based on data provided with event + * + * @param kEvent $event + * @return void + * @access protected + * @see kDBEventHandler::OnListBuild() + */ + protected function SetSorting(kEvent $event) + { + $types = $event->getEventParam('types'); + $types = $types ? explode(',', $types) : Array (); + + if ( in_array('search', $types) ) { + $event->setPseudoClass('_List'); + + $object = $event->getObject(); + /* @var $object kDBList */ + + // 1. no user sorting - sort by relevance + if ( $object->isMainList() ) { + if ( !$this->Application->GetVar('sort_by') ) { + $this->Application->SetVar('sort_by', 'Relevance,desc'); + } + } + else { + $sorting_settings = $this->getListSetting($event, 'Sortings'); + + if ( !trim(getArrayValue($sorting_settings, 'Sort1') . ',' . getArrayValue($sorting_settings, 'Sort1_Dir'), ',') ) { + $event->setEventParam('sort_by', 'Relevance,desc'); + } + } + + // 2. remove default sortings + $config_mapping = $this->Application->getUnitOption($event->Prefix, 'ConfigMapping'); + unset($config_mapping['DefaultSorting1Field']); + $this->Application->setUnitOption($event->Prefix, 'ConfigMapping', $config_mapping); + + // 2. remove forced sortings + $this->Application->setUnitOption($event->Prefix, 'ListSortings', Array ()); + } + + parent::SetSorting($event); + } + // ============= for cms page processing ======================= /** @@ -2515,7 +2564,6 @@ $this->Application->SetVar('do_not_drop_search_table', true); } - $search_table_exists = $this->Conn->Query('SHOW TABLES LIKE "'.$search_table.'"'); if ($search_table_exists) { $select_intro = 'INSERT INTO '.$search_table.' (Relevance, ItemId, ResourceId, ItemType, EdPick) '; @@ -2526,7 +2574,6 @@ $edpick_clause = $this->Application->getUnitOption($event->Prefix.'.EditorsPick', 'Fields') ? $items_table.'.EditorsPick' : '0'; - $sql = $select_intro.' SELECT '.$relevance_clause.' AS Relevance, '.$items_table.'.'.$this->Application->getUnitOption($event->Prefix, 'IDField').' AS ItemId, '.$items_table.'.ResourceId, Index: branches/5.2.x/core/kernel/db/cat_event_handler.php =================================================================== diff -u -N -r15314 -r15354 --- branches/5.2.x/core/kernel/db/cat_event_handler.php (.../cat_event_handler.php) (revision 15314) +++ branches/5.2.x/core/kernel/db/cat_event_handler.php (.../cat_event_handler.php) (revision 15354) @@ -1,6 +1,6 @@ clearSelectedIDs($event); } - /** * Return type clauses for list bulding on front * @@ -442,13 +441,12 @@ /* @var $object kDBList */ $search_sql = ' FROM ' . TABLE_PREFIX . 'ses_' . $this->Application->GetSID() . '_' . TABLE_PREFIX . 'Search - search_result LEFT JOIN %1$s ON %1$s.ResourceId = search_result.ResourceId'; + search_result JOIN %1$s ON %1$s.ResourceId = search_result.ResourceId'; $sql = str_replace('FROM %1$s', $search_sql, $object->GetPlainSelectSQL()); $object->SetSelectSQL($sql); $object->addCalculatedField('Relevance', 'search_result.Relevance'); - $object->AddOrderField('search_result.Relevance', 'desc', true); $type_clauses['search']['include'] = 'PrimaryCat = 1 AND ('.TABLE_PREFIX.'Categories.Status = '.STATUS_ACTIVE.')'; $type_clauses['search']['except'] = 'PrimaryCat = 1 AND ('.TABLE_PREFIX.'Categories.Status = '.STATUS_ACTIVE.')'; @@ -666,7 +664,6 @@ $object->addFilter('perm_filter', 'perm.PermId = '.$view_perm); - $types = $event->getEventParam('types'); $this->applyItemStatusFilter($object, $types); @@ -1325,7 +1322,6 @@ $this->Application->SetVar('do_not_drop_search_table', true); } - $search_table_exists = $this->Conn->Query('SHOW TABLES LIKE "'.$search_table.'"'); if ($search_table_exists) { $select_intro = 'INSERT INTO '.$search_table.' (Relevance, ItemId, ResourceId, ItemType, EdPick) '; @@ -1336,7 +1332,6 @@ $edpick_clause = $this->Application->getUnitOption($event->Prefix.'.EditorsPick', 'Fields') ? $items_table.'.EditorsPick' : '0'; - $sql = $select_intro.' SELECT '.$relevance_clause.' AS Relevance, '.$items_table.'.'.$this->Application->getUnitOption($event->Prefix, 'IDField').' AS ItemId, '.$items_table.'.ResourceId, @@ -2697,6 +2692,38 @@ $event->setEventParam('same_special', true); } + $types = $event->getEventParam('types'); + $types = $types ? explode(',', $types) : Array (); + + if ( in_array('search', $types) ) { + $event->setPseudoClass('_List'); + + $object = $event->getObject(); + /* @var $object kDBList */ + + // 1. no user sorting - sort by relevance + if ( $object->isMainList() ) { + if ( !$this->Application->GetVar('sort_by') ) { + $this->Application->SetVar('sort_by', 'Relevance,desc'); + } + } + else { + $sorting_settings = $this->getListSetting($event, 'Sortings'); + + if ( !trim(getArrayValue($sorting_settings, 'Sort1') . ',' . getArrayValue($sorting_settings, 'Sort1_Dir'), ',') ) { + $event->setEventParam('sort_by', 'Relevance,desc'); + } + } + + // 2. remove default sortings + $config_mapping = $this->Application->getUnitOption($event->Prefix, 'ConfigMapping'); + unset($config_mapping['DefaultSorting1Field']); + $this->Application->setUnitOption($event->Prefix, 'ConfigMapping', $config_mapping); + + // 2. remove forced sortings + $this->Application->setUnitOption($event->Prefix, 'ListSortings', Array ()); + } + parent::SetSorting($event); } Index: branches/5.2.x/core/units/categories/categories_config.php =================================================================== diff -u -N -r15012 -r15354 --- branches/5.2.x/core/units/categories/categories_config.php (.../categories_config.php) (revision 15012) +++ branches/5.2.x/core/units/categories/categories_config.php (.../categories_config.php) (revision 15354) @@ -1,6 +1,6 @@ Array ('type' => 'int', 'formatter' => 'kLEFTFormatter', 'error_msgs' => Array ('invalid_option' => '!la_error_UserNotFound!'), 'options' => Array (USER_ROOT => 'root', USER_GUEST => 'Guest'),'left_sql'=>'SELECT %s FROM '.TABLE_PREFIX.'Users WHERE `%s` = \'%s\'', 'left_key_field' => 'PortalUserId', 'left_title_field' => 'Username', 'default' => NULL), 'CachedTemplate' => Array ('type' => 'string', 'not_null' => 1, 'default' => ''), - // fields from Pages 'Template' => Array ( 'type' => 'string', @@ -427,6 +426,7 @@ ), 'VirtualFields' => Array ( + 'Relevance' => Array ('type' => 'float', 'default' => 0), 'CurrentSort' => Array('type' => 'string', 'default' => ''), 'IsNew' => Array('type' => 'int', 'default' => 0), 'OldPriority' => Array('type' => 'int', 'default' => 0),