فهرست منبع

Merge branch 'master' of https://github.com/unaio/una

AntonLV 8 سال پیش
والد
کامیت
d7317f8c55
24فایلهای تغییر یافته به همراه1149 افزوده شده و 2 حذف شده
  1. 8 0
      inc/classes/BxDolAccountQuery.php
  2. 1 1
      modules/base/groups/classes/BxBaseModGroupsModule.php
  3. 5 0
      modules/base/profile/classes/BxBaseModProfileModule.php
  4. 68 0
      modules/boonex/massmailer/classes/BxMassMailerConfig.php
  5. 71 0
      modules/boonex/massmailer/classes/BxMassMailerDb.php
  6. 37 0
      modules/boonex/massmailer/classes/BxMassMailerFormEntry.php
  7. 42 0
      modules/boonex/massmailer/classes/BxMassMailerFormsEntryHelper.php
  8. 183 0
      modules/boonex/massmailer/classes/BxMassMailerGridCampaigns.php
  9. 136 0
      modules/boonex/massmailer/classes/BxMassMailerModule.php
  10. 24 0
      modules/boonex/massmailer/classes/BxMassMailerPageBrowse.php
  11. 20 0
      modules/boonex/massmailer/classes/BxMassMailerTemplate.php
  12. 77 0
      modules/boonex/massmailer/install/config.php
  13. 20 0
      modules/boonex/massmailer/install/installer.php
  14. 94 0
      modules/boonex/massmailer/install/langs/en.xml
  15. 22 0
      modules/boonex/massmailer/install/sql/disable.sql
  16. 121 0
      modules/boonex/massmailer/install/sql/enable.sql
  17. 96 0
      modules/boonex/massmailer/install/sql/install.sql
  18. 15 0
      modules/boonex/massmailer/install/sql/uninstall.sql
  19. 56 0
      modules/boonex/massmailer/js/manage_tools.js
  20. 18 0
      modules/boonex/massmailer/request.php
  21. 1 0
      modules/boonex/massmailer/template/author_link.html
  22. 10 0
      modules/boonex/massmailer/template/images/icons/std-icon.svg
  23. 19 0
      modules/boonex/massmailer/template/manage_item.html
  24. 5 1
      template/scripts/BxBaseFormView.php

+ 8 - 0
inc/classes/BxDolAccountQuery.php

@@ -327,6 +327,14 @@ class BxDolAccountQuery extends BxDolDb implements iBxDolSingleton
 
     			$sWhereClause = " AND `ta`.`added` > :date AND `ta`.`added` < UNIX_TIMESTAMP()";
     			break;
+                
+            case 'confirmed':
+    			$sWhereClause = " AND (`ta`.`email_confirmed` = 1 OR `ta`.`phone_confirmed` = 1)";
+    			break;
+                
+            case 'unconfirmed':
+    			$sWhereClause = " AND (`ta`.`email_confirmed` = 0 AND `ta`.`phone_confirmed` = 0)";
+    			break;
     	}
 
     	$sGroupClause = $sGroupClause ? "GROUP BY " . $sGroupClause : "";

+ 1 - 1
modules/base/groups/classes/BxBaseModGroupsModule.php

@@ -477,7 +477,7 @@ class BxBaseModGroupsModule extends BxBaseModProfileModule
      */
     public function checkAllowedPost ($aDataEntry, $isPerformAction = false)
     {
-        if ($this->isFan($aDataEntry[$this->_oConfig->CNF['FIELD_ID']]))
+        if ($this->isFan($aDataEntry[$this->_oConfig->CNF['FIELD_ID']]) || ($aDataEntry[$this->_oConfig->CNF['FIELD_ID']] == BxDolProfile::getInstance()->getContentId() && BxDolProfile::getInstance()->getModule() == $this->getName()))
             return CHECK_ACTION_RESULT_ALLOWED;
 
         return _t('_sys_txt_access_denied');

+ 5 - 0
modules/base/profile/classes/BxBaseModProfileModule.php

@@ -119,6 +119,11 @@ class BxBaseModProfileModule extends BxBaseModGeneralModule implements iBxDolCon
 
 	public function servicePrivateProfileMsg()
     {
+        $mixedContent = $this->_getContent();
+        if ($mixedContent) {
+            list($iContentId, $aContentInfo) = $mixedContent;
+            return $this->checkAllowedView($aContentInfo);
+        }
         return MsgBox(_t('_sys_access_denied_to_private_content'));
     }
     

+ 68 - 0
modules/boonex/massmailer/classes/BxMassMailerConfig.php

@@ -0,0 +1,68 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    Mass mailer
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+class BxMassMailerConfig extends BxBaseModGeneralConfig
+{
+    function __construct($aModule)
+    {
+        parent::__construct($aModule);
+        $this->CNF = array (
+            // database tables
+            'TABLE_CAMPAIGNS' => $aModule['db_prefix'] . 'campaigns',
+            'TABLE_SEGMENTS' => $aModule['db_prefix'] . 'segments',
+            
+             // database fields
+            'FIELD_ID' => 'id',
+            'FIELD_AUTHOR' => 'author',
+            'FIELD_TITLE' => 'title',
+            'FIELD_SUBJECT' => 'subject',
+            'FIELD_FROM_NAME' => 'from_name',
+            'FIELD_REPLY_TO' => 'reply_to',
+            'FIELD_BODY' => 'body',
+            'FIELD_EMAIL_LIST' => 'email_list',
+            'FIELD_SEGMENTS' => 'segments',
+            'FIELD_DATE_CREATED' => 'date_created',
+            'FIELD_DATE_SENT' => 'date_sent',
+            'FIELD_CAMPAIGN_ID' => 'campaign_id',
+            
+            // page URIs
+            'URI_MANAGE_CAMPAIGNS' => 'massmailer-campaigns',
+            'URI_ADD_CAMPAIGN' => 'create-campaign',
+            'URI_EDIT_CAMPAIGN' => 'edit-campaign',
+            'URI_VIEW_CAMPAIGN' => 'view-campaign',
+            'URL_MANAGE_CAMPAIGNS' => 'page.php?i=massmailer-campaigns',
+            
+            // objects
+            'OBJECT_FORM_ENTRY' => 'bx_massmailer',
+            'OBJECT_FORM_ENTRY_DISPLAY_EDIT' => 'bx_massmailer_campaign_edit',
+            'OBJECT_FORM_ENTRY_DISPLAY_VIEW' => 'bx_massmailer_campaign_view',
+            'OBJECT_FORM_ENTRY_DISPLAY_ADD' => 'bx_massmailer_campaign_add',
+            'OBJECT_MENU_SUBMENU' => 'bx_massmailer_submenu',
+            'OBJECT_GRID_CAMPAIGNS' => 'bx_massmailer_campaigns',
+            'OBJECT_GRID_LETTERS' => 'bx_massmailer_letters',
+        );
+        
+        $this->_aJsClasses = array(
+            'manage_tools' => 'BxMassMailerManageTools'
+        );
+
+        $this->_aJsObjects = array(
+            'manage_tools' => 'oBxMassMailerManageTools'
+        );
+
+        $this->_aGridObjects = array(
+            'campaigns' => $this->CNF['OBJECT_GRID_CAMPAIGNS'],
+            'letters' => $this->CNF['OBJECT_GRID_LETTERS'],
+        );
+    }
+}
+
+/** @} */

+ 71 - 0
modules/boonex/massmailer/classes/BxMassMailerDb.php

@@ -0,0 +1,71 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    Mass mailer
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+class BxMassMailerDb extends BxBaseModGeneralDb
+{
+    function __construct(&$oConfig)
+    {
+        parent::__construct($oConfig);
+    }
+    
+    public function copyCampaign($iCampaignId)
+    {
+        $CNF = &$this->_oConfig->CNF;
+        $aBindings = array(
+            'campaign_id' => $iCampaignId,
+            'date_created' => time()
+        );
+        $this->query("INSERT INTO `" . $CNF['TABLE_CAMPAIGNS'] . "` (`" . $CNF['FIELD_AUTHOR'] . "`, `" . $CNF['FIELD_TITLE'] . "`, `" . $CNF['FIELD_BODY'] . "`, `" . $CNF['FIELD_SEGMENTS'] . "`, `" . $CNF['FIELD_DATE_CREATED'] . "`, `" . $CNF['FIELD_SUBJECT'] . "`, `" . $CNF['FIELD_FROM_NAME'] . "`, `" . $CNF['FIELD_REPLY_TO'] . "`) SELECT `" . $CNF['FIELD_AUTHOR'] . "`, CONCAT(`" . $CNF['FIELD_TITLE'] . "`, '" . _t('_bx_massmailer_txt_copy_title') . "'), `" . $CNF['FIELD_BODY'] . "`, `" . $CNF['FIELD_SEGMENTS'] . "`, :date_created, `" . $CNF['FIELD_SUBJECT'] . "`, `" . $CNF['FIELD_FROM_NAME'] . "`, `" . $CNF['FIELD_REPLY_TO'] . "`  FROM `" . $CNF['TABLE_CAMPAIGNS'] . "` WHERE `id` = :campaign_id", $aBindings);
+        return $this->lastId();
+    }
+    
+    public function sendCampaign($iCampaignId, $sEmailList)
+    {
+        $CNF = &$this->_oConfig->CNF;
+        $aBindings = array(
+            'campaign_id' => $iCampaignId,
+            'email_list' => $sEmailList,
+            'date_sent' => time()
+        );
+        $this->query("UPDATE `" . $CNF['TABLE_CAMPAIGNS'] . "` SET `" . $CNF['FIELD_EMAIL_LIST'] . "` = :email_list, `" . $CNF['FIELD_DATE_SENT'] . "` = :date_sent WHERE `id` = :campaign_id", $aBindings);
+    }
+    
+    public function getCampaignInfoById ($iContentId)
+    {
+        $CNF = &$this->_oConfig->CNF;
+        $sQuery = $this->prepare ("SELECT * FROM `" . $CNF['TABLE_CAMPAIGNS'] . "` WHERE `" . $CNF['FIELD_ID'] . "` = ?", $iContentId);
+        return $this->getRow($sQuery);
+    }
+    
+    public function getSegmentInfoById ($iSegmentId)
+    {
+        $CNF = &$this->_oConfig->CNF;
+        $sQuery = $this->prepare ("SELECT * FROM `" . $CNF['TABLE_SEGMENTS'] . "` WHERE `" . $CNF['FIELD_ID'] . "` = ?", $iSegmentId);
+        return $this->getRow($sQuery);
+    }
+    
+    public function getSegments()
+    {
+        $CNF = &$this->_oConfig->CNF;
+        $sQuery = $this->prepare ("SELECT `" . $CNF['FIELD_ID'] . "`, `" . $CNF['FIELD_TITLE'] . "` FROM `" . $CNF['TABLE_SEGMENTS'] . "`");
+        return $this->getPairs($sQuery, $CNF['FIELD_ID'], $CNF['FIELD_TITLE']);
+    }
+    
+    public function getAccountsByAcl($sTerms)
+    {
+        $sSql = "SELECT `ta`.* FROM  `sys_accounts` `ta` INNER JOIN `sys_profiles` AS `tp`  ON `tp`.`account_id`=`ta`.`id` " . $sTerms;
+        echo $sSql;
+        return $this->getAll($sSql);
+    }
+    
+}
+
+/** @} */

+ 37 - 0
modules/boonex/massmailer/classes/BxMassMailerFormEntry.php

@@ -0,0 +1,37 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    Mass mailer
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+/**
+ * Create/Edit entry form
+ */
+class BxMassMailerFormEntry extends BxTemplFormView
+{
+    public function __construct($aInfo, $oTemplate = false)
+    {
+        $this->MODULE = 'bx_massmailer';
+        $this->_oModule = BxDolModule::getInstance($this->MODULE);
+        parent::__construct($aInfo, $oTemplate);
+        
+        $CNF = &$this->_oModule->_oConfig->CNF;
+        if (isset( $this->aInputs[$CNF['FIELD_SEGMENTS']]))
+            $this->aInputs[$CNF['FIELD_SEGMENTS']]['values'] = $this->_oModule->getSegmentValues();
+    }
+
+    public function insert ($aValsToAdd = array(), $isIgnore = false)
+    {
+        $CNF = &$this->_oModule->_oConfig->CNF;
+        $aValsToAdd[$CNF['FIELD_DATE_CREATED']] = time();
+        $aValsToAdd[$CNF['FIELD_AUTHOR']] = bx_get_logged_profile_id();
+        return parent::insert ($aValsToAdd, $isIgnore);
+    }
+}
+
+/** @} */

+ 42 - 0
modules/boonex/massmailer/classes/BxMassMailerFormsEntryHelper.php

@@ -0,0 +1,42 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    Mass mailer
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+/**
+ * Entry forms helper functions
+ */
+class BxMassMailerFormsEntryHelper extends BxBaseModTextFormsEntryHelper
+{
+    public function __construct($oModule)
+    {
+        parent::__construct($oModule);
+    }
+    
+    public function editDataForm ($iContentId, $sDisplay = false, $sCheckFunction = false, $bErrorMsg = true)
+    {
+        $CNF = &$this->_oModule->_oConfig->CNF;
+        $CNF['TABLE_ENTRIES'] = $CNF['TABLE_CAMPAIGNS'];
+        return parent::editDataForm($iContentId, $CNF['OBJECT_FORM_ENTRY_DISPLAY_EDIT'], $sCheckFunction = false, $bErrorMsg = true);
+    }
+    
+    public function onDataEditAfter($iContentId, $aContentInfo, $aTrackTextFieldsChanges, $oProfile, $oForm)
+    {
+        $CNF = &$this->_oModule->_oConfig->CNF;
+        $this->_redirectAndExit('page.php?i=' . $CNF['URI_MANAGE_CAMPAIGNS']);
+    }
+    
+    public function onDataAddAfter($iAccountId, $iContentId)
+    {
+        $CNF = &$this->_oModule->_oConfig->CNF;
+        $this->_redirectAndExit('page.php?i=' . $CNF['URI_MANAGE_CAMPAIGNS']);
+    }
+}
+
+/** @} */

+ 183 - 0
modules/boonex/massmailer/classes/BxMassMailerGridCampaigns.php

@@ -0,0 +1,183 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+* Copyright (c) UNA, Inc - https://una.io
+* MIT License - https://opensource.org/licenses/MIT
+*
+* @defgroup    Mass mailer
+* @ingroup     UnaModules
+* 
+* @{
+*/
+
+class BxMassMailerGridCampaigns extends BxTemplGrid
+{
+    public function __construct ($aOptions, $oTemplate = false)
+    {
+        $this->MODULE = 'bx_massmailer';
+        $this->_oModule = BxDolModule::getInstance($this->MODULE);
+        parent::__construct ($aOptions, $oTemplate);
+    }
+    
+    protected function _getCellDateCreated($mixedValue, $sKey, $aField, $aRow)
+    {
+        return parent::_getCellDefault(bx_time_js($mixedValue), $sKey, $aField, $aRow);
+    }
+    
+    protected function _getCellDateSent($mixedValue, $sKey, $aField, $aRow)
+    {
+        $sValue = bx_time_js($mixedValue);
+        if ($mixedValue == '0')
+            $sValue = _t('_bx_massmailer_txt_never_sent');
+        return parent::_getCellDefault($sValue, $sKey, $aField, $aRow);
+    }
+    
+    protected function _getActionCopy($sType, $sKey, $a, $isSmall = false, $isDisabled = false, $aRow = array())
+    {
+        if(isset($aRow["date_sent"]) && $aRow["date_sent"] == '0')
+            return '';
+        return parent::_getActionDefault ($sType, $sKey, $a, $isSmall, $isDisabled, $aRow);
+    }
+    
+    protected function _getActionSendTest($sType, $sKey, $a, $isSmall = false, $isDisabled = false, $aRow = array())
+    {
+        if(isset($aRow["date_sent"]) && $aRow["date_sent"] != '0')
+            return '';
+        return parent::_getActionDefault ($sType, $sKey, $a, $isSmall, $isDisabled, $aRow);
+    }
+    
+    protected function _getActionSendAll($sType, $sKey, $a, $isSmall = false, $isDisabled = false, $aRow = array())
+    {
+        if(isset($aRow["date_sent"]) && $aRow["date_sent"] != '0')
+            return '';
+        return parent::_getActionDefault ($sType, $sKey, $a, $isSmall, $isDisabled, $aRow);
+    }
+    
+    protected function _getActionAdd ($sType, $sKey, $a, $isSmall = false, $isDisabled = false, $aRow = array())
+    {
+        $CNF = &$this->_oModule->_oConfig->CNF;
+        $sUrl = BX_DOL_URL_ROOT . BxDolPermalinks::getInstance()->permalink('page.php?i=' . $CNF['URI_ADD_CAMPAIGN']);
+
+        unset($a['attr']['bx_grid_action_independent']);
+        $a['attr'] = array_merge($a['attr'], array(
+            "onclick" => "window.open('" . $sUrl . "','_self');"
+        ));
+
+        return parent::_getActionDefault ($sType, $sKey, $a, $isSmall, $isDisabled, $aRow);
+    }
+    
+    protected function _getActionEdit ($sType, $sKey, $a, $isSmall = false, $isDisabled = false, $aRow = array())
+    {
+        if(isset($aRow["date_sent"]) && $aRow["date_sent"] != '0')
+            return '';
+
+        $CNF = &$this->_oModule->_oConfig->CNF;
+
+        $sUrl = BX_DOL_URL_ROOT . BxDolPermalinks::getInstance()->permalink('page.php?i=' . $CNF['URI_EDIT_CAMPAIGN'] . '&id=' . $aRow[$CNF['FIELD_ID']]);
+
+        $a['attr'] = array_merge($a['attr'], array(
+            "onclick" => "window.open('" . $sUrl . "','_self');"
+        ));
+
+        return $this->_getActionDefault ($sType, $sKey, $a, $isSmall, $isDisabled, $aRow);
+    }
+    
+    protected function _getActionView ($sType, $sKey, $a, $isSmall = false, $isDisabled = false, $aRow = array())
+    {
+        if(isset($aRow["date_sent"]) && $aRow["date_sent"] == '0')
+            return '';
+        
+        $CNF = &$this->_oModule->_oConfig->CNF;
+        
+        $sUrl = BX_DOL_URL_ROOT . BxDolPermalinks::getInstance()->permalink('page.php?i=' . $CNF['URI_VIEW_CAMPAIGN'] . '&id=' . $aRow[$CNF['FIELD_ID']]);
+
+        unset($a['attr']['bx_grid_action_independent']);
+        $a['attr'] = array_merge($a['attr'], array(
+            "onclick" => "window.open('" . $sUrl . "','_self');"
+        ));
+
+        return parent::_getActionDefault ($sType, $sKey, $a, $isSmall, $isDisabled, $aRow);
+    }
+    
+    protected function _getCellAuthor($mixedValue, $sKey, $aField, $aRow)
+    {
+        $oProfile = BxDolProfile::getInstance($aRow['author']);
+        if (!$oProfile)
+            $oProfile = BxDolProfileUndefined::getInstance();
+        return parent::_getCellDefault($oProfile->getDisplayName(), $sKey, $aField, $aRow);
+    }
+
+    public function performActionSendTest()
+    {
+        $sAction = 'send_test';
+        $aIds = bx_get('ids');
+        $iId = $aIds[0];
+        $oForm = BxDolForm::getObjectInstance('bx_massmailer', 'bx_massmailer_campaign_send_test');
+        if (!$oForm)
+            return '';
+        $oForm->aFormAttrs['action'] = BX_DOL_URL_ROOT . 'grid.php?' . bx_encode_url_params($_GET, array('_r'));
+        $aContentInfo = array('email' => BxDolProfile::getInstance()->getAccountObject()->getEmail());
+        $oForm->initChecker($aContentInfo, array());
+        if($oForm->isSubmittedAndValid()) {
+            $mixedResult = $this->_oModule->sendTest($oForm->aInputs['email']['value'], $iId);
+            if($mixedResult !== false)
+                $aRes = array('grid' => $this->getCode(false), 'blink' => $mixedResult);
+            else
+                $aRes = array('msg' => $mixedResult);
+            echoJson($aRes);
+        }
+        else {
+            
+            $sContent = BxTemplStudioFunctions::getInstance()->popupBox('bx_massmailer_campaign_send_test', _t('_bx_massmailer_campaign_form_send_test_title'), $this->_oModule->_oTemplate->parseHtmlByName('manage_item.html', array(
+                'form_id' => $oForm->id,
+                'form' => $oForm->getCode(true),
+                'object' => $this->_sObject,
+                'action' => $sAction
+            )));
+            echoJson(array('popup' => array('html' => $sContent, 'options' => array('closeOnOuterClick' => false))));
+        }
+    }
+    
+    public function performActionSendAll()
+    {
+        $sAction = 'send_all';
+        $aIds = bx_get('ids');
+        $iId = $aIds[0];
+        $oForm = BxDolForm::getObjectInstance('bx_massmailer', 'bx_massmailer_campaign_send_all');
+        if (!$oForm)
+            return '';
+        $oForm->aFormAttrs['action'] = BX_DOL_URL_ROOT . 'grid.php?' . bx_encode_url_params($_GET, array('_r'));
+        $oForm->initChecker(array(), array());
+        if($oForm->isSubmittedAndValid()) {
+            $mixedResult = $this->_oModule->sendAll($iId);
+            if($mixedResult !== false)
+                $aRes = array('grid' => $this->getCode(false), 'blink' => $mixedResult);
+            else
+                $aRes = array('msg' => $mixedResult);
+            echoJson($aRes);
+        }
+        else {
+            $sContent = BxTemplStudioFunctions::getInstance()->popupBox('bx_massmailer_campaign_send_all', _t('_bx_massmailer_campaign_form_send_all_title'), $this->_oModule->_oTemplate->parseHtmlByName('manage_item.html', array(
+                'form_id' => $oForm->id,
+                'form' => $oForm->getCode(true),
+                'object' => $this->_sObject,
+                'action' => $sAction
+            )));
+            echoJson(array('popup' => array('html' => $sContent, 'options' => array('closeOnOuterClick' => false))));
+        }
+    }
+    
+    public function performActionCopy()
+    {
+        $aIds = bx_get('ids');
+        $iId = $aIds[0];
+        $mixedResult = $this->_oModule->_oDb->copyCampaign($iId);
+        if($mixedResult !== false)
+            $aRes = array('grid' => $this->getCode(false), 'blink' => $mixedResult);
+        else
+            $aRes = array('msg' => $mixedResult);
+        echoJson($aRes);
+    }
+    
+}
+
+/** @} */

+ 136 - 0
modules/boonex/massmailer/classes/BxMassMailerModule.php

@@ -0,0 +1,136 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    Mass mailer
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+class BxMassMailerModule extends BxBaseModGeneralModule
+{
+    function __construct(&$aModule)
+    {
+        parent::__construct($aModule);
+    }
+    
+    public function serviceEntityView ($iContentId = 0, $sDisplay = false)
+    {
+        return 'todo view campagn';
+    }
+    
+    public function serviceManageTool1 ($iContentId = 0, $sDisplay = false)
+    {
+        return 'todo manage custom segments';
+    }
+    
+    public function getSegmentValues()
+    {
+        $CNF = &$this->_oConfig->CNF;
+        $aRv = array('lvl:0' => _t('_bx_massmailer_segments_all'));
+        $oAccountQuery = BxDolAclQuery::getInstance();
+        
+        $aTmp = array();
+        $oAccountQuery->getLevels(array('type' => 'all_active_pair'), $aTmp);
+        foreach ($aTmp as $sKey => $sTmp){
+            if ($sKey != MEMBERSHIP_ID_NON_MEMBER && $sKey != MEMBERSHIP_ID_ACCOUNT)
+                $aRv['lvl:' . $sKey] = _t($sTmp);
+        };
+        
+        $aTmp = $this->_oDb->getSegments();
+        foreach ($aTmp as $sKey => $sTmp){
+            $aRv['cst:' . $sKey] = _t($sTmp);
+        };
+        return $aRv;
+    }
+    
+    public function sendTest($sEmail, $iCampaignId)
+    {
+        $aTmp = $this->getDataForCampaign($iCampaignId);
+        $aTemplate = $aTmp[0];
+        $aCustomHeaders = $aTmp[1];
+         
+        if (!$aTemplate)
+            return false;
+        
+        return sendMail($sEmail, $aTemplate['Subject'], $aTemplate['Body'], 0, array(), BX_EMAIL_SYSTEM, 'html', false, $aCustomHeaders, false);
+    }
+    
+    public function sendAll($iCampaignId)
+    {
+        $aEmails = array();
+        $aTmp = $this->getDataForCampaign($iCampaignId);
+        $aTemplate = $aTmp[0];
+        $aCustomHeaders = $aTmp[1];
+        $aCampaign = $aTmp[2];
+        
+        if (!$aTemplate)
+            return false;
+        
+        $aAccounts = $this->getEmailsBySegment($aCampaign['segments']);
+        foreach ($aAccounts as $aAccount){
+            array_push($aEmails, $aAccount['email']);
+            sendMail($aAccount['email'], $aTemplate['Subject'], $aTemplate['Body'], 0, array(), BX_EMAIL_MASS, 'html', false, $aCustomHeaders, true);
+        }
+        
+        $this->_oDb->sendCampaign($iCampaignId, implode(',', $aEmails));
+        return true;
+    }
+    
+    private function getEmailsBySegment($sSegment)
+    {
+        $aAccounts = array();
+        if (substr_count($sSegment, 'lvl:') > 0){
+            
+            $sLvl = str_replace('lvl:', '', $sSegment);
+            switch ($sLvl) {
+                case 0:
+                    $oAccountQuery = BxDolAccountQuery::getInstance();
+                    $aAccounts = $oAccountQuery->getAccounts(array('type' => 'all'));
+                    break;
+                case MEMBERSHIP_ID_UNCONFIRMED:
+                    $oAccountQuery = BxDolAccountQuery::getInstance();
+                    $aAccounts = $oAccountQuery->getAccounts(array('type' => 'unconfirmed'));
+                    break;
+                case MEMBERSHIP_ID_SUSPENDED:
+                    $aAccounts = $this->_oDb->getAccountsByAcl($this->_oDb->prepareAsString(" AND `tp`.`status`=?", 'suspended'));
+                    break;
+                case MEMBERSHIP_ID_PENDING:
+                    $aAccounts = $this->_oDb->getAccountsByAcl($this->_oDb->prepareAsString(" AND `tp`.`status`=?", 'pending'));
+                    break;
+                case MEMBERSHIP_ID_STANDARD:
+                    $aAccounts = $this->_oDb->getAccountsByAcl($this->_oDb->prepareAsString("  AND `tp`.`id` NOT IN (SELECT `IDMember` FROM `sys_acl_levels_members`) ", $sLvl));
+                    break;
+                default:
+                    $aAccounts = $this->_oDb->getAccountsByAcl($this->_oDb->prepareAsString(" AND `tp`.`id` IN (SELECT `IDMember` FROM `sys_acl_levels_members` WHERE IDLevel = ?) ", $sLvl));
+                    break;
+            }
+        }
+        else{
+            //for custom segments;
+        }
+        return $aAccounts;
+    }
+    
+    private function getDataForCampaign($iCampaignId)
+    {
+        $aCampaign = $this->_oDb->getCampaignInfoById($iCampaignId);
+        $oEmailTemplates = BxDolEmailTemplates::getInstance();
+        $aTemplate = $oEmailTemplates->parseTemplate('bx_massmailer_email', array('Content' => $aCampaign['body']));
+        $aTemplate['Subject'] = $aCampaign['subject'];
+        
+        $aCustomHeaders = array();
+        if ($aCampaign['from_name'] != '')
+            $aCustomHeaders['From'] = $aCampaign['from_name'];
+        if ($aCampaign['reply_to'] != '')
+            $aCustomHeaders['Reply-To'] = $aCampaign['reply_to'];
+        
+        return array($aTemplate, $aCustomHeaders, $aCampaign);
+    }
+    
+    
+}
+
+/** @} */

+ 24 - 0
modules/boonex/massmailer/classes/BxMassMailerPageBrowse.php

@@ -0,0 +1,24 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    Mass mailer
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+/**
+ * Browse entries pages.
+ */
+class BxMassMailerPageBrowse extends BxBaseModGroupsPageBrowse
+{
+    public function __construct($aObject, $oTemplate = false)
+    {
+        $this->MODULE = 'bx_massmailer';
+        parent::__construct($aObject, $oTemplate);
+    }
+}
+
+/** @} */

+ 20 - 0
modules/boonex/massmailer/classes/BxMassMailerTemplate.php

@@ -0,0 +1,20 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    Mass mailer
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+class BxMassMailerTemplate extends BxBaseModGeneralTemplate
+{
+    function __construct(&$oConfig, &$oDb)
+    {
+        parent::__construct($oConfig, $oDb);
+    }
+}
+
+/** @} */

+ 77 - 0
modules/boonex/massmailer/install/config.php

@@ -0,0 +1,77 @@
+<?php
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    Mass mailer
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+$aConfig = array(
+
+    /**
+     * Main Section.
+     */
+    'type' => BX_DOL_MODULE_TYPE_MODULE,
+    'name' => 'bx_massmailer',
+    'title' => 'Mass mailer',
+    'note' => 'Mass mailer module.',
+    'version' => '1.0.0.DEV',
+    'vendor' => 'BoonEx',
+    'help_url' => 'http://feed.una.io/?section={module_name}',
+
+    'compatible_with' => array(
+        '9.0.x'
+    ),
+
+    /**
+     * 'home_dir' and 'home_uri' - should be unique. Don't use spaces in 'home_uri' and the other special chars.
+     */
+    'home_dir' => 'boonex/massmailer/',
+    'home_uri' => 'massmailer',
+
+    'db_prefix' => 'bx_massmailer_',
+    'class_prefix' => 'BxMassMailer',
+
+    /**
+     * Category for language keys.
+     */
+    'language_category' => 'MassMailer',
+
+    /**
+     * Installation/Uninstallation Section.
+     */
+    'install' => array(
+        'execute_sql' => 1,
+        'update_languages' => 1,
+        'clear_db_cache' => 1,
+    ),
+    'uninstall' => array (
+        'execute_sql' => 1,
+        'update_languages' => 1,
+        'clear_db_cache' => 1,
+    ),
+    'enable' => array(
+        'execute_sql' => 1,
+        'clear_db_cache' => 1,
+    ),
+    'enable_success' => array(
+        'clear_db_cache' => 1,
+    ),
+    'disable' => array (
+        'execute_sql' => 1,
+        'clear_db_cache' => 1,
+    ),
+    'disable_failed' => array (
+        'clear_db_cache' => 1,
+    ),
+
+    /**
+     * Dependencies Section
+     */
+    'dependencies' => array(),
+);
+
+/** @} */

+ 20 - 0
modules/boonex/massmailer/install/installer.php

@@ -0,0 +1,20 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    Mass mailer
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+class BxMassMailerInstaller extends BxBaseModTextInstaller
+{
+    function __construct($aConfig)
+    {
+        parent::__construct($aConfig);
+    }
+}
+
+/** @} */

+ 94 - 0
modules/boonex/massmailer/install/langs/en.xml

@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources name="en" flag="gb" title="English">
+  <string name="_bx_massmailer"><![CDATA[Mass Mailer]]></string>
+  <string name="_bx_massmailer_page_title_sys_manage_campaigns"><![CDATA[Campaigns]]></string>
+  <string name="_bx_massmailer_page_title_manage_campaigns"><![CDATA[Campaigns]]></string>
+  <string name="_bx_massmailer_page_title_sys_manage_campaigns"><![CDATA[Campaigns]]></string>
+  <string name="_bx_massmailer_page_block_title_manage_campaigns"><![CDATA[Campaigns]]></string>
+  <string name="_bx_massmailer_page_block_title_system_manage_campaigns"><![CDATA[Manage Campaigns]]></string>
+  <string name="_bx_massmailer_page_block_title_system_manage_segments"><![CDATA[Manage Segments]]></string>
+  <string name="_bx_massmailer_page_block_title_manage_segments"><![CDATA[Manage Segments]]></string>
+  <string name="_bx_massmailer_page_title_manage_segments"><![CDATA[Segments]]></string>
+  <string name="_bx_massmailer_page_title_sys_manage_segments"><![CDATA[Segments]]></string>
+  <string name="_bx_massmailer_page_title_manage_segments"><![CDATA[Segments]]></string>
+  <string name="_bx_massmailer_page_title_sys_create_campaign"><![CDATA[New Campaign]]></string>
+  <string name="_bx_massmailer_page_title_create_campaign"><![CDATA[New Campaign]]></string>
+  <string name="_bx_massmailer_page_block_title_create_campaign"><![CDATA[New Campaign]]></string>
+  <string name="_bx_massmailer_page_title_sys_edit_campaign"><![CDATA[Edit Campaign]]></string>
+  <string name="_bx_massmailer_page_title_edit_campaign"><![CDATA[Edit Campaign]]></string>
+  <string name="_bx_massmailer_page_block_title_edit_campaign"><![CDATA[Edit Campaign]]></string>
+  <string name="_bx_massmailer_page_title_sys_view_campaign"><![CDATA[View Campaign]]></string>
+  <string name="_bx_massmailer_page_title_view_campaign"><![CDATA[View Campaign]]></string>
+  <string name="_bx_massmailer_page_block_title_view_campaign"><![CDATA[View Campaign]]></string>
+
+  <string name="_bx_massmailer_menu_item_title_system_admt_mailer"><![CDATA[Mass Mailer]]></string>
+  <string name="_bx_massmailer_menu_item_title_admt_mailer"><![CDATA[Mass Mailer]]></string>
+  <string name="_bx_massmailer_menu_item_title_manage_campaigns"><![CDATA[Campaigns]]></string>
+  <string name="_bx_massmailer_menu_title_submenu"><![CDATA[Mass Mailer  Submenu]]></string>
+  <string name="_bx_massmailer_menu_set_title_submenu"><![CDATA[Mass Mailer Submenu]]></string>
+  <string name="_bx_massmailer_menu_item_title_system_campaigns"><![CDATA[Campaigns]]></string>
+  <string name="_bx_massmailer_menu_item_title_campaigns"><![CDATA[Campaigns]]></string>
+  <string name="_bx_massmailer_menu_item_title_system_segments"><![CDATA[Segments]]></string>
+  <string name="_bx_massmailer_menu_item_title_segments"><![CDATA[Segments]]></string>
+  <string name="_bx_massmailer_menu_item_title_system_create_entry"><![CDATA[Campaign]]></string>
+  <string name="_bx_massmailer_menu_item_title_create_entry"><![CDATA[Campaign]]></string>
+
+  <string name="_bx_massmailer_grid_column_title_adm_title"><![CDATA[Title]]></string>
+  <string name="_bx_massmailer_grid_column_title_adm_author"><![CDATA[Author]]></string>
+  <string name="_bx_massmailer_grid_column_title_adm_date_created"><![CDATA[Created]]></string>
+  <string name="_bx_massmailer_grid_column_title_adm_date_sent"><![CDATA[Sent]]></string>
+  <string name="_bx_massmailer_grid_action_title_adm_delete"><![CDATA[Delete]]></string>
+  <string name="_bx_massmailer_grid_action_title_adm_edit"><![CDATA[Edit]]></string>
+  <string name="_bx_massmailer_grid_action_title_adm_copy"><![CDATA[Copy]]></string>
+  <string name="_bx_massmailer_grid_action_title_adm_delete"><![CDATA[Delete]]></string>
+  <string name="_bx_massmailer_grid_action_title_adm_view"><![CDATA[View]]></string>
+  <string name="_bx_massmailer_grid_action_title_adm_send_test"><![CDATA[Send test]]></string>
+  <string name="_bx_massmailer_grid_action_title_adm_send_all"><![CDATA[Send All]]></string>
+  <string name="_bx_massmailer_grid_action_title_adm_add"><![CDATA[Add new campaign]]></string>
+
+  <string name="_bx_massmailer_campaign_form_add_title"><![CDATA[New campaign]]></string>
+  <string name="_bx_massmailer_campaign_form_edit_title"><![CDATA[Edit campaign]]></string>
+  <string name="_bx_massmailer_campaign_form_send_test_title"><![CDATA[Send test letter]]></string>
+  <string name="_bx_massmailer_campaign_form_send_all_title"><![CDATA[Send campaign]]></string>
+  <string name="_bx_massmailer_form_campaign"><![CDATA[Campaign]]></string>
+  <string name="_bx_massmailer_form_campaign_add_display"><![CDATA[Add]]></string>
+  <string name="_bx_massmailer_form_campaign_edit_display"><![CDATA[Edit]]></string>
+  <string name="_bx_massmailer_form_entry_input_do_submit"><![CDATA[Save]]></string>
+  <string name="_bx_massmailer_form_entry_input_sys_do_submit"><![CDATA[Save]]></string>
+  <string name="_bx_massmailer_form_entry_input_do_send"><![CDATA[Send]]></string>
+  <string name="_bx_massmailer_form_entry_input_sys_do_send"><![CDATA[Send]]></string>
+  <string name="_bx_massmailer_form_campaign_input_sys_title"><![CDATA[Campaign name]]></string>
+  <string name="_bx_massmailer_form_campaign_input_title"><![CDATA[Campaign name]]></string>
+  <string name="_bx_massmailer_form_campaign_input_title_err"><![CDATA[Campaign name can't be empty]]></string>
+  <string name="_bx_massmailer_form_campaign_input_sys_body"><![CDATA[Body]]></string>
+  <string name="_bx_massmailer_form_campaign_input_body"><![CDATA[Body]]></string>
+  <string name="_bx_massmailer_form_campaign_input_body_err"><![CDATA[Body can't be empty]]></string>
+  <string name="_bx_massmailer_form_campaign_input_sys_test_email"><![CDATA[Email]]></string>
+  <string name="_bx_massmailer_form_campaign_input_email"><![CDATA[Email]]></string>
+  <string name="_bx_massmailer_form_campaign_input_sys_segments"><![CDATA[Segments]]></string>
+  <string name="_bx_massmailer_form_campaign_input_segments"><![CDATA[Segments]]></string>
+  <string name="_bx_massmailer_form_campaign_input_segments_err"><![CDATA[Segments's can't be empty]]></string>
+  <string name="_bx_massmailer_form_campaign_input_sys_subject"><![CDATA[Subject]]></string>
+  <string name="_bx_massmailer_form_campaign_input_subject"><![CDATA[Subject]]></string>
+  <string name="_bx_massmailer_form_campaign_input_subject_err"><![CDATA[Subject can't be empty]]></string>
+  <string name="_bx_massmailer_form_campaign_input_sys_from_name"><![CDATA[From name]]></string>
+  <string name="_bx_massmailer_form_campaign_input_from_name"><![CDATA[From name]]></string>
+  <string name="_bx_massmailer_form_campaign_input_from_name_info"><![CDATA[If empty, Site Name is used]]></string>
+  <string name="_bx_massmailer_form_campaign_input_sys_reply_to"><![CDATA[Reply to Email]]></string>
+  <string name="_bx_massmailer_form_campaign_input_reply_to"><![CDATA[Reply to Email]]></string>
+  <string name="_bx_massmailer_form_campaign_input_reply_to_info"><![CDATA[If empty, Site Email is used]]></string>
+  
+  <string name="_bx_massmailer_form_entry_input_cancel"><![CDATA[Cancel]]></string>
+
+  <string name="_bx_massmailer_txt_never_sent"><![CDATA[Draft]]></string>
+  <string name="_bx_massmailer_txt_copy_title"><![CDATA[ - Copy]]></string>
+  
+  
+  <string name="_bx_massmailer_segments_all"><![CDATA[All]]></string>
+  <string name="_bx_massmailer_email_name"><![CDATA[Mass Mailer message]]></string>
+  <string name="_bx_massmailer_email_subject"><![CDATA[Mass Mailer message]]></string>
+  <string name="_bx_massmailer_email_body"><![CDATA[{email_header}
+  <br />{Content} <br />
+  {email_footer}]]></string>
+
+</resources>

+ 22 - 0
modules/boonex/massmailer/install/sql/disable.sql

@@ -0,0 +1,22 @@
+SET @sName = 'bx_massmailer';
+
+-- PAGES
+DELETE FROM `sys_objects_page` WHERE `module` = @sName;
+DELETE FROM `sys_pages_blocks` WHERE `module` = @sName;
+
+-- MENU
+DELETE FROM `sys_objects_menu` WHERE `module` = @sName;
+DELETE FROM `sys_menu_sets` WHERE `module` = @sName;
+DELETE FROM `sys_menu_items` WHERE `module` = @sName;
+
+-- GRIDS
+DELETE FROM `sys_objects_grid` WHERE `object` IN ('bx_massmailer_campaigns', 'bx_massmailer_letters');
+DELETE FROM `sys_grid_fields` WHERE `object` IN ('bx_massmailer_campaigns', 'bx_massmailer_letters');
+DELETE FROM `sys_grid_actions` WHERE `object` IN ('bx_massmailer_campaigns', 'bx_massmailer_letters');
+
+-- ACL
+DELETE `sys_acl_actions`, `sys_acl_matrix` FROM `sys_acl_actions`, `sys_acl_matrix` WHERE `sys_acl_matrix`.`IDAction` = `sys_acl_actions`.`ID` AND `sys_acl_actions`.`Module` = @sName;
+DELETE FROM `sys_acl_actions` WHERE `Module` = @sName;
+
+-- EMAIL TEMPLATES
+DELETE FROM `sys_email_templates` WHERE `module` = @sName;

+ 121 - 0
modules/boonex/massmailer/install/sql/enable.sql

@@ -0,0 +1,121 @@
+SET @sName = 'bx_massmailer';
+
+-- PAGE: create campaign
+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_massmailer_create_campaign', '_bx_massmailer_page_title_sys_create_campaign', '_bx_massmailer_page_title_create_campaign', 'bx_massmailer', 5, 192, 1, 'create-campaign', 'page.php?i=create-campaign', '', '', '', 0, 1, 0, 'BxMassMailerPageBrowse', 'modules/boonex/massmailer/classes/BxMassMailerPageBrowse.php');
+
+INSERT INTO `sys_pages_blocks` (`object`, `cell_id`, `module`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `order`) VALUES
+('bx_massmailer_create_campaign', 1, 'bx_massmailer', '_bx_massmailer_page_block_title_create_campaign', 11, 192, 'service', 'a:2:{s:6:"module";s:13:"bx_massmailer";s:6:"method";s:13:"entity_create";}', 0, 1, 1);
+
+-- PAGE: edit campaign
+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_massmailer_edit_campaign', '_bx_massmailer_page_title_sys_edit_campaign', '_bx_massmailer_page_title_edit_campaign', 'bx_massmailer', 5, 192, 1, 'edit-campaign', '', '', '', '', 0, 1, 0, 'BxMassMailerPageBrowse', 'modules/boonex/massmailer/classes/BxMassMailerPageBrowse.php');
+
+INSERT INTO `sys_pages_blocks` (`object`, `cell_id`, `module`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `order`) VALUES
+('bx_massmailer_edit_campaign', 1, 'bx_massmailer', '_bx_massmailer_page_block_title_edit_campaign', 11, 192, 'service', 'a:2:{s:6:"module";s:13:"bx_massmailer";s:6:"method";s:11:"entity_edit";}', 0, 0, 0);
+
+-- PAGE: view campaign
+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_massmailer_view_campaign', '_bx_massmailer_page_title_sys_view_campaign', '_bx_massmailer_page_title_view_campaign', 'bx_massmailer', 5, 192, 1, 'view-campaign', '', '', '', '', 0, 1, 0, 'BxMassMailerPageBrowse', 'modules/boonex/massmailer/classes/BxMassMailerPageBrowse.php');
+
+INSERT INTO `sys_pages_blocks` (`object`, `cell_id`, `module`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `order`) VALUES
+('bx_massmailer_view_campaign', 1, 'bx_massmailer', '_bx_massmailer_page_block_title_view_campaign', 11, 192, 'service', 'a:2:{s:6:"module";s:13:"bx_massmailer";s:6:"method";s:11:"entity_view";}', 0, 0, 0);
+
+-- PAGE: campaigns 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_massmailer_campaigns', '_bx_massmailer_page_title_sys_manage_campaigns', '_bx_massmailer_page_title_manage_campaigns', @sName, 5, 192, 1, 'massmailer-campaigns', 'page.php?i=massmailer-campaigns', '', '', '', 0, 1, 0, 'BxMassMailerPageBrowse', 'modules/boonex/massmailer/classes/BxMassMailerPageBrowse.php');
+
+INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title_system`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `order`) VALUES 
+('bx_massmailer_campaigns', 1, @sName, '_bx_massmailer_page_block_title_system_manage_campaigns', '_bx_massmailer_page_block_title_manage_campaigns', 11, 192, 'service', 'a:3:{s:6:\"module\";s:13:\"bx_massmailer\";s:6:\"method\";s:12:\"manage_tools\";s:6:\"params\";a:1:{i:0;s:9:\"campaigns\";}}', 0, 1, 0);
+
+-- PAGE: segments 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_massmailer_segments', '_bx_massmailer_page_title_sys_manage_segments', '_bx_massmailer_page_title_manage_segments', @sName, 5, 192, 1, 'massmailer-segments', 'page.php?i=massmailer-segments', '', '', '', 0, 1, 0, 'BxMassMailerPageBrowse', 'modules/boonex/massmailer/classes/BxMassMailerPageBrowse.php');
+
+INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title_system`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `order`) VALUES 
+('bx_massmailer_segments', 1, @sName, '_bx_massmailer_page_block_title_system_manage_segments', '_bx_massmailer_page_block_title_manage_segments', 11, 192, 'service', 'a:3:{s:6:\"module\";s:13:\"bx_massmailer\";s:6:\"method\";s:12:\"manage_tool1\";s:6:\"params\";a:1:{i:0;s:8:\"segments\";}}', 0, 1, 0);
+
+
+-- MENU: module sub-menu
+INSERT INTO `sys_objects_menu`(`object`, `title`, `set_name`, `module`, `template_id`, `deletable`, `active`, `override_class_name`, `override_class_file`) VALUES 
+('bx_massmailer_submenu', '_bx_massmailer_menu_title_submenu', 'bx_massmailer_submenu', 'bx_massmailer', 8, 0, 1, '', '');
+
+INSERT INTO `sys_menu_sets`(`set_name`, `module`, `title`, `deletable`) VALUES 
+('bx_massmailer_submenu', 'bx_massmailer', '_bx_massmailer_menu_set_title_submenu', 0);
+
+INSERT INTO `sys_menu_items`(`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `submenu_object`, `visible_for_levels`, `active`, `copyable`, `order`) VALUES 
+('bx_massmailer_submenu', 'bx_massmailer', 'massmailer-campaigns', '_bx_massmailer_menu_item_title_system_campaigns', '_bx_massmailer_menu_item_title_campaigns', 'page.php?i=massmailer-campaigns', '', '', '', '', 192, 1, 1, 1),
+('bx_massmailer_submenu', 'bx_massmailer', 'massmailer-segments', '_bx_massmailer_menu_item_title_system_segments', '_bx_massmailer_menu_item_title_segments', 'page.php?i=massmailer-segments', '', '', '', '', 192, 1, 1, 3);
+
+-- MENU: add to "add content" menu
+SET @iAddMenuOrder = (SELECT `order` FROM `sys_menu_items` WHERE `set_name` = 'sys_add_content_links' AND `active` = 1 ORDER BY `order` DESC LIMIT 1);
+INSERT INTO `sys_menu_items` (`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `submenu_object`, `visible_for_levels`, `active`, `copyable`, `order`) VALUES 
+('sys_add_content_links', 'bx_massmailer', 'create-campaign', '_bx_massmailer_menu_item_title_system_create_entry', '_bx_massmailer_menu_item_title_create_entry', 'page.php?i=create-campaign', '', '', 'envelope col-red2', '', 2147483647, 1, 1, IFNULL(@iAddMenuOrder, 0) + 1);
+
+-- MENU: dashboard manage tools
+SET @iManageMenuOrder = (SELECT IFNULL(MAX(`order`), 0) FROM `sys_menu_items` WHERE `set_name`='sys_account_dashboard_manage_tools' LIMIT 1);
+INSERT INTO `sys_menu_items`(`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `addon`, `submenu_object`, `visible_for_levels`, `active`, `copyable`, `order`) VALUES 
+('sys_account_dashboard_manage_tools', @sName, 'massmailer-campaigns', '_bx_massmailer_menu_item_title_system_admt_mailer', '_bx_massmailer_menu_item_title_admt_mailer', 'page.php?i=massmailer-campaigns', '', '_self', '', 'a:2:{s:6:"module";s:13:"bx_massmailer";s:6:"method";s:27:"get_menu_addon_manage_tools";}', '', 192, 1, 0, @iManageMenuOrder + 1);
+
+-- GRIDS: campaigns 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`, `override_class_name`, `override_class_file`) VALUES
+('bx_massmailer_campaigns', 'Sql', 'SELECT * FROM `bx_massmailer_campaigns` WHERE 1 ', 'bx_massmailer_campaigns', 'id', 'date_created', '', '', 20, NULL, 'start', '', 'title', '', 'like', '', '', 192, 'BxMassMailerGridCampaigns', 'modules/boonex/massmailer/classes/BxMassMailerGridCampaigns.php');
+
+INSERT INTO `sys_grid_fields` (`object`, `name`, `title`, `width`, `translatable`, `chars_limit`, `params`, `order`) VALUES
+('bx_massmailer_campaigns', 'checkbox', '_sys_select', '2%', 0, '', '', 1),
+('bx_massmailer_campaigns', 'title', '_bx_massmailer_grid_column_title_adm_title', '33%', 0, '22', '', 2),
+('bx_massmailer_campaigns', 'author', '_bx_massmailer_grid_column_title_adm_author', '20%', 0, '22', '', 3),
+('bx_massmailer_campaigns', 'date_created', '_bx_massmailer_grid_column_title_adm_date_created', '10%', 0, '15', '', 4),
+('bx_massmailer_campaigns', 'date_sent', '_bx_massmailer_grid_column_title_adm_date_sent', '10%', 0, '22', '', 5),
+('bx_massmailer_campaigns', 'actions', '', '25%', 0, '', '', 6);
+
+INSERT INTO `sys_grid_actions` (`object`, `type`, `name`, `title`, `icon`, `icon_only`, `confirm`, `order`) VALUES
+('bx_massmailer_campaigns', 'bulk', 'delete', '_bx_massmailer_grid_action_title_adm_delete', '', 0, 1, 1),
+('bx_massmailer_campaigns', 'single', 'edit', '_bx_massmailer_grid_action_title_adm_edit', 'pencil-alt', 1, 0, 1),
+('bx_massmailer_campaigns', 'single', 'delete', '_bx_massmailer_grid_action_title_adm_delete', 'remove', 1, 1, 2),
+('bx_massmailer_campaigns', 'single', 'copy', '_bx_massmailer_grid_action_title_adm_copy', 'copy', 1, 0, 4),
+('bx_massmailer_campaigns', 'single', 'send_test', '_bx_massmailer_grid_action_title_adm_send_test', 'envelope-open', 1, 0, 5),
+('bx_massmailer_campaigns', 'single', 'view', '_bx_massmailer_grid_action_title_adm_view', 'eye', 1, 0, 6),
+('bx_massmailer_campaigns', 'single', 'send_all', '_bx_massmailer_grid_action_title_adm_send_all', 'envelope', 1, 0, 7),
+('bx_massmailer_campaigns', 'independent', 'add', '_bx_massmailer_grid_action_title_adm_add', '', 0, 0, 1);
+
+-- EMAIL TEMPLATES
+INSERT INTO `sys_email_templates` (`Module`, `NameSystem`, `Name`, `Subject`, `Body`) VALUES
+(@sName, '_bx_massmailer_email_name', 'bx_massmailer_email', '_bx_massmailer_email_subject', '_bx_massmailer_email_body');
+
+-- ACL
+INSERT INTO `sys_acl_actions` (`Module`, `Name`, `AdditionalParamName`, `Title`, `Desc`, `Countable`, `DisabledForLevels`) VALUES
+('bx_massmailer', 'create entry', NULL, '_bx_massmailer_acl_action_create_entry', '', 1, 3);
+SET @iIdActionEntryCreate = LAST_INSERT_ID();
+
+INSERT INTO `sys_acl_actions` (`Module`, `Name`, `AdditionalParamName`, `Title`, `Desc`, `Countable`, `DisabledForLevels`) VALUES
+('bx_massmailer', 'delete entry', NULL, '_bx_massmailer_acl_action_delete_entry', '', 1, 3);
+SET @iIdActionEntryDelete = LAST_INSERT_ID();
+
+INSERT INTO `sys_acl_actions` (`Module`, `Name`, `AdditionalParamName`, `Title`, `Desc`, `Countable`, `DisabledForLevels`) VALUES
+('bx_massmailer', 'view entry', NULL, '_bx_massmailer_acl_action_view_entry', '', 1, 0);
+SET @iIdActionEntryView = LAST_INSERT_ID();
+
+SET @iUnauthenticated = 1;
+SET @iAccount = 2;
+SET @iStandard = 3;
+SET @iUnconfirmed = 4;
+SET @iPending = 5;
+SET @iSuspended = 6;
+SET @iModerator = 7;
+SET @iAdministrator = 8;
+SET @iPremium = 9;
+
+INSERT INTO `sys_acl_matrix` (`IDLevel`, `IDAction`) VALUES
+
+-- entry create
+(@iModerator, @iIdActionEntryCreate),
+(@iAdministrator, @iIdActionEntryCreate),
+
+-- entry delete
+(@iModerator, @iIdActionEntryDelete),
+(@iAdministrator, @iIdActionEntryDelete),
+
+-- entry view
+(@iModerator, @iIdActionEntryView),
+(@iAdministrator, @iIdActionEntryView);

+ 96 - 0
modules/boonex/massmailer/install/sql/install.sql

@@ -0,0 +1,96 @@
+SET @sName = 'bx_massmailer';
+
+-- TABLES
+CREATE TABLE `bx_massmailer_campaigns` (
+  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+  `title` varchar(255) DEFAULT NULL,
+  `subject` varchar(255) DEFAULT NULL,
+  `from_name` varchar(255) DEFAULT NULL,
+  `reply_to` varchar(255) DEFAULT NULL,
+  `body` text DEFAULT NULL,
+  `segments` varchar(255) DEFAULT NULL,
+  `author` int(11) NOT NULL,
+  `date_created` int(11) NOT NULL default '0',
+  `date_sent` int(11) NOT NULL default '0',
+  `email_list` text DEFAULT NULL,
+  PRIMARY KEY (`id`)
+);
+
+-- TABLES
+CREATE TABLE `bx_massmailer_segments` (
+  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+  `title` varchar(255) DEFAULT NULL,
+  `info` text DEFAULT NULL,
+  `email_list` text DEFAULT NULL,
+  PRIMARY KEY (`id`)
+);
+
+-- STUDIO: page & widget
+INSERT INTO `sys_std_pages`(`index`, `name`, `header`, `caption`, `icon`) VALUES
+(3, @sName, '_bx_massmailer', '_bx_massmailer', 'bx_massmailer@modules/boonex/massmailer/|std-icon.svg');
+
+SET @iPageId = LAST_INSERT_ID();
+
+INSERT INTO `sys_std_widgets` (`page_id`, `module`, `url`, `click`, `icon`, `caption`, `cnt_notices`, `cnt_actions`, `bookmark`) 
+VALUES(@iPageId, @sName, '{url_studio}module.php?name=bx_massmailer', '', 'bx_massmailer@modules/boonex/massmailer/|std-icon.svg', '_bx_massmailer', '', 'a:4:{s:6:"module";s:6:"system";s:6:"method";s:11:"get_actions";s:6:"params";a:0:{}s:5:"class";s:18:"TemplStudioModules";}', 0);
+
+SET @iParentPageId = (SELECT `id` FROM `sys_std_pages` WHERE `name` = 'home');
+SET @iParentPageOrder = (SELECT IFNULL(MAX(`order`), 0) + 1 FROM `sys_std_pages_widgets` WHERE `page_id` = @iParentPageId);
+
+INSERT INTO `sys_std_pages_widgets` (`page_id`, `widget_id`, `order`) VALUES
+(@iParentPageId, LAST_INSERT_ID(), @iParentPageOrder);
+
+-- FORMS
+INSERT INTO `sys_objects_form` (`object`, `module`, `title`, `action`, `form_attrs`, `submit_name`, `table`, `key`, `uri`, `uri_title`, `params`, `deletable`, `active`, `override_class_name`, `override_class_file`) 
+VALUES(@sName, @sName, '_bx_massmailer_form_campaign', '', 'a:1:{s:7:"enctype";s:19:"multipart/form-data";}', 'a:2:{i:0;s:9:"do_submit";i:1;s:7:"do_send";}', 'bx_massmailer_campaigns', 'id', '', '', '', 0, 1, 'BxMassMailerFormEntry', 'modules/boonex/massmailer/classes/BxMassMailerFormEntry.php');
+
+INSERT INTO `sys_form_displays` (`display_name`, `module`, `object`, `title`, `view_mode`) VALUES
+('bx_massmailer_campaign_add', @sName, @sName, '_bx_massmailer_form_campaign_add_display', 0),
+('bx_massmailer_campaign_edit', @sName, @sName, '_bx_massmailer_form_campaign_edit_display', 0),
+('bx_massmailer_campaign_send_test', @sName, @sName, '_bx_massmailer_form_campaign_send_test_display', 0),
+('bx_massmailer_campaign_send_all', @sName, @sName, '_bx_massmailer_form_campaign_send_all_display', 0);
+
+INSERT INTO `sys_form_inputs` (`object`, `module`, `name`, `value`, `values`, `checked`, `type`, `caption_system`, `caption`, `info`, `required`, `unique`, `collapsed`, `html`, `attrs`, `attrs_tr`, `attrs_wrapper`, `checker_func`, `checker_params`, `checker_error`, `db_pass`, `db_params`, `editable`, `deletable`) VALUES
+(@sName, @sName, 'do_submit', '_bx_massmailer_form_entry_input_do_submit', '', 0, 'submit', '_bx_massmailer_form_entry_input_sys_do_submit', '', '', 0, 0, 0, 0, '', '', '', '', '', '', '', '', 1, 0),
+(@sName, @sName, 'do_send', '_bx_massmailer_form_entry_input_do_send', '', 0, 'submit', '_bx_massmailer_form_entry_input_sys_do_send', '', '', 0, 0, 0, 0, '', '', '', '', '', '', '', '', 1, 0),
+(@sName, @sName, 'title', '', '', 0, 'text', '_bx_massmailer_form_campaign_input_sys_title', '_bx_massmailer_form_campaign_input_title', '', 1, 0, 0, 2, '', '', '', 'Avail', '', '_bx_massmailer_form_campaign_input_title_err', 'XssHtml', '', 1, 0),
+(@sName, @sName, 'segments', '', '', 0, 'text', '_bx_massmailer_form_campaign_input_sys_segments', '_bx_massmailer_form_campaign_input_segments', '', 1, 0, 0, 2, '', '', '', 'Avail', '', '_bx_massmailer_form_campaign_input_segments_err', 'XssHtml', '', 1, 0),
+(@sName, @sName, 'subject', '', '', 0, 'text', '_bx_massmailer_form_campaign_input_sys_subject', '_bx_massmailer_form_campaign_input_subject', '', 1, 0, 0, 2, '', '', '', 'Avail', '', '_bx_massmailer_form_campaign_input_subject_err', 'XssHtml', '', 1, 0),
+(@sName, @sName, 'from_name', '', '', 0, 'text', '_bx_massmailer_form_campaign_input_sys_from_name', '_bx_massmailer_form_campaign_input_from_name', '_bx_massmailer_form_campaign_input_from_name_info', 1, 0, 0, 2, '', '', '', '', '', '', 'XssHtml', '', 1, 0),
+(@sName, @sName, 'reply_to', '', '', 0, 'text', '_bx_massmailer_form_campaign_input_sys_reply_to', '_bx_massmailer_form_campaign_input_reply_to', '_bx_massmailer_form_campaign_input_reply_to_info', 1, 0, 0, 2, '', '', '', 'Email', '', '', 'XssHtml', '', 1, 0),
+(@sName, @sName, 'body', '', '', 0, 'textarea', '_bx_massmailer_form_campaign_input_sys_body', '_bx_massmailer_form_campaign_input_body', '', 1, 0, 0, 2, '', '', '', 'Avail', '', '_bx_massmailer_form_campaign_input_body_err', 'XssHtml', '', 1, 0),
+(@sName, @sName, 'email', '', '', 0, 'text', '_bx_massmailer_form_campaign_input_sys_test_email', '_bx_massmailer_form_campaign_input_email', '', 1, 0, 0, 2, '', '', '', 'Email', '', '_sys_form_account_input_email_error', 'XssHtml', '', 1, 0),
+(@sName, @sName, 'cancel', '_bx_massmailer_form_entry_input_cancel', '', 0, 'button', '_bx_dev_bp_btn_sys_block_cancel', '', '', 0, 0, 0, 0, 'a:2:{s:7:"onclick";s:45:"$(''.bx-popup-applied:visible'').dolPopupHide()";s:5:"class";s:22:"bx-def-margin-sec-left";}', '', '', 'Avail', '', '', '', '', 0, 0),
+(@sName, @sName, 'controls', '', 'do_submit,cancel', 0, 'input_set', '', '', '', 0, 0, 0, 0, '', '', '', '', '', '', '', '', 0, 0),
+(@sName, @sName, 'controls2', '', 'do_send,cancel', 0, 'input_set', '', '', '', 0, 0, 0, 0, '', '', '', '', '', '', '', '', 0, 0);
+
+INSERT INTO `sys_form_display_inputs` (`display_name`, `input_name`, `visible_for_levels`, `active`, `order`) VALUES
+('bx_massmailer_campaign_add', 'title', 2147483647, 1, 1),
+('bx_massmailer_campaign_add', 'segments', 2147483647, 1, 2),
+('bx_massmailer_campaign_add', 'subject', 2147483647, 1, 3),
+('bx_massmailer_campaign_add', 'from_name', 2147483647, 1, 4),
+('bx_massmailer_campaign_add', 'reply_to', 2147483647, 1, 5),
+('bx_massmailer_campaign_add', 'body', 2147483647, 1, 6),
+('bx_massmailer_campaign_add', 'controls', 2147483647, 1, 7),
+('bx_massmailer_campaign_add', 'do_submit', 2147483647, 1, 8),
+('bx_massmailer_campaign_add', 'cancel', 2147483647, 1, 9),
+('bx_massmailer_campaign_edit', 'title', 2147483647, 1, 1),
+('bx_massmailer_campaign_edit', 'segments', 2147483647, 1, 2),
+('bx_massmailer_campaign_edit', 'subject', 2147483647, 1, 3),
+('bx_massmailer_campaign_edit', 'from_name', 2147483647, 1, 4),
+('bx_massmailer_campaign_edit', 'reply_to', 2147483647, 1, 5),
+('bx_massmailer_campaign_edit', 'body', 2147483647, 1, 6),
+('bx_massmailer_campaign_edit', 'controls', 2147483647, 1, 7),
+('bx_massmailer_campaign_edit', 'do_submit', 2147483647, 1, 8),
+('bx_massmailer_campaign_edit', 'cancel', 2147483647, 1, 9),
+('bx_massmailer_campaign_send_test', 'email', 2147483647, 1, 1),
+('bx_massmailer_campaign_send_test', 'controls2', 2147483647, 1, 2),
+('bx_massmailer_campaign_send_test', 'do_send', 2147483647, 1, 3),
+('bx_massmailer_campaign_send_test', 'cancel', 2147483647, 1, 4),
+('bx_massmailer_campaign_send_all', 'controls2', 2147483647, 1, 2),
+('bx_massmailer_campaign_send_all', 'do_send', 2147483647, 1, 3),
+('bx_massmailer_campaign_send_all', 'cancel', 2147483647, 1, 4);
+
+
+
+

+ 15 - 0
modules/boonex/massmailer/install/sql/uninstall.sql

@@ -0,0 +1,15 @@
+SET @sName = 'bx_massmailer';;
+
+-- TABLES
+DROP TABLE IF EXISTS `bx_massmailer_campaigns`, `bx_massmailer_segments`;
+
+-- STUDIO WIDGET
+DELETE FROM `tp`, `tw`, `tpw`
+USING `sys_std_pages` AS `tp`, `sys_std_widgets` AS `tw`, `sys_std_pages_widgets` AS `tpw`
+WHERE `tp`.`id` = `tw`.`page_id` AND `tw`.`id` = `tpw`.`widget_id` AND `tp`.`name` = @sName;
+
+-- FORMS
+DELETE FROM `sys_objects_form` WHERE `module` = @sName;
+DELETE FROM `sys_form_displays` WHERE `module` = @sName;
+DELETE FROM `sys_form_inputs` WHERE `module` = @sName;
+DELETE FROM `sys_form_display_inputs` WHERE `display_name` IN ('bx_massmailer_campaign_add', 'bx_massmailer_campaign_edit', 'bx_massmailer_campaign_send_test', 'bx_massmailer_campaign_send_all');

+ 56 - 0
modules/boonex/massmailer/js/manage_tools.js

@@ -0,0 +1,56 @@
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    Mass mailer
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+function BxMassMailerManageTools(oOptions) {
+	this._iSearchTimeoutId = false;
+	this._sActionsUrl = oOptions.sActionUrl;
+	this._sObjNameGrid = oOptions.sObjNameGrid;
+	this._sObjName = oOptions.sObjName == undefined ? 'oBxMassMailerManageTools' : oOptions.sObjName;
+
+    this._sAnimationEffect = oOptions.sAnimationEffect == undefined ? 'fade' : oOptions.sAnimationEffect;
+    this._iAnimationSpeed = oOptions.iAnimationSpeed == undefined ? 'slow' : oOptions.iAnimationSpeed;
+    this._sParamsDivider = oOptions.sParamsDivider == undefined ? '#-#' : oOptions.sParamsDivider;
+
+    this._aHtmlIds = oOptions.aHtmlIds == undefined ? {} : oOptions.aHtmlIds;
+    this._oRequestParams = oOptions.oRequestParams == undefined ? {} : oOptions.oRequestParams;
+}
+
+BxMassMailerManageTools.prototype.onChangeFilter = function (oFilter) {
+	var $this = this;
+	var oFilter1 = $('#bx-grid-filter1-' + this._sObjNameGrid);
+	var sValueFilter1 = oFilter1.length > 0 ? oFilter1.val() : '';
+
+	var oSearch = $('#bx-grid-search-' + this._sObjNameGrid);
+	var sValueSearch = oSearch.length > 0 ? oSearch.val() : '';
+	if(sValueSearch == _t('_sys_grid_search'))
+		sValueSearch = '';
+
+	clearTimeout($this._iSearchTimeoutId);
+    $this._iSearchTimeoutId = setTimeout(function () {
+        glGrids[$this._sObjNameGrid].setFilter(sValueFilter1 + $this._sParamsDivider + sValueSearch, true);
+    }, 500);
+};
+
+BxMassMailerManageTools.prototype.onClickSettings = function (sMenuObject, oButton) {
+	if($(oButton).hasClass('bx-btn-disabled'))
+		return false;
+
+	bx_menu_popup(sMenuObject, oButton, {}, {
+		content_id: $(oButton).attr('bx_grid_action_data')
+	});
+};
+
+BxMassMailerManageTools.prototype.onClickDelete = function (iContentId) {
+	$('.bx-popup-applied:visible').dolPopupHide();
+
+	glGrids[this._sObjNameGrid].actionWithId(iContentId, 'delete', {}, '', false, 1);
+};
+
+/** @} */

+ 18 - 0
modules/boonex/massmailer/request.php

@@ -0,0 +1,18 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+* Copyright (c) UNA, Inc - https://una.io
+* MIT License - https://opensource.org/licenses/MIT
+*
+* @defgroup    Mass mailer
+* @ingroup     UnaModules
+*
+* @{
+*/
+
+require_once(BX_DIRECTORY_PATH_INC . "design.inc.php");
+
+check_logged();
+
+BxBaseModTextRequest::processAsAction($GLOBALS['aModule'], $GLOBALS['aRequest']);
+
+/** @} */

+ 1 - 0
modules/boonex/massmailer/template/author_link.html

@@ -0,0 +1 @@
+<bx_include_base:../modules/base/text/template/author_link.html />

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 10 - 0
modules/boonex/massmailer/template/images/icons/std-icon.svg


+ 19 - 0
modules/boonex/massmailer/template/manage_item.html

@@ -0,0 +1,19 @@
+<div class="bx-pgt-new-key bx-def-color-bg-block">
+    <div class="bx-pgt-new-key-cnt">
+        __form__
+        <script type="text/javascript">
+            $(document).ready(function () {
+                $("#__form_id__").ajaxForm({ 
+                    dataType: "json",
+                    beforeSubmit: function (formData, jqForm, options) {
+                        bx_loading($("#__form_id__"), true);
+                    },
+                    success: function (data) {
+                        $(".bx-popup-applied:visible").dolPopupHide();
+                        glGrids.__object__.processJson(data, '__action__');
+                    }
+                });
+            });
+        </script>
+    </div>
+</div>

+ 5 - 1
template/scripts/BxBaseFormView.php

@@ -257,7 +257,11 @@ BLAH;
                         if ($sContFields)
                             $sCont .= $sContHeader . $sContFields;
                         else
-                            $this->_isSectionOpened = false;
+                            $sContHeader = '';
+                        $sContFields = '';
+                    } 
+                    else {
+                        $sCont .= $sContFields;
                         $sContFields = '';
                     }
                     $sContHeader = $this->$sFuncGenRow($aInput);

برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است