Explorar o código

Ticket #4570 - Add ability to sort by last_active in bx_accounts_administration.

AntonLV %!s(int64=2) %!d(string=hai) anos
pai
achega
a94c6fef24

+ 14 - 3
inc/classes/BxDolGrid.php

@@ -383,7 +383,7 @@ class BxDolGrid extends BxDolFactory implements iBxDolFactoryObject, iBxDolRepla
         // sort
         $sSortField = false;
         $iSortDir = 1;
-        if ($sOrderField && !empty($this->_aOptions['sorting_fields']) && is_array($this->_aOptions['sorting_fields']) && in_array($sOrderField, $this->_aOptions['sorting_fields'])) { // explicit order
+        if ($sOrderField && ($aSortingFields = $this->_getOrderFields()) && in_array($sOrderField, $aSortingFields)) { // explicit order
             $sSortField = $sOrderField;
             $iSortDir = 0 === strcasecmp($sOrderDir, 'desc') ? -1 : 1;
         } elseif (!empty($this->_aOptions['field_order'])) { // order by "order" field
@@ -568,11 +568,11 @@ class BxDolGrid extends BxDolFactory implements iBxDolFactoryObject, iBxDolRepla
     {
         $sOrderClause = '';
 
-        if ($sOrderField && is_array($this->_aOptions['sorting_fields']) && in_array($sOrderField, $this->_aOptions['sorting_fields'])) { // explicit order
+        if ($sOrderField && ($aSortingFields = $this->_getOrderFields()) && in_array($sOrderField, $aSortingFields)) { // explicit order
 
             $sDir = (0 === strcasecmp($sOrderDir, 'desc') ? 'DESC' : 'ASC');
 
-            if (is_array($this->_aOptions['sorting_fields_translatable']) && in_array($sOrderField, $this->_aOptions['sorting_fields_translatable'])) {
+            if (($aSortingFieldsTranslatable = $this->_getOrderFieldsTranslatable()) && in_array($sOrderField, $aSortingFieldsTranslatable)) {
 
                 // translatable fields
                 $iLang = BxDolLanguages::getInstance()->getCurrentLangId();
@@ -647,6 +647,17 @@ class BxDolGrid extends BxDolFactory implements iBxDolFactoryObject, iBxDolRepla
         return bx_unicode_urldecode(bx_process_input(bx_get($this->_aOptions['filter_get'])));
     }
 
+    protected function _getOrderFields($bTranslatable = false)
+    {
+        $sKey = 'sorting_fields' . ($bTranslatable ? '_translatable' : '');
+        return !empty($this->_aOptions[$sKey]) && is_array($this->_aOptions[$sKey]) ? $this->_aOptions[$sKey] : [];
+    }
+
+    protected function _getOrderFieldsTranslatable()
+    {
+        return $this->_getOrderFields(true);
+    }
+
     protected function _getOrderValue()
     {
         return bx_unicode_urldecode(bx_process_input(bx_get($this->_aOptions['order_get_field'])));

+ 6 - 0
modules/boonex/accounts/classes/BxAccntConfig.php

@@ -24,6 +24,7 @@ class BxAccntConfig extends BxBaseModGeneralConfig
         $this->CNF = array (
             // some params
             'PARAM_PROFILE_NAME_LENGTH_MAX' => 10,
+            'PARAM_LA_SORTING' => 'bx_accounts_last_active_sorting',
             'PARAM_EXPORT_TO' => 'bx_accounts_export_to',
             'PARAM_EXPORT_FIELDS' => 'bx_accounts_export_fields',
 
@@ -91,6 +92,11 @@ class BxAccntConfig extends BxBaseModGeneralConfig
         $this->_oDb = &$oDb;
     }
 
+    public function isLastActiveSorting()
+    {
+        return getParam($this->CNF['PARAM_LA_SORTING']) == 'on';
+    }
+
     public function getHtmlIds($sKey = '')
     {
         if(empty($sKey))

+ 39 - 16
modules/boonex/accounts/classes/BxAccntGridAdministration.php

@@ -44,6 +44,17 @@ class BxAccntGridAdministration extends BxBaseModProfileGridAdministration
         if(strpos($sFilter, $this->_sParamsDivider) !== false)
             list($this->_sFilter1Value, $this->_sFilter2Value, $sFilter) = explode($this->_sParamsDivider, $sFilter);
 
+        $sSelectClause = $sJoinClause = '';
+        if($this->_oModule->_oConfig->isLastActiveSorting()) {
+            $sSelectClause = ', `ts`.`date` AS `last_active`';
+            $sJoinClause = ' LEFT JOIN `sys_sessions` AS `ts` ON `ts`.`id` = (SELECT `id` FROM `sys_sessions` WHERE `user_id`=`ta`.`id` ORDER BY `date` DESC LIMIT 1)';
+        }
+
+        $this->_aOptions['source'] = bx_replace_markers($this->_aOptions['source'], [
+            'select' => $sSelectClause,
+            'join' => $sJoinClause
+        ]);
+
     	if(!empty($this->_sFilter1Value))
             switch($this->_sFilter1Value) {
                 case 'unconfirmed':
@@ -162,9 +173,9 @@ class BxAccntGridAdministration extends BxBaseModProfileGridAdministration
         }
     }
 	
-	public function performActionSendMessage()
+    public function performActionSendMessage()
     {
-		$sAction = 'send_message';
+        $sAction = 'send_message';
 		
         $CNF = &$this->_oModule->_oConfig->CNF;
 
@@ -172,24 +183,23 @@ class BxAccntGridAdministration extends BxBaseModProfileGridAdministration
         if(!$aIds || !is_array($aIds))
             return echoJson(array());
 		
-		$oForm = BxDolForm::getObjectInstance('bx_accounts_account', 'bx_accounts_send_test');
+        $oForm = BxDolForm::getObjectInstance('bx_accounts_account', 'bx_accounts_send_test');
         if (!$oForm)
             return '';
 		
         $oForm->aFormAttrs['action'] = BX_DOL_URL_ROOT . 'grid.php?' . bx_encode_url_params($_GET, array('_r'));
         $oForm->initChecker();
         if($oForm->isSubmittedAndValid()) {
-        	$aIdsAffected = array();
-			foreach($aIds as $iId) {
-				if(sendMail(BxDolAccount::getInstance()->getEmail($iId), $oForm->getCleanValue('message_subject'), $oForm->getCleanValue('message_text'), 0, [], BX_EMAIL_MASS, 'text', false, ['From' => "=?UTF-8?B?" . base64_encode(getParam('site_title')) . "?= <" . getParam('site_email_notify') . ">"], false)){
-					$aIdsAffected[] = $iId;
-				}	
-			}
-			
+            $aIdsAffected = array();
+                foreach($aIds as $iId) {
+                    if(sendMail(BxDolAccount::getInstance()->getEmail($iId), $oForm->getCleanValue('message_subject'), $oForm->getCleanValue('message_text'), 0, [], BX_EMAIL_MASS, 'text', false, ['From' => "=?UTF-8?B?" . base64_encode(getParam('site_title')) . "?= <" . getParam('site_email_notify') . ">"], false)){
+                        $aIdsAffected[] = $iId;
+                    }	
+                }
+
             echoJson(count($aIdsAffected) > 0 ? array('grid' => $this->getCode(false), 'blink' => $aIdsAffected) : array('msg' => _t($CNF['T']['grid_action_err_perform'])));
         }
         else {
-            
             $sContent = BxTemplStudioFunctions::getInstance()->popupBox('bx-account-send-message', _t('_bx_accounts_form_display_account_send_message'), $this->_oModule->_oTemplate->parseHtmlByName('manage_item.html', array(
                 'form_id' => $oForm->id,
                 'form' => $oForm->getCode(true),
@@ -610,13 +620,16 @@ class BxAccntGridAdministration extends BxBaseModProfileGridAdministration
 
         return parent::_getCellDefault($mixedValue, $sKey, $aField, $aRow);
     } 
-    
+
     protected function _getCellLastActive($mixedValue, $sKey, $aField, $aRow)
     {
+        if(!isset($aRow['last_active']))
+            $mixedValue = (new BxDolSessionQuery())->getLastActivityAccount($aRow['id']);
+
         $iTs = max((int)$mixedValue, (int)$aRow['active']);
         return parent::_getCellDefault($iTs ? bx_time_js($iTs) : _t('_sys_not_available'), $sKey, $aField, $aRow);
-    } 
-    
+    }
+
     protected function _getCellAdded($mixedValue, $sKey, $aField, $aRow)
     {
         $mixedValue = !empty($mixedValue) ? bx_time_js($mixedValue) : _t('_sys_not_available');
@@ -633,17 +646,27 @@ class BxAccntGridAdministration extends BxBaseModProfileGridAdministration
         return parent::_getCellDefault(_t('_bx_accnt_grid_confirmation_status_' . $s), $sKey, $aField, $aRow);
     }
 
+    protected function _getOrderFields($bTranslatable = false)
+    {
+        $aResult = parent::_getOrderFields($bTranslatable);
+
+        if(!$bTranslatable && $this->_oModule->_oConfig->isLastActiveSorting())
+            $aResult[] = 'last_active';
+
+        return $aResult;
+    }
+    
     protected function _isCheckboxDisabled($aRow)
     {
         return false;
     }
 
-	protected function _getContentInfo($iId)
+    protected function _getContentInfo($iId)
     {
     	return BxDolAccountQuery::getInstance()->getInfoById($iId);
     }
 
-	protected function _doDelete($iId, $aParams = array())
+    protected function _doDelete($iId, $aParams = array())
     {
         $oAccount = BxDolAccount::getInstance($iId);
         if($oAccount)

+ 2 - 1
modules/boonex/accounts/install/langs/en.xml

@@ -3,13 +3,14 @@
     <string name="_bx_accnt"><![CDATA[Accounts]]></string>
     <string name="_bx_accounts"><![CDATA[Accounts]]></string>
 
+    <string name="_bx_accounts_option_last_active_sorting"><![CDATA[Enable sorting by Last Active]]></string>
     <string name="_bx_accounts_option_export_to"><![CDATA[Export to]]></string>
     <string name="_bx_accounts_option_export_fields"><![CDATA[Export fields]]></string>
 
     <string name="_bx_accounts_form_display_account_settings_email_popup"><![CDATA[Edit Email]]></string>
     <string name="_bx_accounts_form_display_account_create_popup"><![CDATA[Create new Account]]></string>
     <string name="_bx_accounts_form_display_account_settings_password_popup"><![CDATA[Reset Password]]></string>
-	 <string name="_bx_accounts_form_display_account_send_message"><![CDATA[Send test email]]></string>
+    <string name="_bx_accounts_form_display_account_send_message"><![CDATA[Send test email]]></string>
 
     <string name="_bx_accnt_page_title_sys_manage_administration"><![CDATA[Manage All Accounts]]></string>
     <string name="_bx_accnt_page_title_manage"><![CDATA[Manage Accounts]]></string>

+ 2 - 1
modules/boonex/accounts/install/sql/enable.sql

@@ -12,6 +12,7 @@ VALUES (@iTypeId, @sName, '_bx_accounts', 1);
 SET @iCategId = LAST_INSERT_ID();
 
 INSERT INTO `sys_options` (`name`, `value`, `category_id`, `caption`, `type`, `check`, `check_error`, `extra`, `order`) VALUES
+('bx_accounts_last_active_sorting', '', @iCategId, '_bx_accounts_option_last_active_sorting', 'checkbox', '', '', '', 1),
 ('bx_accounts_export_to', 'csv', @iCategId, '_bx_accounts_option_export_to', 'select', '', '', 'a:2:{s:6:"module";s:11:"bx_accounts";s:6:"method";s:21:"get_options_export_to";}', 10),
 ('bx_accounts_export_fields', 'name,email', @iCategId, '_bx_accounts_option_export_fields', 'list', '', '', 'a:2:{s:6:"module";s:11:"bx_accounts";s:6:"method";s:25:"get_options_export_fields";}', 20);
 
@@ -81,7 +82,7 @@ INSERT INTO `sys_acl_matrix` (`IDLevel`, `IDAction`) VALUES
 
 -- GRIDS: administration
 INSERT INTO `sys_objects_grid` (`object`, `source_type`, `source`, `table`, `field_id`, `field_order`, `field_active`, `paginate_url`, `paginate_per_page`, `paginate_simple`, `paginate_get_start`, `paginate_get_per_page`, `filter_fields`, `filter_fields_translatable`, `filter_mode`, `sorting_fields`, `sorting_fields_translatable`, `visible_for_levels`, `show_total_count`, `override_class_name`, `override_class_file`) VALUES
-('bx_accounts_administration', 'Sql', 'SELECT `ta`.*, `tp`.`status` AS `status`, `ta`.`active`, `ts`.`date` AS `last_active` FROM `sys_accounts` AS `ta` LEFT JOIN `sys_sessions` AS `ts` ON `ta`.`id`=`ts`.`user_id` LEFT JOIN `sys_profiles` AS `tp` ON `ta`.`id`=`tp`.`account_id` AND `tp`.`type`=''system'' WHERE 1 ', 'sys_accounts', 'id', 'logged', 'status', '', 20, NULL, 'start', '', 'name,email,ip,phone', '', 'like', 'email_confirmed,logged,last_active,added', '', 192, 1, 'BxAccntGridAdministration', 'modules/boonex/accounts/classes/BxAccntGridAdministration.php');
+('bx_accounts_administration', 'Sql', 'SELECT `ta`.*, `tp`.`status` AS `status`, `ta`.`active` {select} FROM `sys_accounts` AS `ta` LEFT JOIN `sys_profiles` AS `tp` ON `ta`.`id`=`tp`.`account_id` AND `tp`.`type`=''system'' {join} WHERE 1 ', 'sys_accounts', 'id', 'logged', 'status', '', 20, NULL, 'start', '', 'name,email,ip,phone', '', 'like', 'email_confirmed,logged,added', '', 192, 1, 'BxAccntGridAdministration', 'modules/boonex/accounts/classes/BxAccntGridAdministration.php');
 
 INSERT INTO `sys_grid_fields` (`object`, `name`, `title`, `width`, `translatable`, `chars_limit`, `params`, `order`) VALUES
 ('bx_accounts_administration', 'checkbox', '_sys_select', '2%', 0, '', '', 1),

+ 1 - 0
modules/boonex/russian/data/langs/bx_accounts/ru.xml

@@ -3,6 +3,7 @@
     <string name="_bx_accnt"><![CDATA[Аккаунты]]></string>
     <string name="_bx_accounts"><![CDATA[Аккаунты]]></string>
 
+    <string name="_bx_accounts_option_last_active_sorting"><![CDATA[Включить сортировку по последней активности]]></string>
     <string name="_bx_accounts_option_export_to"><![CDATA[Экспортировать в]]></string>
     <string name="_bx_accounts_option_export_fields"><![CDATA[Экспортируемые поля]]></string>
 

+ 2 - 2
template/scripts/BxBaseGrid.php

@@ -225,7 +225,7 @@ class BxBaseGrid extends BxDolGrid
             'id_wrap' => $sIdWrapper,
             'class_table_wrapper' => $this->_aOptions['responsive'] ? 'bx-grid-table-wrapper-responsive' : '',
             'sortable' => empty($this->_aOptions['field_order']) ? 0 : 1,
-            'sorting' => empty($this->_aOptions['sorting_fields']) ? 0 : 1,
+            'sorting' => empty($this->_getOrderFields()) ? 0 : 1,
             'sorting_field' => $sOrderField,
             'sorting_dir' => $sOrderDir,
         	'bx_if:display_head' => array(
@@ -440,7 +440,7 @@ class BxBaseGrid extends BxDolGrid
     {
         $sHeader = bx_process_output($aField['title']);
 
-        if (!empty($this->_aOptions['sorting_fields']) && is_array($this->_aOptions['sorting_fields']) && in_array($sKey, $this->_aOptions['sorting_fields'])) {
+        if (($aSortingFields = $this->_getOrderFields()) && in_array($sKey, $aSortingFields)) {
             $sHeader = '<a href="javascript:void(0);" class="bx-grid-sort-handle">' . $sHeader . '</a><span class="bx-grid-sort-indi"></span>';
             $aField['attr_head']['bx_grid_sort_head'] = $sKey;
         }