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');
}
/**