AntonLV 5 лет назад
Родитель
Сommit
9264f3cdca

+ 6 - 0
inc/js/classes/BxDolGrid.js

@@ -285,6 +285,12 @@ BxDolGrid.prototype.processJson = function (oData, sAction, isDisableLoading) {
                 $('#' + sId).dolPopup($this._oPopupOptions);
             }        
         }
+        if (oData && oData.reload != undefined && parseInt(oData.reload) == 1) {
+            document.location = document.location;
+        }
+        if (oData && oData.redirect != undefined && oData.redirect.length != 0) {
+            document.location = oData.redirect;
+        }
         if (oData && undefined != oData.eval) {
             eval(oData.eval);
         }

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

@@ -24,11 +24,14 @@ class BxAccntConfig extends BxBaseModGeneralConfig
         $this->CNF = array (
             // some params
             'PARAM_PROFILE_NAME_LENGTH_MAX' => 10,
+            'PARAM_EXPORT_TO' => 'bx_accounts_export_to',
+            'PARAM_EXPORT_FIELDS' => 'bx_accounts_export_fields',
 
             // page URIs
             'URL_MANAGE_ADMINISTRATION' => 'page.php?i=accounts-administration',
 
             // objects
+            'OBJECT_STORAGE_FILES' => 'sys_files',
             'OBJECT_FORM_ACCOUNT' => 'bx_accounts_account',
             'OBJECT_FORM_ACCOUNT_DISPLAY_SETTINGS_EMAIL' => 'bx_accounts_account_settings_email',
             'OBJECT_FORM_ACCOUNT_DISPLAY_CREATE' => 'bx_accounts_account_create',

+ 10 - 0
modules/boonex/accounts/classes/BxAccntDb.php

@@ -16,6 +16,16 @@ class BxAccntDb extends BxBaseModGeneralDb
         parent::__construct($oConfig);
     }
 
+    public function getAccountFields()
+    {
+        return $this->getFields('sys_accounts');
+    }
+
+    public function getAccountIds()
+    {
+    	return $this->getColumn("SELECT `id` FROM `sys_accounts` WHERE 1", "id");
+    }
+
     public function updateAccount($aSet, $aWhere)
     {
     	return (int)$this->query("UPDATE `sys_accounts` SET " . $this->arrayToSQL($aSet) . " WHERE " . $this->arrayToSQL($aWhere, ' AND ')) > 0;

+ 142 - 0
modules/boonex/accounts/classes/BxAccntGridAdministration.php

@@ -225,6 +225,47 @@ class BxAccntGridAdministration extends BxBaseModProfileGridAdministration
             echoJson(array('popup' => array('html' => $sContent, 'options' => array('closeOnOuterClick' => false))));
         }
     }
+
+    public function performActionExport()
+    {
+        $CNF = &$this->_oModule->_oConfig->CNF;
+
+        $aFields = explode(',', getParam($CNF['PARAM_EXPORT_FIELDS']));
+        if(empty($aFields) || !is_array($aFields))
+            return echoJson(array());
+
+        
+        $aTitles = $aConverters = array();
+        foreach($aFields as $sField) {
+            $aTitles[$sField] = _t('_bx_accnt_txt_field_' . $sField);
+            
+            $sConverter = '_exportFieldConverter' . bx_gen_method_name($sField);
+            if(method_exists($this, $sConverter))
+                $aConverters[$sField] = $sConverter;
+        }
+
+        $sMethod = '_exportTo' . bx_gen_method_name(getParam($CNF['PARAM_EXPORT_TO']));
+        if(!method_exists($this, $sMethod))
+            return echoJson(array());
+
+        $aIds = bx_get('ids');
+        if(!$aIds || !is_array($aIds))
+            $aIds = $this->_oModule->_oDb->getAccountIds();
+
+        if(($aFile = $this->$sMethod($aIds, $aFields, $aTitles, $aConverters)) === false)
+            return echoJson(array());
+
+        list($sFilePath, $sFileUrl) = $aFile;
+
+        $oStorage = BxDolStorage::getObjectInstance($CNF['OBJECT_STORAGE_FILES']);
+        if($oStorage && ($iFileId = $oStorage->storeFileFromPath($sFilePath, true, bx_get_logged_profile_id())) !== false) {
+            $sFileUrl = $oStorage->getFileUrlById($iFileId);
+
+            @unlink($sFilePath);
+        }
+
+        return echoJson(array('redirect' => $sFileUrl));
+    }
     
     public function performActionConfirm()
     {
@@ -584,6 +625,107 @@ class BxAccntGridAdministration extends BxBaseModProfileGridAdministration
         
         return parent::_isVisibleGrid($a);
     }
+
+    protected function _exportToCsv($aIds, $aFields, $aTitles, $aConverters)
+    {
+        $sFileDiv = ';';
+        $sFileName = 'accounts-' . date('Y.m.d') . '.csv';
+        $sFilePath = BX_DIRECTORY_PATH_TMP . $sFileName;
+        $oFileHandler = fopen($sFilePath, 'w');
+        if(!$oFileHandler)
+            return false;
+
+        fputcsv($oFileHandler, $aTitles, $sFileDiv);
+
+        $aFieldsFlip = array_flip($aFields);
+        $oAccountQuery = BxDolAccountQuery::getInstance();
+
+        foreach($aIds as $iId) {
+            $aAccount = $oAccountQuery->getInfoById($iId);
+            if(empty($aAccount) || !is_array($aAccount))
+                continue;
+            
+            $aConvert = array_intersect_key($aConverters, $aAccount);
+            foreach($aConvert as $sField => $sMethod)
+                $aAccount[$sField] = $this->$sMethod($aAccount[$sField]);
+
+            fputcsv($oFileHandler, array_intersect_key($aAccount, $aFieldsFlip), $sFileDiv);
+        }
+
+        fclose($oFileHandler);
+
+        return array($sFilePath, BX_DOL_URL_ROOT . 'tmp/' . $sFileName);
+    }
+
+    protected function _exportToXml($aIds, $aFields, $aTitles, $aConverters)
+    {
+        $sFileName = 'accounts-' . date('Y.m.d') . '.xml';
+        $sFilePath = BX_DIRECTORY_PATH_TMP . $sFileName;
+        $oFileHandler = fopen($sFilePath, 'w');
+        if(!$oFileHandler)
+            return false;
+
+        $aFieldsFlip = array_flip($aFields);
+        $oAccountQuery = BxDolAccountQuery::getInstance();
+
+        $oXML = xmlwriter_open_memory();
+        xmlwriter_set_indent($oXML, 1);
+        xmlwriter_set_indent_string($oXML, '  ');
+        
+        xmlwriter_start_document($oXML, '1.0', 'UTF-8');
+        xmlwriter_start_element($oXML, 'accounts');
+
+        foreach($aIds as $iId) {
+            $aAccount = $oAccountQuery->getInfoById($iId);
+            if(empty($aAccount) || !is_array($aAccount))
+                continue;
+
+            $aConvert = array_intersect_key($aConverters, $aAccount);
+            foreach($aConvert as $sField => $sMethod)
+                $aAccount[$sField] = $this->$sMethod($aAccount[$sField]);
+
+            xmlwriter_start_element($oXML, 'account');
+            $aAccountFields = array_intersect_key($aAccount, $aFieldsFlip);
+            foreach($aAccountFields as $sAccountField => $sAccountValue) {
+                xmlwriter_start_element($oXML, $sAccountField);
+                xmlwriter_write_cdata($oXML, $sAccountValue);
+                xmlwriter_end_element($oXML);
+            }
+            xmlwriter_end_element($oXML);
+        }
+
+        xmlwriter_end_document($oXML);
+
+        fwrite($oFileHandler, xmlwriter_output_memory($oXML));
+        fclose($oFileHandler);
+
+        return array($sFilePath, BX_DOL_URL_ROOT . 'tmp/' . $sFileName);
+    }
+
+    protected function _exportFieldConverterAdded($mixedValue)
+    {
+        return $this->__exportFieldConverterDate($mixedValue);
+    }
+
+    protected function _exportFieldConverterChanged($mixedValue)
+    {
+        return $this->__exportFieldConverterDate($mixedValue);
+    }
+
+    protected function _exportFieldConverterLogged($mixedValue)
+    {
+        return $this->__exportFieldConverterDateTime($mixedValue);
+    }
+
+    protected function __exportFieldConverterDate($mixedValue)
+    {
+        return date('Y.m.d', $mixedValue);
+    }
+
+    protected function __exportFieldConverterDateTime($mixedValue)
+    {
+        return date('Y.m.d H:i', $mixedValue);
+    }
 }
 
 /** @} */

+ 33 - 5
modules/boonex/accounts/classes/BxAccntModule.php

@@ -26,6 +26,34 @@ class BxAccntModule extends BxBaseModGeneralModule
         return array ();
     }
 
+    public function serviceGetOptionsExportTo()
+    {
+        return array(
+            'csv' => _t('_bx_accnt_txt_export_to_csv'),
+            'xml' => _t('_bx_accnt_txt_export_to_xml'),
+        );
+    }
+
+    public function serviceGetOptionsExportFields()
+    {
+        $aResult = array();
+
+        $aFields = $this->_oDb->getAccountFields();
+        if(empty($aFields['original']) || !is_array($aFields['original']))
+            return $aResult;
+
+        foreach($aFields['original'] as $sField) {
+            $sLangKey = '_bx_accnt_txt_field_' . $sField;
+            $sLangString = _t($sLangKey);
+            if(strcmp($sLangKey, $sLangString) == 0)
+                continue;
+
+            $aResult[] = array('key' => $sField, 'value' => $sLangString);
+        }
+
+        return $aResult;
+    }
+
     /**
      * @page service Service Calls
      * @section bx_accounts Accounts
@@ -43,21 +71,21 @@ class BxAccntModule extends BxBaseModGeneralModule
     /** 
      * @ref bx_accounts-get_menu_addon_manage_tools "get_menu_addon_manage_tools"
      */
-	public function serviceGetMenuAddonManageTools()
-	{
-		bx_import('SearchResult', $this->_aModule);
+    public function serviceGetMenuAddonManageTools()
+    {
+        bx_import('SearchResult', $this->_aModule);
         $sClass = $this->_aModule['class_prefix'] . 'SearchResult';
         $o = new $sClass();
         $o->unsetPaginate();
         $iNumTotal = $o->getNum();
         
         $o->fillFilters(array(
-			'unconfirmed' => 1,
+            'unconfirmed' => 1,
             'non_robot' => 'Robot'
         ));
       
         return array('counter1_value' => $o->getNum(),'counter3_value' => $iNumTotal, 'counter1_caption' => _t('_bx_accnt_menu_dashboard_manage_tools_addon_counter1_caption'));
-	}
+    }
     
     public function checkAllowedConfirm(&$aDataEntry, $isPerformAction = false)
     {

+ 1 - 5
modules/boonex/accounts/classes/BxAccntStudioPage.php

@@ -18,16 +18,12 @@ class BxAccntStudioPage extends BxTemplStudioModule
 
     function __construct($sModule, $mixedPageName, $sPage = "")
     {
-        $this->sPageDefault = BX_DOL_STUDIO_MOD_TYPE_MANAGE;
-
         $this->_sModule = 'bx_accounts';
     	$this->_oModule = BxDolModule::getInstance($this->_sModule);
 
         parent::__construct($sModule, $mixedPageName, $sPage);
 
-        $this->aMenuItems = array(
-            array('name' => BX_DOL_STUDIO_MOD_TYPE_MANAGE, 'icon' => 'wrench', 'title' => '_bx_accnt_menu_item_title_manage')
-        );
+        $this->aMenuItems[BX_DOL_STUDIO_MOD_TYPE_MANAGE] = array('name' => BX_DOL_STUDIO_MOD_TYPE_MANAGE, 'icon' => 'wrench', 'title' => '_bx_accnt_menu_item_title_manage');
     }
 
     protected function getManage()

+ 16 - 0
modules/boonex/accounts/install/langs/en.xml

@@ -3,6 +3,9 @@
     <string name="_bx_accnt"><![CDATA[Accounts]]></string>
     <string name="_bx_accounts"><![CDATA[Accounts]]></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>
@@ -68,6 +71,7 @@
     <string name="_bx_accnt_grid_action_title_adm_suspend"><![CDATA[Suspend]]></string>
     <string name="_bx_accnt_grid_action_title_adm_confirm"><![CDATA[Confirm]]></string>
     <string name="_bx_accnt_grid_action_title_adm_edit_email"><![CDATA[Edit Email]]></string>
+    <string name="_bx_accnt_grid_action_title_adm_export"><![CDATA[Export]]></string>
     <string name="_bx_accnt_grid_action_title_adm_resend_cemail"><![CDATA[Resend Confirmation]]></string>
     <string name="_bx_accnt_grid_action_title_adm_resend_remail"><![CDATA[Resend Reset Password]]></string>
     <string name="_bx_accnt_grid_action_title_adm_reset_password"><![CDATA[Reset Password]]></string>
@@ -92,4 +96,16 @@
     <string name="_bx_accnt_txt_see_more"><![CDATA[See more]]></string>
     <string name="_bx_accnt_txt_copy_to_clipboard"><![CDATA[Copy to Clipboard]]></string>
     <string name="_bx_accnt_txt_not_operator"><![CDATA[Not an Operator]]></string>
+    <string name="_bx_accnt_txt_export_to_csv"><![CDATA[CSV]]></string>
+    <string name="_bx_accnt_txt_export_to_xml"><![CDATA[XML]]></string>
+    <string name="_bx_accnt_txt_field_name"><![CDATA[Name]]></string>
+    <string name="_bx_accnt_txt_field_email"><![CDATA[Email]]></string>
+    <string name="_bx_accnt_txt_field_email_confirmed"><![CDATA[Email Confirmed]]></string>
+    <string name="_bx_accnt_txt_field_phone"><![CDATA[Phone]]></string>
+    <string name="_bx_accnt_txt_field_receive_updates"><![CDATA[Receive Updates]]></string>
+    <string name="_bx_accnt_txt_field_receive_news"><![CDATA[Receive News]]></string>
+    <string name="_bx_accnt_txt_field_added"><![CDATA[Added]]></string>
+    <string name="_bx_accnt_txt_field_changed"><![CDATA[Changed]]></string>
+    <string name="_bx_accnt_txt_field_logged"><![CDATA[Logged]]></string>
+    <string name="_bx_accnt_txt_field_ip"><![CDATA[IP]]></string>
 </resources>

+ 8 - 0
modules/boonex/accounts/install/sql/disable.sql

@@ -1,6 +1,14 @@
 SET @sName = 'bx_accounts';
 
 
+-- SETTINGS
+SET @iTypeId = (SELECT `ID` FROM `sys_options_types` WHERE `name` = @sName LIMIT 1);
+SET @iCategId = (SELECT `ID` FROM `sys_options_categories` WHERE `type_id` = @iTypeId LIMIT 1);
+DELETE FROM `sys_options` WHERE `category_id` = @iCategId;
+DELETE FROM `sys_options_categories` WHERE `type_id` = @iTypeId;
+DELETE FROM `sys_options_types` WHERE `id` = @iTypeId;
+
+
 -- PAGES
 DELETE FROM `sys_objects_page` WHERE `module` = @sName;
 DELETE FROM `sys_pages_blocks` WHERE `module` = @sName;

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

@@ -1,6 +1,21 @@
 SET @sName = 'bx_accounts';
 
 
+-- SETTINGS
+SET @iTypeOrder = (SELECT MAX(`order`) FROM `sys_options_types` WHERE `group` = 'modules');
+INSERT INTO `sys_options_types`(`group`, `name`, `caption`, `icon`, `order`) VALUES 
+('modules', @sName, '_bx_accounts', 'bx_accounts@modules/boonex/accounts/|std-icon.svg', IF(ISNULL(@iTypeOrder), 1, @iTypeOrder + 1));
+SET @iTypeId = LAST_INSERT_ID();
+
+INSERT INTO `sys_options_categories` (`type_id`, `name`, `caption`, `order`)
+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_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);
+
+
 -- PAGE: module administration
 INSERT INTO `sys_objects_page`(`object`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `uri`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
 ('bx_accounts_administration', '_bx_accnt_page_title_sys_manage_administration', '_bx_accnt_page_title_manage', @sName, 5, 192, 1, 'accounts-administration', 'page.php?i=accounts-administration', '', '', '', 0, 1, 0, '', '');
@@ -87,9 +102,11 @@ INSERT INTO `sys_grid_actions` (`object`, `type`, `name`, `title`, `icon`, `icon
 ('bx_accounts_administration', 'bulk', 'confirm', '_bx_accnt_grid_action_title_adm_confirm', '', 0, 0, 5),
 ('bx_accounts_administration', 'bulk', 'delete', '_bx_accnt_grid_action_title_adm_delete', '', 0, 1, 6),
 ('bx_accounts_administration', 'bulk', 'delete_with_content', '_bx_accnt_grid_action_title_adm_delete_with_content', '', 0, 1, 7),
+('bx_accounts_administration', 'bulk', 'export', '_bx_accnt_grid_action_title_adm_export', '', 0, 0, 8),
 ('bx_accounts_administration', 'single', 'edit_email', '_bx_accnt_grid_action_title_adm_edit_email', '', 0, 0, 0),
 ('bx_accounts_administration', 'single', 'reset_password', '_bx_accnt_grid_action_title_adm_reset_password', '', 0, 0, 0),
 ('bx_accounts_administration', 'single', 'resend_remail', '_bx_accnt_grid_action_title_adm_resend_remail', '', 0, 0, 0),
 ('bx_accounts_administration', 'single', 'unlock_account', '_bx_accnt_grid_action_title_adm_unlock_account', '', 0, 0, 0),
 ('bx_accounts_administration', 'single', 'settings', '_bx_accnt_grid_action_title_adm_more_actions', 'cog', 1, 0, 2),
-('bx_accounts_administration', 'independent', 'add', '_bx_accnt_grid_action_title_adm_more_add', 'plus', 0, 0, 0);
+('bx_accounts_administration', 'independent', 'add', '_bx_accnt_grid_action_title_adm_more_add', 'plus', 0, 0, 0),
+('bx_accounts_administration', 'independent', 'export', '_bx_accnt_grid_action_title_adm_export', 'download', 0, 0, 1);

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

@@ -3,6 +3,9 @@
     <string name="_bx_accnt"><![CDATA[Аккаунты]]></string>
     <string name="_bx_accounts"><![CDATA[Аккаунты]]></string>
 
+    <string name="_bx_accounts_option_export_to"><![CDATA[Экспортировать в]]></string>
+    <string name="_bx_accounts_option_export_fields"><![CDATA[Экспортируемые поля]]></string>
+
     <string name="_bx_accounts_form_display_account_settings_email_popup"><![CDATA[Изменить email]]></string>
     <string name="_bx_accounts_form_display_account_create_popup"><![CDATA[Создать новый аккаунт]]></string>
     <string name="_bx_accounts_form_display_account_settings_password_popup"><![CDATA[Сбросить пароль]]></string>
@@ -44,7 +47,7 @@
     <string name="_bx_accnt_menu_dashboard_manage_tools_addon_counter1_caption"><![CDATA[неподтверждено]]></string>
 
     <string name="_bx_accnt_acl_action_edit_any_account"><![CDATA[Редактировать любой аккаунт]]></string>
-	<string name="_bx_accnt_acl_action_delete_any_account"><![CDATA[Удалять любой аккаунт]]></string>
+    <string name="_bx_accnt_acl_action_delete_any_account"><![CDATA[Удалять любой аккаунт]]></string>
 
     <string name="_bx_accnt_grid_filter_item_title_adm_select_one_filter1"><![CDATA[Все статусы]]></string>
     <string name="_bx_accnt_grid_filter_item_title_adm_select_one_filter2"><![CDATA[Все]]></string>
@@ -68,6 +71,7 @@
     <string name="_bx_accnt_grid_action_title_adm_suspend"><![CDATA[Заблокировать]]></string>
     <string name="_bx_accnt_grid_action_title_adm_confirm"><![CDATA[Подтвердить]]></string>
     <string name="_bx_accnt_grid_action_title_adm_edit_email"><![CDATA[Изменить email]]></string>
+    <string name="_bx_accnt_grid_action_title_adm_export"><![CDATA[Экспортировать]]></string>
     <string name="_bx_accnt_grid_action_title_adm_resend_cemail"><![CDATA[Переслать подтверждение]]></string>
     <string name="_bx_accnt_grid_action_title_adm_resend_remail"><![CDATA[Переслать сброс пароля]]></string>
     <string name="_bx_accnt_grid_action_title_adm_reset_password"><![CDATA[Сбросить пароль]]></string>
@@ -92,4 +96,16 @@
     <string name="_bx_accnt_txt_see_more"><![CDATA[Ещё]]></string>
     <string name="_bx_accnt_txt_copy_to_clipboard"><![CDATA[Скопировать]]></string>
     <string name="_bx_accnt_txt_not_operator"><![CDATA[Не оператор]]></string>
+    <string name="_bx_accnt_txt_export_to_csv"><![CDATA[CSV]]></string>
+    <string name="_bx_accnt_txt_export_to_xml"><![CDATA[XML]]></string>
+    <string name="_bx_accnt_txt_field_name"><![CDATA[Имя]]></string>
+    <string name="_bx_accnt_txt_field_email"><![CDATA[Email]]></string>
+    <string name="_bx_accnt_txt_field_email_confirmed"><![CDATA[Email подтвержден]]></string>
+    <string name="_bx_accnt_txt_field_phone"><![CDATA[Телефон]]></string>
+    <string name="_bx_accnt_txt_field_receive_updates"><![CDATA[Получать обновления]]></string>
+    <string name="_bx_accnt_txt_field_receive_news"><![CDATA[Получать новости]]></string>
+    <string name="_bx_accnt_txt_field_added"><![CDATA[Создан]]></string>
+    <string name="_bx_accnt_txt_field_changed"><![CDATA[Изменен]]></string>
+    <string name="_bx_accnt_txt_field_logged"><![CDATA[Заходил]]></string>
+    <string name="_bx_accnt_txt_field_ip"><![CDATA[IP]]></string>
 </resources>