Index: branches/5.1.x/core/kernel/db/db_event_handler.php =================================================================== diff -u -r13140 -r13159 --- branches/5.1.x/core/kernel/db/db_event_handler.php (.../db_event_handler.php) (revision 13140) +++ branches/5.1.x/core/kernel/db/db_event_handler.php (.../db_event_handler.php) (revision 13159) @@ -1,6 +1,6 @@ dbBuild($object,$event); + if (!$object->mainList && $event->getEventParam('main_list')) { + // once list is set to main, then even "requery" parameter can't remove that + /*$passed = $this->Application->GetVar('passed'); + $this->Application->SetVar('passed', $passed . ',' . $event->Prefix);*/ + + $object->mainList = true; + } + $sql = $this->ListPrepareQuery($event); $sql = $this->Application->ReplaceLanguageTags($sql); $object->setSelectSQL($sql); @@ -704,11 +712,20 @@ */ function OnSetPerPage(&$event) { - $per_page = $this->Application->GetVar($event->getPrefixSpecial(true).'_PerPage'); - $this->Application->StoreVar($event->getPrefixSpecial().'_PerPage', $per_page); + $per_page = $this->Application->GetVar($event->getPrefixSpecial(true) . '_PerPage'); + $event->SetRedirectParam($event->getPrefixSpecial() . '_PerPage', $per_page); + $event->SetRedirectParam('pass', 'm,' . $event->getPrefixSpecial()); - $view_name = $this->Application->RecallVar($event->getPrefixSpecial().'_current_view'); - $this->Application->StorePersistentVar($event->getPrefixSpecial().'_PerPage.'.$view_name, $per_page); + if (!$this->Application->isAdminUser) { + $list_helper =& $this->Application->recallObject('ListHelper'); + /* @var $list_helper ListHelper */ + + $this->_passListParams($event, 'per_page'); + + if ($per_page != $list_helper->getDefaultPerPage($event->Prefix)) { + $event->SetRedirectParam('per_page', $per_page); + } + } } /** @@ -719,10 +736,63 @@ function OnSetPage(&$event) { $page = $this->Application->GetVar($event->getPrefixSpecial(true) . '_Page'); - $event->SetRedirectParam($event->getPrefixSpecial().'_Page', $page); + $event->SetRedirectParam($event->getPrefixSpecial() . '_Page', $page); + $event->SetRedirectParam('pass', 'm,' . $event->getPrefixSpecial()); + + if (!$this->Application->isAdminUser) { + if ($page > 1) { + $event->SetRedirectParam('page', $page); + } + + $this->_passListParams($event, 'page'); + } } /** + * Passes through main list pagination and sorting + * + * @param kEvent $event + * @param string $skip_var + */ + function _passListParams(&$event, $skip_var) + { + $param_names = array_diff(Array ('page', 'per_page', 'sort_by'), Array ($skip_var)); + + $list_helper =& $this->Application->recallObject('ListHelper'); + /* @var $list_helper ListHelper */ + + foreach ($param_names as $param_name) { + $value = $this->Application->GetVar($param_name); + + switch ($param_name) { + case 'page': + if ($value > 1) { + $event->SetRedirectParam('page', $value); + } + break; + + case 'per_page': + if ($value > 0) { + if ($value != $list_helper->getDefaultPerPage($event->Prefix)) { + $event->SetRedirectParam('per_page', $value); + } + } + break; + + case 'sort_by': + $event->setPseudoClass('_List'); + $object =& $event->getObject( Array ('main_list' => 1) ); + /* @var $object kDBList */ + + if ($list_helper->hasUserSorting($object)) { + $event->SetRedirectParam('sort_by', $value); + } + break; + } + } + } + + /** * Set's correct page for list * based on data provided with event * @@ -732,49 +802,51 @@ */ function SetPagination(&$event) { + $object =& $event->getObject(); + /* @var $object kDBList */ + // get PerPage (forced -> session -> config -> 10) - $per_page = $this->getPerPage($event); + $object->SetPerPage( $this->getPerPage($event) ); - $object =& $event->getObject(); - $object->SetPerPage($per_page); - $this->Application->StoreVarDefault($event->getPrefixSpecial().'_Page', 1, true); // true for optional + // main lists on Front-End have special get parameter for page + $page = $object->mainList ? $this->Application->GetVar('page') : false; - $page = $this->Application->GetVar($event->getPrefixSpecial().'_Page'); if (!$page) { - $page = $this->Application->GetVar($event->getPrefixSpecial(true).'_Page'); + // page is given in "env" variable for given prefix + $page = $this->Application->GetVar($event->getPrefixSpecial() . '_Page'); } - if (!$page) { - $page = $this->Application->RecallVar($event->getPrefixSpecial().'_Page'); - } - else { - $this->Application->StoreVar($event->getPrefixSpecial().'_Page', $page); - } - if( !$event->getEventParam('skip_counting') ) - { - $pages = $object->GetTotalPages(); - if($page > $pages) - { - $this->Application->StoreVar($event->getPrefixSpecial().'_Page', 1); - $page = 1; - } + if (!$page && $event->Special) { + // when not part of env, then variables like "prefix.special_Page" are + // replaced (by PHP) with "prefix_special_Page", so check for that too + $page = $this->Application->GetVar($event->getPrefixSpecial(true) . '_Page'); } - /*$per_page = $event->getEventParam('per_page'); - if ($per_page == 'list_next') { + if (!$object->mainList) { + // main lists doesn't use session for page storing + $this->Application->StoreVarDefault($event->getPrefixSpecial() . '_Page', 1, true); // true for optional - $cur_page = $page; - $cur_per_page = $per_page; + if ($page) { + // page found in request -> store in session + $this->Application->StoreVar($event->getPrefixSpecial() . '_Page', $page, true); //true for optional + } + else { + // page not found in request -> get from session + $page = $this->Application->RecallVar($event->getPrefixSpecial() . '_Page'); + } - $object->SetPerPage(1); + if ( !$event->getEventParam('skip_counting') ) { + // when stored page is larger, then maximal list page number + // (such case is also processed in kDBList::Query method) + $pages = $object->GetTotalPages(); - $object =& $this->Application->recallObject($event->Prefix); - $cur_item_index = $object->CurrentIndex; + if ($page > $pages) { + $page = 1; + $this->Application->StoreVar($event->getPrefixSpecial() . '_Page', 1, true); + } + } + } - $page = ($cur_page-1) * $cur_per_page + $cur_item_index + 1; - $object->SetPerPage(1); - }*/ - $object->SetPage($page); } @@ -786,53 +858,84 @@ */ function getPerPage(&$event) { - // 1. per-page is passed as tag parameter to PrintList, InitList, etc. + $object =& $event->getObject(); + /* @var $object kDBList */ + $per_page = $event->getEventParam('per_page'); - /*if ($per_page == 'list_next') { - $per_page = ''; - }*/ + if ($per_page) { + // per-page is passed as tag parameter to PrintList, InitList, etc. + $config_mapping = $this->Application->getUnitOption($event->Prefix, 'ConfigMapping'); - // 2. per-page variable name is store into config variable - $config_mapping = $this->Application->getUnitOption($event->Prefix, 'ConfigMapping'); - if ($config_mapping) { - switch ( $per_page ){ - case 'short_list' : - $per_page = $this->Application->ConfigValue($config_mapping['ShortListPerPage']); - break; - case 'default' : - $per_page = $this->Application->ConfigValue($config_mapping['PerPage']); - break; + // 2. per-page setting is stored in configuration variable + if ($config_mapping) { + // such pseudo per-pages are only defined in templates directly + switch ($per_page) { + case 'short_list': + $per_page = $this->Application->ConfigValue($config_mapping['ShortListPerPage']); + break; + + case 'default': + $per_page = $this->Application->ConfigValue($config_mapping['PerPage']); + break; + } } + + return $per_page; } + if (!$per_page && $object->mainList) { + // main lists on Front-End have special get parameter for per-page + $per_page = $this->Application->GetVar('per_page'); + } + if (!$per_page) { - // per-page is stored to persistent session - $view_name = $this->Application->RecallVar($event->getPrefixSpecial().'_current_view'); + // per-page is given in "env" variable for given prefix + $per_page = $this->Application->GetVar($event->getPrefixSpecial() . '_PerPage'); + } - $storage_prefix = $event->getEventParam('same_special') ? $event->Prefix : $event->getPrefixSpecial(); - $per_page = $this->Application->RecallPersistentVar($storage_prefix.'_PerPage.'.$view_name, ALLOW_DEFAULT_SETTINGS); + if (!$per_page && $event->Special) { + // when not part of env, then variables like "prefix.special_PerPage" are + // replaced (by PHP) with "prefix_special_PerPage", so check for that too + $per_page = $this->Application->GetVar($event->getPrefixSpecial(true) . '_PerPage'); + } - if (!$per_page) { - // per-page is stored to current session - $per_page = $this->Application->RecallVar($storage_prefix.'_PerPage'); + if (!$object->mainList) { + // per-page given in env and not in main list + $view_name = $this->Application->RecallVar($event->getPrefixSpecial() . '_current_view'); + + if ($per_page) { + // per-page found in request -> store in session and persistent session + $this->Application->StoreVar($event->getPrefixSpecial() . '_PerPage', $per_page, true); //true for optional + $this->Application->StorePersistentVar($event->getPrefixSpecial() . '_PerPage.' . $view_name, $per_page); } + else { + // per-page not found in request -> get from pesistent session (or session) + $storage_prefix = $event->getEventParam('same_special') ? $event->Prefix : $event->getPrefixSpecial(); + $per_page = $this->Application->RecallPersistentVar($storage_prefix . '_PerPage.' . $view_name, ALLOW_DEFAULT_SETTINGS); - if (!$per_page) { - if ($config_mapping) { - if (!isset($config_mapping['PerPage'])) { - trigger_error('Incorrect mapping of PerPage key in config for prefix '.$event->Prefix.'', E_USER_WARNING); - } - $per_page = $this->Application->ConfigValue($config_mapping['PerPage']); - } if (!$per_page) { - // none of checked above per-page locations are useful, then try default value - $default_per_page = $event->getEventParam('default_per_page'); - $per_page = is_numeric($default_per_page) ? $default_per_page : 10; + // per-page is stored to current session + $per_page = $this->Application->RecallVar($storage_prefix . '_PerPage'); } } } + if (!$per_page) { + // per page wan't found in request/session/persistent session + $list_helper =& $this->Application->recallObject('ListHelper'); + /* @var $list_helper ListHelper */ + + // allow to override default per-page value from tag + $default_per_page = $event->getEventParam('default_per_page'); + + if (!is_numeric($default_per_page)) { + $default_per_page = 10; + } + + $per_page = $list_helper->getDefaultPerPage($event->Prefix, $default_per_page); + } + return $per_page; } @@ -847,65 +950,86 @@ function SetSorting(&$event) { $event->setPseudoClass('_List'); + $object =& $event->getObject(); + /* @var $object kDBList */ - $storage_prefix = $event->getEventParam('same_special') ? $event->Prefix : $event->Prefix_Special; - $cur_sort1 = $this->Application->RecallVar($storage_prefix.'_Sort1'); - $cur_sort1_dir = $this->Application->RecallVar($storage_prefix.'_Sort1_Dir'); - $cur_sort2 = $this->Application->RecallVar($storage_prefix.'_Sort2'); - $cur_sort2_dir = $this->Application->RecallVar($storage_prefix.'_Sort2_Dir'); + if ($object->mainList) { + $sort_by = $this->Application->GetVar('sort_by'); + $cur_sort1 = $cur_sort1_dir = $cur_sort2 = $cur_sort2_dir = false; - $sorting_configs = $this->Application->getUnitOption($event->Prefix, 'ConfigMapping'); - $list_sortings = $this->Application->getUnitOption($event->Prefix, 'ListSortings'); - $sorting_prefix = getArrayValue($list_sortings, $event->Special) ? $event->Special : ''; + if ($sort_by) { + list ($cur_sort1, $cur_sort1_dir) = explode(',', $sort_by); + } + } + else { + $storage_prefix = $event->getEventParam('same_special') ? $event->Prefix : $event->Prefix_Special; + $cur_sort1 = $this->Application->RecallVar($storage_prefix . '_Sort1'); + $cur_sort1_dir = $this->Application->RecallVar($storage_prefix . '_Sort1_Dir'); + $cur_sort2 = $this->Application->RecallVar($storage_prefix . '_Sort2'); + $cur_sort2_dir = $this->Application->RecallVar($storage_prefix . '_Sort2_Dir'); + } $tag_sort_by = $event->getEventParam('sort_by'); + if ($tag_sort_by) { if ($tag_sort_by == 'random') { $object->AddOrderField('RAND()', ''); } else { + // multiple sortings could be specified at once $tag_sort_by = explode('|', $tag_sort_by); + foreach ($tag_sort_by as $sorting_element) { list ($by, $dir) = explode(',', $sorting_element); $object->AddOrderField($by, $dir); } } } - if ($sorting_configs && isset ($sorting_configs['DefaultSorting1Field'])){ - $list_sortings[$sorting_prefix]['Sorting'] = Array( + $list_sortings = $this->Application->getUnitOption($event->Prefix, 'ListSortings'); + $sorting_prefix = getArrayValue($list_sortings, $event->Special) ? $event->Special : ''; + $sorting_configs = $this->Application->getUnitOption($event->Prefix, 'ConfigMapping'); + + if ($sorting_configs && array_key_exists('DefaultSorting1Field', $sorting_configs)) { + // sorting defined in configuration variables overrides one from unit config + $list_sortings[$sorting_prefix]['Sorting'] = Array ( $this->Application->ConfigValue($sorting_configs['DefaultSorting1Field']) => $this->Application->ConfigValue($sorting_configs['DefaultSorting1Dir']), $this->Application->ConfigValue($sorting_configs['DefaultSorting2Field']) => $this->Application->ConfigValue($sorting_configs['DefaultSorting2Dir']), ); } - // Use default if not specified - if ( !$cur_sort1 || !$cur_sort1_dir) - { - if ( $sorting = getArrayValue($list_sortings, $sorting_prefix, 'Sorting') ) { + // use default if not specified in session + if (!$cur_sort1 || !$cur_sort1_dir) { + $sorting = getArrayValue($list_sortings, $sorting_prefix, 'Sorting'); + + if ($sorting) { reset($sorting); $cur_sort1 = key($sorting); $cur_sort1_dir = current($sorting); + if (next($sorting)) { - $cur_sort2 = key($sorting); - $cur_sort2_dir = current($sorting); + $cur_sort2 = key($sorting); + $cur_sort2_dir = current($sorting); } } } - if ( $forced_sorting = getArrayValue($list_sortings, $sorting_prefix, 'ForcedSorting') ) { + // always add forced sorting before any user sortings + $forced_sorting = getArrayValue($list_sortings, $sorting_prefix, 'ForcedSorting'); + + if ($forced_sorting) { foreach ($forced_sorting as $field => $dir) { $object->AddOrderField($field, $dir); } } - if($cur_sort1 != '' && $cur_sort1_dir != '') - { + // add user sortings + if ($cur_sort1 != '' && $cur_sort1_dir != '') { $object->AddOrderField($cur_sort1, $cur_sort1_dir); } - if($cur_sort2 != '' && $cur_sort2_dir != '') - { + + if ($cur_sort2 != '' && $cur_sort2_dir != '') { $object->AddOrderField($cur_sort2, $cur_sort2_dir); } } @@ -1011,6 +1135,7 @@ $this->Application->StoreVar($event->Prefix_Special.'_Sort1', $cur_sort1); $this->Application->StoreVar($event->Prefix_Special.'_Sort1_Dir', $cur_sort1_dir); + if ($use_double_sorting) { $this->Application->StoreVar($event->Prefix_Special.'_Sort2', $cur_sort2); $this->Application->StoreVar($event->Prefix_Special.'_Sort2_Dir', $cur_sort2_dir); @@ -1024,17 +1149,43 @@ */ function OnSetSortingDirect(&$event) { - $combined = $this->Application->GetVar($event->Prefix.'_CombinedSorting'); + // used on Front-End in category item lists + $prefix_special = $event->getPrefixSpecial(); + $combined = $this->Application->GetVar($event->getPrefixSpecial(true) . '_CombinedSorting'); + if ($combined) { - list($field, $dir) = explode('|', $combined); - $this->Application->StoreVar($event->Prefix.'_Sort1', $field); - $this->Application->StoreVar($event->Prefix.'_Sort1_Dir', $dir); + list ($field, $dir) = explode('|', $combined); + + if ($this->Application->isAdmin || !$this->Application->GetVar('main_list')) { + $this->Application->StoreVar($prefix_special . '_Sort1', $field); + $this->Application->StoreVar($prefix_special . '_Sort1_Dir', $dir); + } + else { + $event->setPseudoClass('_List'); + $this->Application->SetVar('sort_by', $field . ',' . $dir); + + $object =& $event->getObject( Array ('main_list' => 1) ); + /* @var $object kDBList */ + + $list_helper =& $this->Application->recallObject('ListHelper'); + /* @var $list_helper ListHelper */ + + $this->_passListParams($event, 'sort_by'); + + if ($list_helper->hasUserSorting($object)) { + $event->SetRedirectParam('sort_by', $field . ',' . strtolower($dir)); + } + + $event->SetRedirectParam('pass', 'm'); + } + return ; } - $field_pos = $this->Application->GetVar($event->Prefix.'_SortPos'); - $this->Application->LinkVar($event->Prefix.'_Sort'.$field_pos, $event->Prefix.'_Sort'.$field_pos); - $this->Application->LinkVar($event->Prefix.'_Sort'.$field_pos.'_Dir', $event->Prefix.'_Sort'.$field_pos.'_Dir'); + // used in "View Menu -> Sort" menu in administrative console + $field_pos = $this->Application->GetVar($event->getPrefixSpecial(true) . '_SortPos'); + $this->Application->LinkVar($event->getPrefixSpecial(true) . '_Sort' . $field_pos, $prefix_special . '_Sort' . $field_pos); + $this->Application->LinkVar($event->getPrefixSpecial(true) . '_Sort' . $field_pos . '_Dir', $prefix_special . '_Sort' . $field_pos . '_Dir'); } /**