Просмотр исходного кода

Ticket #5027 - Paid Levels: Add possibility to deactivate pricing plans.

AntonLV 1 год назад
Родитель
Сommit
d2e8f8ea1e

+ 14 - 2
modules/boonex/acl/classes/BxAclDb.php

@@ -96,6 +96,7 @@ class BxAclDb extends BxDolModuleDb
             `tap`.`id` AS `id`,
             `tap`.`id` AS `id`,
             `tap`.`level_id` AS `level_id`,
             `tap`.`level_id` AS `level_id`,
             `tap`.`name` AS `name`,
             `tap`.`name` AS `name`,
+            `tap`.`caption` AS `caption`,
             `tap`.`period` AS `period`,
             `tap`.`period` AS `period`,
             `tap`.`period_unit` AS `period_unit`,
             `tap`.`period_unit` AS `period_unit`,
             `tap`.`price` AS `price`,
             `tap`.`price` AS `price`,
@@ -189,8 +190,19 @@ class BxAclDb extends BxDolModuleDb
 
 
     public function deletePrices($aWhere)
     public function deletePrices($aWhere)
     {
     {
-        $sSql = "DELETE FROM `" . $this->_oConfig->CNF['TABLE_PRICES'] . "` WHERE " . $this->arrayToSQL($aWhere, " AND ");
-        return (int)$this->query($sSql) > 0;
+        $CNF = &$this->_oConfig->CNF;
+
+        $sWhereClause = $this->arrayToSQL($aWhere, " AND ");
+
+        $aPrices = $this->getAll("SELECT * FROM `" . $CNF['TABLE_PRICES'] . "` WHERE " . $sWhereClause);
+        if(!empty($aPrices) && is_array($aPrices)) {
+            $oLanguage = BxDolStudioLanguagesUtils::getInstance();
+
+            foreach($aPrices as $aPrice)
+                $oLanguage->deleteLanguageString($aPrice['caption']);
+        }
+
+        return (int)$this->query("DELETE FROM `" . $CNF['TABLE_PRICES'] . "` WHERE " . $sWhereClause) > 0;
     }
     }
     
     
     public function getLicenses($aParams, $bReturnCount = false)
     public function getLicenses($aParams, $bReturnCount = false)

+ 12 - 1
modules/boonex/acl/classes/BxAclFormPrice.php

@@ -9,7 +9,7 @@
  * @{
  * @{
  */
  */
 
 
-class BxAclFormPrice extends BxTemplFormView
+class BxAclFormPrice extends BxTemplStudioFormView
 {
 {
     protected $_sModule;
     protected $_sModule;
     protected $_oModule;
     protected $_oModule;
@@ -23,6 +23,17 @@ class BxAclFormPrice extends BxTemplFormView
 
 
         $CNF = &$this->_oModule->_oConfig->CNF;
         $CNF = &$this->_oModule->_oConfig->CNF;
 
 
+        if(isset($this->aInputs[$CNF['FIELD_LEVEL_ID']])) {
+            $aLevels = $this->_oModule->_oDb->getLevels(['type' => 'for_selector']);
+
+            $this->aInputs[$CNF['FIELD_LEVEL_ID']]['values'][] = ['key' => 0, 'value' => _t('_sys_please_select')];
+            foreach($aLevels as $iId => $sTitle)
+                $this->aInputs[$CNF['FIELD_LEVEL_ID']]['values'][] = [
+                    'key' => $iId, 
+                    'value' => _t($sTitle)
+                ];
+        }
+
         if(isset($this->aInputs[$CNF['FIELD_NAME']])) {
         if(isset($this->aInputs[$CNF['FIELD_NAME']])) {
             $sJsObject = $this->_oModule->_oConfig->getJsObject('form');
             $sJsObject = $this->_oModule->_oConfig->getJsObject('form');
 
 

+ 43 - 43
modules/boonex/acl/classes/BxAclGridAdministration.php

@@ -14,12 +14,15 @@ require_once('BxAclGridLevels.php');
 class BxAclGridAdministration extends BxAclGridLevels
 class BxAclGridAdministration extends BxAclGridLevels
 {
 {
     protected $_sParamsDivider = '#-#';
     protected $_sParamsDivider = '#-#';
+    protected $_aLevels = [];
     protected $_iLevelId = 0;
     protected $_iLevelId = 0;
 
 
     public function __construct ($aOptions, $oTemplate = false)
     public function __construct ($aOptions, $oTemplate = false)
     {
     {
         parent::__construct ($aOptions, $oTemplate);
         parent::__construct ($aOptions, $oTemplate);
 
 
+        $this->_aLevels = $this->_oModule->_oDb->getLevels(['type' => 'for_selector']);
+
         $iLevel = (int)bx_get('level');
         $iLevel = (int)bx_get('level');
         if($iLevel > 0) {
         if($iLevel > 0) {
             $this->_iLevelId = $iLevel;
             $this->_iLevelId = $iLevel;
@@ -37,9 +40,6 @@ class BxAclGridAdministration extends BxAclGridLevels
         if(strpos($sFilter, $this->_sParamsDivider) !== false)
         if(strpos($sFilter, $this->_sParamsDivider) !== false)
             list($this->_iLevelId, $sFilter) = explode($this->_sParamsDivider, $sFilter);
             list($this->_iLevelId, $sFilter) = explode($this->_sParamsDivider, $sFilter);
 
 
-        if((int)$this->_iLevelId == 0)
-            $this->_iLevelId = (int)bx_get('level_id');
-
     	$oForm = BxDolForm::getObjectInstance($CNF['OBJECT_FORM_PRICE'], $CNF['OBJECT_FORM_PRICE_DISPLAY_ADD']);
     	$oForm = BxDolForm::getObjectInstance($CNF['OBJECT_FORM_PRICE'], $CNF['OBJECT_FORM_PRICE_DISPLAY_ADD']);
         $oForm->setAction(BX_DOL_URL_ROOT . 'grid.php?o=' . $this->_sObject . '&a=' . $sAction . '&level=' . $this->_iLevelId);
         $oForm->setAction(BX_DOL_URL_ROOT . 'grid.php?o=' . $this->_sObject . '&a=' . $sAction . '&level=' . $this->_iLevelId);
         $oForm->setLevelId($this->_iLevelId);
         $oForm->setLevelId($this->_iLevelId);
@@ -51,34 +51,40 @@ class BxAclGridAdministration extends BxAclGridLevels
             $sPeriodUnit = $oForm->getCleanValue('period_unit');
             $sPeriodUnit = $oForm->getCleanValue('period_unit');
 
 
             if(!empty($iPeriod) && empty($sPeriodUnit)) 
             if(!empty($iPeriod) && empty($sPeriodUnit)) 
-                return echoJson(array('msg' => _t('_bx_acl_form_price_input_err_period_unit')));
+                return echoJson(['msg' => _t('_bx_acl_form_price_input_err_period_unit')]);
 
 
-            $aPrice = $this->_oModule->_oDb->getPrices(array('type' => 'by_level_id_duration', 'level_id' => $iLevel, 'period' => $iPeriod, 'period_unit' => $sPeriodUnit));
-            if(!empty($aPrice) && is_array($aPrice))
-                return echoJson(array('msg' => _t('_bx_acl_err_price_duplicate')));
+            $aPriceSimilar = $this->_oModule->_oDb->getPrices([
+                'type' => 'by_level_id_duration', 
+                'level_id' => $iLevel, 
+                'period' => $iPeriod, 
+                'period_unit' => $sPeriodUnit
+            ]);
 
 
             $iId = (int)$oForm->insert(array('added' => time(), 'order' => $this->_oModule->_oDb->getPriceOrderMax($this->_iLevelId) + 1));
             $iId = (int)$oForm->insert(array('added' => time(), 'order' => $this->_oModule->_oDb->getPriceOrderMax($this->_iLevelId) + 1));
             if($iId != 0) {
             if($iId != 0) {
             	//TODO: May be we don't need to have this 'Purchasable' flag at all or at least we shouldn't update it from here.
             	//TODO: May be we don't need to have this 'Purchasable' flag at all or at least we shouldn't update it from here.
-                $this->_oModule->_oDb->updateLevels(array('Purchasable' => 'yes'), array('ID' => $this->_iLevelId));
-                $aRes = array('grid' => $this->getCode(false), 'blink' => $iId);
+                $this->_oModule->_oDb->updateLevels(['Purchasable' => 'yes'], ['ID' => $this->_iLevelId]);
+
+                $aRes = ['grid' => $this->getCode(false), 'blink' => $iId];
+                if(!empty($aPriceSimilar) && is_array($aPriceSimilar))
+                    $aRes['msg'] = _t('_bx_acl_err_price_duplicate');
             } 
             } 
             else
             else
-                $aRes = array('msg' => _t('_bx_acl_err_cannot_perform'));
+                $aRes = ['msg' => _t('_bx_acl_err_cannot_perform')];
 
 
             echoJson($aRes);
             echoJson($aRes);
             return;
             return;
         }
         }
 
 
         bx_import('BxTemplStudioFunctions');
         bx_import('BxTemplStudioFunctions');
-        $sContent = BxTemplStudioFunctions::getInstance()->popupBox($this->_oModule->_oConfig->getHtmlIds('popup_price'), _t('_bx_acl_popup_title_price_add'), $this->_oModule->_oTemplate->parseHtmlByName('popup_price.html', array(
+        $sContent = BxTemplStudioFunctions::getInstance()->popupBox($this->_oModule->_oConfig->getHtmlIds('popup_price'), _t('_bx_acl_popup_title_price_add'), $this->_oModule->_oTemplate->parseHtmlByName('popup_price.html', [
             'form_id' => $oForm->aFormAttrs['id'],
             'form_id' => $oForm->aFormAttrs['id'],
             'form' => $oForm->getCode(true),
             'form' => $oForm->getCode(true),
             'object' => $this->_sObject,
             'object' => $this->_sObject,
             'action' => $sAction
             'action' => $sAction
-        )));
+        ]));
 
 
-        echoJson(array('popup' => array('html' => $sContent, 'options' => array('closeOnOuterClick' => false, 'removeOnClose' => true))));
+        echoJson(['popup' => ['html' => $sContent, 'options' => ['closeOnOuterClick' => false, 'removeOnClose' => true]]]);
     }
     }
 
 
     public function performActionEdit()
     public function performActionEdit()
@@ -89,13 +95,13 @@ class BxAclGridAdministration extends BxAclGridLevels
 
 
         $aIds = $this->_getIds();
         $aIds = $this->_getIds();
         if($aIds === false)
         if($aIds === false)
-            return echoJson(array());
+            return echoJson([]);
 
 
         $iId = $aIds[0];
         $iId = $aIds[0];
 
 
-        $aItem = $this->_oModule->_oDb->getPrices(array('type' => 'by_id', 'value' => $iId));
+        $aItem = $this->_oModule->_oDb->getPrices(['type' => 'by_id', 'value' => $iId]);
         if(!is_array($aItem) || empty($aItem)) {
         if(!is_array($aItem) || empty($aItem)) {
-            echoJson(array());
+            echoJson([]);
             exit;
             exit;
         }
         }
 
 
@@ -105,25 +111,23 @@ class BxAclGridAdministration extends BxAclGridLevels
         $oForm->initChecker($aItem);
         $oForm->initChecker($aItem);
         if($oForm->isSubmittedAndValid()) {
         if($oForm->isSubmittedAndValid()) {
             if($oForm->update($aItem['id']) !== false)
             if($oForm->update($aItem['id']) !== false)
-                $aRes = array('grid' => $this->getCode(false), 'blink' => $aItem['id']);
+                $aRes = ['grid' => $this->getCode(false), 'blink' => $aItem['id']];
             else
             else
-                $aRes = array('msg' => _t('_bx_acl_err_cannot_perform'));
+                $aRes = ['msg' => _t('_bx_acl_err_cannot_perform')];
 
 
             echoJson($aRes);
             echoJson($aRes);
             return;
             return;
         }
         }
 
 
         bx_import('BxTemplStudioFunctions');
         bx_import('BxTemplStudioFunctions');
-        $sContent = BxTemplStudioFunctions::getInstance()->popupBox($this->_oModule->_oConfig->getHtmlIds('popup_price'), _t('_bx_acl_popup_title_price_edit'), $this->_oModule->_oTemplate->parseHtmlByName('popup_price.html', array(
+        $sContent = BxTemplStudioFunctions::getInstance()->popupBox($this->_oModule->_oConfig->getHtmlIds('popup_price'), _t('_bx_acl_popup_title_price_edit'), $this->_oModule->_oTemplate->parseHtmlByName('popup_price.html', [
             'form_id' => $oForm->aFormAttrs['id'],
             'form_id' => $oForm->aFormAttrs['id'],
             'form' => $oForm->getCode(true),
             'form' => $oForm->getCode(true),
             'object' => $this->_sObject,
             'object' => $this->_sObject,
             'action' => $sAction
             'action' => $sAction
-        )));
+        ]));
 
 
-        $aRes = array('popup' => array('html' => $sContent, 'options' => array('closeOnOuterClick' => false, 'removeOnClose' => true)));
-
-        echoJson($aRes);
+        echoJson(['popup' => ['html' => $sContent, 'options' => ['closeOnOuterClick' => false, 'removeOnClose' => true]]]);
     }
     }
 
 
     public function performActionDelete()
     public function performActionDelete()
@@ -132,19 +136,19 @@ class BxAclGridAdministration extends BxAclGridLevels
 
 
         $aIds = bx_get('ids');
         $aIds = bx_get('ids');
         if(!$aIds || !is_array($aIds)) {
         if(!$aIds || !is_array($aIds)) {
-            echoJson(array());
+            echoJson([]);
             return;
             return;
         }
         }
 
 
         $iAffected = 0;
         $iAffected = 0;
-        $aIdsAffected = array();
+        $aIdsAffected = [];
         foreach($aIds as $iId)
         foreach($aIds as $iId)
-            if($this->_oModule->_oDb->deletePrices(array('id' => $iId))) {
+            if($this->_oModule->_oDb->deletePrices(['id' => $iId])) {
                 $aIdsAffected[] = $iId;
                 $aIdsAffected[] = $iId;
                 $iAffected++;
                 $iAffected++;
             }
             }
 
 
-        echoJson($iAffected ? array('grid' => $this->getCode(false), 'blink' => $aIdsAffected) : array('msg' => _t('_bx_acl_err_cannot_perform')));
+        echoJson($iAffected ? ['grid' => $this->getCode(false), 'blink' => $aIdsAffected] : ['msg' => _t('_bx_acl_err_cannot_perform')]);
     }
     }
 
 
     protected function _addJsCss()
     protected function _addJsCss()
@@ -157,12 +161,11 @@ class BxAclGridAdministration extends BxAclGridLevels
         $oForm->addCssJs();
         $oForm->addCssJs();
     }
     }
 
 
-    protected function _getActionAdd ($sType, $sKey, $a, $isSmall = false, $isDisabled = false, $aRow = array())
+    protected function _getCellLevelId($mixedValue, $sKey, $aField, $aRow)
     {
     {
-        if(empty($this->_iLevelId))
-            $isDisabled = true;
+        $mixedValue = _t(isset($this->_aLevels[$mixedValue]) ? $this->_aLevels[$mixedValue] : '_undefined');
 
 
-        return  parent::_getActionDefault($sType, $sKey, $a, false, $isDisabled, $aRow);
+    	return parent::_getCellDefault($mixedValue, $sKey, $aField, $aRow);
     }
     }
 
 
     protected function _getFilterControls()
     protected function _getFilterControls()
@@ -170,21 +173,20 @@ class BxAclGridAdministration extends BxAclGridLevels
         parent::_getFilterControls();
         parent::_getFilterControls();
 
 
         $sContent = '';
         $sContent = '';
-        $oForm = new BxTemplFormView(array());
+        $oForm = new BxTemplFormView([]);
 
 
-        $aInputLevels = array(
+        $aInputLevels = [
             'type' => 'select',
             'type' => 'select',
             'name' => 'level',
             'name' => 'level',
-            'attrs' => array(
+            'attrs' => [
                 'id' => 'bx-grid-level-' . $this->_sObject,
                 'id' => 'bx-grid-level-' . $this->_sObject,
                 'onChange' => 'javascript:' . $this->_oModule->_oConfig->getJsObject('administration') . '.onChangeLevel()'
                 'onChange' => 'javascript:' . $this->_oModule->_oConfig->getJsObject('administration') . '.onChangeLevel()'
-            ),
+            ],
             'value' => $this->_iLevelId,
             'value' => $this->_iLevelId,
-            'values' => array(0 => _t('_bx_acl_txt_select_level'))
-        );
+            'values' => array(0 => _t('_bx_acl_txt_all_level'))
+        ];
 
 
-        $aLevels = $this->_oModule->_oDb->getLevels(array('type' => 'for_selector'));
-        foreach($aLevels as $iId => $sTitle)
+        foreach($this->_aLevels as $iId => $sTitle)
             $aInputLevels['values'][$iId] = _t($sTitle);
             $aInputLevels['values'][$iId] = _t($sTitle);
 
 
         $sContent .=  $oForm->genRow($aInputLevels);
         $sContent .=  $oForm->genRow($aInputLevels);
@@ -209,10 +211,8 @@ class BxAclGridAdministration extends BxAclGridLevels
         if(empty($this->_iLevelId) && strpos($sFilter, $this->_sParamsDivider) !== false)
         if(empty($this->_iLevelId) && strpos($sFilter, $this->_sParamsDivider) !== false)
             list($this->_iLevelId, $sFilter) = explode($this->_sParamsDivider, $sFilter);
             list($this->_iLevelId, $sFilter) = explode($this->_sParamsDivider, $sFilter);
 
 
-        if(empty($this->_iLevelId))
-            return array();
-
-        $this->_aOptions['source'] .= $this->_oModule->_oDb->prepareAsString("AND `level_id`=? ", $this->_iLevelId);
+        if(!empty($this->_iLevelId))
+            $this->_aOptions['source'] .= $this->_oModule->_oDb->prepareAsString("AND `level_id`=? ", $this->_iLevelId);
 
 
         return parent::_getDataSql($sFilter, $sOrderField, $sOrderDir, $iStart, $iPerPage);;
         return parent::_getDataSql($sFilter, $sOrderField, $sOrderDir, $iStart, $iPerPage);;
     }
     }

+ 15 - 6
modules/boonex/acl/classes/BxAclGridLevels.php

@@ -12,10 +12,10 @@
 
 
 class BxAclGridLevels extends BxTemplGrid
 class BxAclGridLevels extends BxTemplGrid
 {
 {
-	protected $MODULE;
-	protected $_oModule;
+    protected $MODULE;
+    protected $_oModule;
 
 
-	protected $_aPeriodUnits;
+    protected $_aPeriodUnits;
 
 
     public function __construct ($aOptions, $oTemplate = false)
     public function __construct ($aOptions, $oTemplate = false)
     {
     {
@@ -29,7 +29,16 @@ class BxAclGridLevels extends BxTemplGrid
         $this->_aPeriodUnits = BxDolForm::getDataItems($CNF['OBJECT_FORM_PRELISTS_PERIOD_UNITS']);
         $this->_aPeriodUnits = BxDolForm::getDataItems($CNF['OBJECT_FORM_PRELISTS_PERIOD_UNITS']);
     }
     }
 
 
-	protected function _getCellPeriod($mixedValue, $sKey, $aField, $aRow)
+    
+    protected function _getCellLevelName($mixedValue, $sKey, $aField, $aRow)
+    {
+        if(($sKey = $aRow['caption']) && ($_sKey = _t($sKey)) && strcmp($sKey, $_sKey) != 0)
+            $mixedValue = $_sKey;
+
+        return parent::_getCellDefault($mixedValue, $sKey, $aField, $aRow);
+    }
+
+    protected function _getCellPeriod($mixedValue, $sKey, $aField, $aRow)
     {
     {
         if((int)$mixedValue == 0)
         if((int)$mixedValue == 0)
             $mixedValue = _t('_bx_acl_txt_lifetime');
             $mixedValue = _t('_bx_acl_txt_lifetime');
@@ -39,7 +48,7 @@ class BxAclGridLevels extends BxTemplGrid
     	return parent::_getCellDefault($mixedValue, $sKey, $aField, $aRow);
     	return parent::_getCellDefault($mixedValue, $sKey, $aField, $aRow);
     }
     }
 
 
-	protected function _getCellPrice($mixedValue, $sKey, $aField, $aRow)
+    protected function _getCellPrice($mixedValue, $sKey, $aField, $aRow)
     {
     {
         if((float)$mixedValue != 0) {
         if((float)$mixedValue != 0) {
             $aCurrency = $this->_oModule->_oConfig->getCurrency();
             $aCurrency = $this->_oModule->_oConfig->getCurrency();
@@ -52,7 +61,7 @@ class BxAclGridLevels extends BxTemplGrid
         return parent::_getCellDefault($mixedValue, $sKey, $aField, $aRow);
         return parent::_getCellDefault($mixedValue, $sKey, $aField, $aRow);
     }
     }
 
 
-	protected function _getCellTrial($mixedValue, $sKey, $aField, $aRow)
+    protected function _getCellTrial($mixedValue, $sKey, $aField, $aRow)
     {
     {
         $mixedValue = (int)$mixedValue != 0 ? _t('_bx_acl_txt_n_unit', $mixedValue, _t($this->_aPeriodUnits['day'])) : _t('_bx_acl_txt_none');
         $mixedValue = (int)$mixedValue != 0 ? _t('_bx_acl_txt_n_unit', $mixedValue, _t($this->_aPeriodUnits['day'])) : _t('_bx_acl_txt_none');
 
 

+ 12 - 4
modules/boonex/acl/install/langs/en.xml

@@ -24,11 +24,17 @@
     <string name="_bx_acl_form_price_display_add"><![CDATA[Add]]></string>
     <string name="_bx_acl_form_price_display_add"><![CDATA[Add]]></string>
     <string name="_bx_acl_form_price_display_edit"><![CDATA[Edit]]></string>
     <string name="_bx_acl_form_price_display_edit"><![CDATA[Edit]]></string>
     <string name="_bx_acl_form_price_input_sys_id"><![CDATA[ID]]></string>
     <string name="_bx_acl_form_price_input_sys_id"><![CDATA[ID]]></string>
-    <string name="_bx_acl_form_price_input_sys_level_id"><![CDATA[Level ID]]></string>
+    <string name="_bx_acl_form_price_input_sys_level_id"><![CDATA[Level]]></string>
+    <string name="_bx_acl_form_price_input_level_id"><![CDATA[Level]]></string>
+    <string name="_bx_acl_form_price_input_err_level_id"><![CDATA[You need to select a level here.]]></string>
     <string name="_bx_acl_form_price_input_sys_name"><![CDATA[Name]]></string>
     <string name="_bx_acl_form_price_input_sys_name"><![CDATA[Name]]></string>
     <string name="_bx_acl_form_price_input_name"><![CDATA[Name]]></string>
     <string name="_bx_acl_form_price_input_name"><![CDATA[Name]]></string>
     <string name="_bx_acl_form_price_input_inf_name"><![CDATA[Unique value which will be used in back end and API calls]]></string>
     <string name="_bx_acl_form_price_input_inf_name"><![CDATA[Unique value which will be used in back end and API calls]]></string>
-    <string name="_bx_acl_form_price_input_err_name"><![CDATA[You need to enter a unique value here]]></string>
+    <string name="_bx_acl_form_price_input_err_name"><![CDATA[Field's value should be unique and is needed for internal usage.]]></string>
+    <string name="_bx_acl_form_price_input_sys_caption"><![CDATA[Caption]]></string>
+    <string name="_bx_acl_form_price_input_caption"><![CDATA[Caption]]></string>
+    <string name="_bx_acl_form_price_input_inf_caption"><![CDATA[The caption will be used in user end.]]></string>
+    <string name="_bx_acl_form_price_input_err_caption"><![CDATA[You need to enter a value here.]]></string>
     <string name="_bx_acl_form_price_input_sys_period"><![CDATA[Period]]></string>
     <string name="_bx_acl_form_price_input_sys_period"><![CDATA[Period]]></string>
     <string name="_bx_acl_form_price_input_period"><![CDATA[Period]]></string>
     <string name="_bx_acl_form_price_input_period"><![CDATA[Period]]></string>
     <string name="_bx_acl_form_price_input_inf_period"><![CDATA[Use 0 for lifetime]]></string>
     <string name="_bx_acl_form_price_input_inf_period"><![CDATA[Use 0 for lifetime]]></string>
@@ -61,7 +67,9 @@
     <!-- Grids -->
     <!-- Grids -->
     <string name="_bx_acl_grid_column_level_icon"><![CDATA[]]></string>
     <string name="_bx_acl_grid_column_level_icon"><![CDATA[]]></string>
     <string name="_bx_acl_grid_column_level_name"><![CDATA[Level]]></string>
     <string name="_bx_acl_grid_column_level_name"><![CDATA[Level]]></string>
+    <string name="_bx_acl_grid_column_level_id"><![CDATA[Level]]></string>
     <string name="_bx_acl_grid_column_name"><![CDATA[Name]]></string>
     <string name="_bx_acl_grid_column_name"><![CDATA[Name]]></string>
+    <string name="_bx_acl_grid_column_caption"><![CDATA[Caption]]></string>
     <string name="_bx_acl_grid_column_period"><![CDATA[Period]]></string>
     <string name="_bx_acl_grid_column_period"><![CDATA[Period]]></string>
     <string name="_bx_acl_grid_column_price"><![CDATA[Price]]></string>
     <string name="_bx_acl_grid_column_price"><![CDATA[Price]]></string>
     <string name="_bx_acl_grid_column_price_value"><![CDATA[{0}{1}]]></string>
     <string name="_bx_acl_grid_column_price_value"><![CDATA[{0}{1}]]></string>
@@ -99,10 +107,10 @@
     <!-- Common Texts -->
     <!-- Common Texts -->
     <string name="_bx_acl_msg_empty_owner"><![CDATA['Main seller' is empty. You need to mark some profile as 'Main seller' in Settings of currently active Payment app.]]></string>
     <string name="_bx_acl_msg_empty_owner"><![CDATA['Main seller' is empty. You need to mark some profile as 'Main seller' in Settings of currently active Payment app.]]></string>
     <string name="_bx_acl_msg_performed"><![CDATA[The action was successfully performed.]]></string>
     <string name="_bx_acl_msg_performed"><![CDATA[The action was successfully performed.]]></string>
-    <string name="_bx_acl_err_price_duplicate"><![CDATA[Similar pricing plan is already exists.]]></string>
+    <string name="_bx_acl_err_price_duplicate"><![CDATA[Note! Similar pricing plan is already exists.]]></string>
     <string name="_bx_acl_err_cannot_perform"><![CDATA[An error appeared. Please report.]]></string>
     <string name="_bx_acl_err_cannot_perform"><![CDATA[An error appeared. Please report.]]></string>
 
 
-    <string name="_bx_acl_txt_select_level"><![CDATA[Select level...]]></string>
+    <string name="_bx_acl_txt_all_level"><![CDATA[All levels]]></string>
     <string name="_bx_acl_txt_cart_item_title"><![CDATA[{0} ({1} {2})]]></string>
     <string name="_bx_acl_txt_cart_item_title"><![CDATA[{0} ({1} {2})]]></string>
     <string name="_bx_acl_txt_cart_item_title_lifetime"><![CDATA[{0} (lifetime)]]></string>
     <string name="_bx_acl_txt_cart_item_title_lifetime"><![CDATA[{0} (lifetime)]]></string>
     <string name="_bx_acl_txt_cart_item_description"><![CDATA[Membership level on {0} site.]]></string>
     <string name="_bx_acl_txt_cart_item_description"><![CDATA[Membership level on {0} site.]]></string>

+ 34 - 26
modules/boonex/acl/install/sql/install.sql

@@ -6,12 +6,14 @@ CREATE TABLE `bx_acl_level_prices` (
   `id` int(11) NOT NULL auto_increment,
   `id` int(11) NOT NULL auto_increment,
   `level_id` int(11) unsigned NOT NULL default '0',
   `level_id` int(11) unsigned NOT NULL default '0',
   `name` varchar(128) NOT NULL default '',
   `name` varchar(128) NOT NULL default '',
+  `caption` varchar(128) NOT NULL default '',
   `period` int(11) unsigned NOT NULL default '1',
   `period` int(11) unsigned NOT NULL default '1',
   `period_unit` varchar(32) NOT NULL default '',
   `period_unit` varchar(32) NOT NULL default '',
   `trial` int(11) unsigned NOT NULL default '0',
   `trial` int(11) unsigned NOT NULL default '0',
   `price` float unsigned NOT NULL default '1',
   `price` float unsigned NOT NULL default '1',
   `immediate` tinyint(4) NOT NULL default '1',
   `immediate` tinyint(4) NOT NULL default '1',
   `added` int(11) NOT NULL default '0',
   `added` int(11) NOT NULL default '0',
+  `active` tinyint(4) NOT NULL default '1',
   `order` int(11) NOT NULL,
   `order` int(11) NOT NULL,
   PRIMARY KEY (`id`),
   PRIMARY KEY (`id`),
   UNIQUE KEY `name` (`name`),
   UNIQUE KEY `name` (`name`),
@@ -43,8 +45,9 @@ INSERT INTO `sys_form_displays` (`display_name`, `module`, `object`, `title`, `v
 
 
 INSERT INTO `sys_form_inputs` (`object`, `module`, `name`, `value`, `values`, `checked`, `type`, `caption_system`, `caption`, `info`, `required`, `collapsed`, `html`, `attrs`, `attrs_tr`, `attrs_wrapper`, `checker_func`, `checker_params`, `checker_error`, `db_pass`, `db_params`, `editable`, `deletable`) VALUES
 INSERT INTO `sys_form_inputs` (`object`, `module`, `name`, `value`, `values`, `checked`, `type`, `caption_system`, `caption`, `info`, `required`, `collapsed`, `html`, `attrs`, `attrs_tr`, `attrs_wrapper`, `checker_func`, `checker_params`, `checker_error`, `db_pass`, `db_params`, `editable`, `deletable`) VALUES
 ('bx_acl_price', @sName, 'id', '', '', 0, 'hidden', '_bx_acl_form_price_input_sys_id', '', '', 1, 0, 0, '', '', '', '', '', '', 'Int', '', 1, 0),
 ('bx_acl_price', @sName, 'id', '', '', 0, 'hidden', '_bx_acl_form_price_input_sys_id', '', '', 1, 0, 0, '', '', '', '', '', '', 'Int', '', 1, 0),
-('bx_acl_price', @sName, 'level_id', '', '', 0, 'hidden', '_bx_acl_form_price_input_sys_level_id', '', '', 1, 0, 0, '', '', '', '', '', '', 'Int', '', 1, 0),
+('bx_acl_price', @sName, 'level_id', '', '', 0, 'select', '_bx_acl_form_price_input_sys_level_id', '_bx_acl_form_price_input_level_id', '', 1, 0, 0, '', '', '', 'Avail', '', '_bx_acl_form_price_input_err_level_id', 'Int', '', 1, 0),
 ('bx_acl_price', @sName, 'name', '', '', 0, 'text', '_bx_acl_form_price_input_sys_name', '_bx_acl_form_price_input_name', '_bx_acl_form_price_input_inf_name', 1, 0, 0, '', '', '', 'Avail', '', '_bx_acl_form_price_input_err_name', 'Xss', '', 1, 0),
 ('bx_acl_price', @sName, 'name', '', '', 0, 'text', '_bx_acl_form_price_input_sys_name', '_bx_acl_form_price_input_name', '_bx_acl_form_price_input_inf_name', 1, 0, 0, '', '', '', 'Avail', '', '_bx_acl_form_price_input_err_name', 'Xss', '', 1, 0),
+('bx_acl_price', @sName, 'caption', '0', '', 0, 'text_translatable', '_bx_acl_form_price_input_sys_caption', '_bx_acl_form_price_input_caption', '_bx_acl_form_price_input_inf_caption', 1, 0, 0, '', '', '', 'AvailTranslatable', 'a:1:{i:0;s:7:"caption";}', '_bx_acl_form_price_input_err_caption', 'Xss', '', 0, 0),
 ('bx_acl_price', @sName, 'period', '', '', 0, 'text', '_bx_acl_form_price_input_sys_period', '_bx_acl_form_price_input_period', '_bx_acl_form_price_input_inf_period', 1, 0, 0, '', '', '', '', '', '', 'Int', '', 1, 0),
 ('bx_acl_price', @sName, 'period', '', '', 0, 'text', '_bx_acl_form_price_input_sys_period', '_bx_acl_form_price_input_period', '_bx_acl_form_price_input_inf_period', 1, 0, 0, '', '', '', '', '', '', 'Int', '', 1, 0),
 ('bx_acl_price', @sName, 'period_unit', '', '#!bx_acl_period_units', 0, 'select', '_bx_acl_form_price_input_sys_period_unit', '_bx_acl_form_price_input_period_unit', '_bx_acl_form_price_input_inf_period_unit', 1, 0, 0, '', '', '', '', '', '', 'Xss', '', 1, 0),
 ('bx_acl_price', @sName, 'period_unit', '', '#!bx_acl_period_units', 0, 'select', '_bx_acl_form_price_input_sys_period_unit', '_bx_acl_form_price_input_period_unit', '_bx_acl_form_price_input_inf_period_unit', 1, 0, 0, '', '', '', '', '', '', 'Xss', '', 1, 0),
 ('bx_acl_price', @sName, 'trial', '', '', 0, 'text', '_bx_acl_form_price_input_sys_trial', '_bx_acl_form_price_input_trial', '_bx_acl_form_price_input_inf_trial', 0, 0, 0, '', '', '', '', '', '', 'Int', '', 1, 0),
 ('bx_acl_price', @sName, 'trial', '', '', 0, 'text', '_bx_acl_form_price_input_sys_trial', '_bx_acl_form_price_input_trial', '_bx_acl_form_price_input_inf_trial', 0, 0, 0, '', '', '', '', '', '', 'Int', '', 1, 0),
@@ -58,26 +61,28 @@ INSERT INTO `sys_form_display_inputs` (`display_name`, `input_name`, `visible_fo
 ('bx_acl_price_add', 'id', 2147483647, 0, 1),
 ('bx_acl_price_add', 'id', 2147483647, 0, 1),
 ('bx_acl_price_add', 'level_id', 2147483647, 1, 2),
 ('bx_acl_price_add', 'level_id', 2147483647, 1, 2),
 ('bx_acl_price_add', 'name', 2147483647, 1, 3),
 ('bx_acl_price_add', 'name', 2147483647, 1, 3),
-('bx_acl_price_add', 'price', 2147483647, 1, 4),
-('bx_acl_price_add', 'period', 2147483647, 1, 5),
-('bx_acl_price_add', 'period_unit', 2147483647, 1, 6),
-('bx_acl_price_add', 'trial', 2147483647, 1, 7),
-('bx_acl_price_add', 'immediate', 2147483647, 1, 8),
-('bx_acl_price_add', 'controls', 2147483647, 1, 9),
-('bx_acl_price_add', 'do_submit', 2147483647, 1, 10),
-('bx_acl_price_add', 'do_cancel', 2147483647, 1, 11),
+('bx_acl_price_add', 'caption', 2147483647, 1, 4),
+('bx_acl_price_add', 'price', 2147483647, 1, 5),
+('bx_acl_price_add', 'period', 2147483647, 1, 6),
+('bx_acl_price_add', 'period_unit', 2147483647, 1, 7),
+('bx_acl_price_add', 'trial', 2147483647, 1, 8),
+('bx_acl_price_add', 'immediate', 2147483647, 1, 9),
+('bx_acl_price_add', 'controls', 2147483647, 1, 10),
+('bx_acl_price_add', 'do_submit', 2147483647, 1, 11),
+('bx_acl_price_add', 'do_cancel', 2147483647, 1, 12),
 
 
 ('bx_acl_price_edit', 'id', 2147483647, 1, 1),
 ('bx_acl_price_edit', 'id', 2147483647, 1, 1),
 ('bx_acl_price_edit', 'level_id', 2147483647, 1, 2),
 ('bx_acl_price_edit', 'level_id', 2147483647, 1, 2),
 ('bx_acl_price_edit', 'name', 2147483647, 1, 3),
 ('bx_acl_price_edit', 'name', 2147483647, 1, 3),
-('bx_acl_price_edit', 'price', 2147483647, 1, 4),
-('bx_acl_price_edit', 'period', 2147483647, 1, 5),
-('bx_acl_price_edit', 'period_unit', 2147483647, 1, 6),
-('bx_acl_price_edit', 'trial', 2147483647, 1, 7),
-('bx_acl_price_edit', 'immediate', 2147483647, 1, 8),
-('bx_acl_price_edit', 'controls', 2147483647, 1, 9),
-('bx_acl_price_edit', 'do_submit', 2147483647, 1, 10),
-('bx_acl_price_edit', 'do_cancel', 2147483647, 1, 11);
+('bx_acl_price_edit', 'caption', 2147483647, 1, 4),
+('bx_acl_price_edit', 'price', 2147483647, 1, 5),
+('bx_acl_price_edit', 'period', 2147483647, 1, 6),
+('bx_acl_price_edit', 'period_unit', 2147483647, 1, 7),
+('bx_acl_price_edit', 'trial', 2147483647, 1, 8),
+('bx_acl_price_edit', 'immediate', 2147483647, 1, 9),
+('bx_acl_price_edit', 'controls', 2147483647, 1, 10),
+('bx_acl_price_edit', 'do_submit', 2147483647, 1, 11),
+('bx_acl_price_edit', 'do_cancel', 2147483647, 1, 12);
 
 
 
 
 -- PRE-VALUES
 -- PRE-VALUES
@@ -94,17 +99,20 @@ INSERT INTO `sys_form_pre_values`(`Key`, `Value`, `Order`, `LKey`, `LKey2`) VALU
 
 
 -- GRIDS
 -- GRIDS
 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
 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_acl_administration', 'Sql', 'SELECT * FROM `bx_acl_level_prices` WHERE 1 ', 'bx_acl_level_prices', 'id', 'order', '', '', 100, NULL, 'start', '', 'period,period_unit,price', '', 'like', '', '', 192, 'BxAclGridAdministration', 'modules/boonex/acl/classes/BxAclGridAdministration.php'),
-('bx_acl_view', 'Sql', 'SELECT `tlp`.*, `tl`.`Name` AS `level_name`, `tl`.`Icon` AS `level_icon` FROM `bx_acl_level_prices` AS `tlp` LEFT JOIN `sys_acl_levels` AS `tl` ON `tlp`.`level_id`=`tl`.`ID` WHERE `tl`.`Active`=''yes'' AND `tl`.`Purchasable`=''yes'' ', 'bx_acl_level_prices', 'id', 'order', '', '', 100, NULL, 'start', '', 'period,period_unit,price', 'tl`.`Name', 'like', '', '', 2147483647, 'BxAclGridView', 'modules/boonex/acl/classes/BxAclGridView.php');
+('bx_acl_administration', 'Sql', 'SELECT * FROM `bx_acl_level_prices` WHERE 1 ', 'bx_acl_level_prices', 'id', 'order', 'active', '', 100, NULL, 'start', '', 'period,period_unit,price', 'caption', 'like', '', '', 192, 'BxAclGridAdministration', 'modules/boonex/acl/classes/BxAclGridAdministration.php'),
+('bx_acl_view', 'Sql', 'SELECT `tlp`.*, `tl`.`Name` AS `level_name`, `tl`.`Icon` AS `level_icon` FROM `bx_acl_level_prices` AS `tlp` LEFT JOIN `sys_acl_levels` AS `tl` ON `tlp`.`level_id`=`tl`.`ID` WHERE `tlp`.`active`<>''0'' && `tl`.`Active`=''yes'' AND `tl`.`Purchasable`=''yes'' ', 'bx_acl_level_prices', 'id', 'order', '', '', 100, NULL, 'start', '', 'period,period_unit,price', 'tl`.`Name', 'like', '', '', 2147483647, 'BxAclGridView', 'modules/boonex/acl/classes/BxAclGridView.php');
 
 
 INSERT INTO `sys_grid_fields` (`object`, `name`, `title`, `width`, `translatable`, `chars_limit`, `params`, `order`) VALUES
 INSERT INTO `sys_grid_fields` (`object`, `name`, `title`, `width`, `translatable`, `chars_limit`, `params`, `order`) VALUES
-('bx_acl_administration', 'checkbox', '_sys_select', '1%', 0, '', '', 1),
-('bx_acl_administration', 'order', '', '1%', 0, '', '', 2),
-('bx_acl_administration', 'name', '_bx_acl_grid_column_name', '33%', 0, 32, '', 3),
-('bx_acl_administration', 'price', '_bx_acl_grid_column_price', '15%', 0, 16, '', 4),
-('bx_acl_administration', 'period', '_bx_acl_grid_column_period', '15%', 0, 16, '', 5),
-('bx_acl_administration', 'trial', '_bx_acl_grid_column_trial', '15%', 0, 16, '', 6),
-('bx_acl_administration', 'actions', '', '20%', 0, '', '', 7),
+('bx_acl_administration', 'checkbox', '_sys_select', '2%', 0, '', '', 1),
+('bx_acl_administration', 'order', '', '2%', 0, '', '', 2),
+('bx_acl_administration', 'switcher', '', '6%', 0, '', '', 3),
+('bx_acl_administration', 'level_id', '_bx_acl_grid_column_level_id', '15%', 0, 16, '', 4),
+('bx_acl_administration', 'name', '_bx_acl_grid_column_name', '15%', 0, 16, '', 5),
+('bx_acl_administration', 'caption', '_bx_acl_grid_column_caption', '16%', 1, 16, '', 6),
+('bx_acl_administration', 'price', '_bx_acl_grid_column_price', '8%', 0, 16, '', 7),
+('bx_acl_administration', 'period', '_bx_acl_grid_column_period', '8%', 0, 16, '', 8),
+('bx_acl_administration', 'trial', '_bx_acl_grid_column_trial', '8%', 0, 16, '', 9),
+('bx_acl_administration', 'actions', '', '20%', 0, '', '', 10),
 
 
 ('bx_acl_view', 'level_icon', '_bx_acl_grid_column_level_icon', '5%', 0, 0, '', 1),
 ('bx_acl_view', 'level_icon', '_bx_acl_grid_column_level_icon', '5%', 0, 0, '', 1),
 ('bx_acl_view', 'level_name', '_bx_acl_grid_column_level_name', '25%', 1, 32, '', 2),
 ('bx_acl_view', 'level_name', '_bx_acl_grid_column_level_name', '25%', 1, 32, '', 2),

+ 12 - 4
modules/boonex/russian/data/langs/bx_acl/ru.xml

@@ -24,11 +24,17 @@
     <string name="_bx_acl_form_price_display_add"><![CDATA[Добавление]]></string>
     <string name="_bx_acl_form_price_display_add"><![CDATA[Добавление]]></string>
     <string name="_bx_acl_form_price_display_edit"><![CDATA[Редактирование]]></string>
     <string name="_bx_acl_form_price_display_edit"><![CDATA[Редактирование]]></string>
     <string name="_bx_acl_form_price_input_sys_id"><![CDATA[ID]]></string>
     <string name="_bx_acl_form_price_input_sys_id"><![CDATA[ID]]></string>
-    <string name="_bx_acl_form_price_input_sys_level_id"><![CDATA[ID уровня]]></string>
+    <string name="_bx_acl_form_price_input_sys_level_id"><![CDATA[Уровень]]></string>
+    <string name="_bx_acl_form_price_input_level_id"><![CDATA[Уровень]]></string>
+    <string name="_bx_acl_form_price_input_err_level_id"><![CDATA[Здесь Вам необходимо выбрать уровень членства.]]></string>
     <string name="_bx_acl_form_price_input_sys_name"><![CDATA[Имя]]></string>
     <string name="_bx_acl_form_price_input_sys_name"><![CDATA[Имя]]></string>
     <string name="_bx_acl_form_price_input_name"><![CDATA[Имя]]></string>
     <string name="_bx_acl_form_price_input_name"><![CDATA[Имя]]></string>
-    <string name="_bx_acl_form_price_input_inf_name"><![CDATA[Уникальное значение, которое будет использоваться в серверной части и API запросах]]></string>
+    <string name="_bx_acl_form_price_input_inf_name"><![CDATA[Значение поля должно быть уникальным и необходимо для внутреннего использования.]]></string>
     <string name="_bx_acl_form_price_input_err_name"><![CDATA[Введите уникальное значение]]></string>
     <string name="_bx_acl_form_price_input_err_name"><![CDATA[Введите уникальное значение]]></string>
+    <string name="_bx_acl_form_price_input_sys_caption"><![CDATA[Название]]></string>
+    <string name="_bx_acl_form_price_input_caption"><![CDATA[Название]]></string>
+    <string name="_bx_acl_form_price_input_inf_caption"><![CDATA[Название будет показываться на стороне пользователя.]]></string>
+    <string name="_bx_acl_form_price_input_err_caption"><![CDATA[Здесь вам необходимо ввести значение.]]></string>
     <string name="_bx_acl_form_price_input_sys_period"><![CDATA[Период]]></string>
     <string name="_bx_acl_form_price_input_sys_period"><![CDATA[Период]]></string>
     <string name="_bx_acl_form_price_input_period"><![CDATA[Период]]></string>
     <string name="_bx_acl_form_price_input_period"><![CDATA[Период]]></string>
     <string name="_bx_acl_form_price_input_inf_period"><![CDATA[Используйте 0 для пожизненного]]></string>
     <string name="_bx_acl_form_price_input_inf_period"><![CDATA[Используйте 0 для пожизненного]]></string>
@@ -61,7 +67,9 @@
     <!-- Grids -->
     <!-- Grids -->
     <string name="_bx_acl_grid_column_level_icon"><![CDATA[]]></string>
     <string name="_bx_acl_grid_column_level_icon"><![CDATA[]]></string>
     <string name="_bx_acl_grid_column_level_name"><![CDATA[Уровень]]></string>
     <string name="_bx_acl_grid_column_level_name"><![CDATA[Уровень]]></string>
+    <string name="_bx_acl_grid_column_level_id"><![CDATA[Уровень]]></string>
     <string name="_bx_acl_grid_column_name"><![CDATA[Имя]]></string>
     <string name="_bx_acl_grid_column_name"><![CDATA[Имя]]></string>
+    <string name="_bx_acl_grid_column_caption"><![CDATA[Название]]></string>
     <string name="_bx_acl_grid_column_period"><![CDATA[Период]]></string>
     <string name="_bx_acl_grid_column_period"><![CDATA[Период]]></string>
     <string name="_bx_acl_grid_column_price"><![CDATA[Цена]]></string>
     <string name="_bx_acl_grid_column_price"><![CDATA[Цена]]></string>
     <string name="_bx_acl_grid_column_price_value"><![CDATA[{0}{1}]]></string>
     <string name="_bx_acl_grid_column_price_value"><![CDATA[{0}{1}]]></string>
@@ -99,10 +107,10 @@
     <!-- Common Texts -->
     <!-- Common Texts -->
     <string name="_bx_acl_msg_empty_owner"><![CDATA['Главный продавец' не задан. Вам необходимо пометить какой-либо профайл как 'Главный продавец' в настройках активного на данный момент платежного модуля.]]></string>
     <string name="_bx_acl_msg_empty_owner"><![CDATA['Главный продавец' не задан. Вам необходимо пометить какой-либо профайл как 'Главный продавец' в настройках активного на данный момент платежного модуля.]]></string>
     <string name="_bx_acl_msg_performed"><![CDATA[Действие было успешно выполнено.]]></string>
     <string name="_bx_acl_msg_performed"><![CDATA[Действие было успешно выполнено.]]></string>
-    <string name="_bx_acl_err_price_duplicate"><![CDATA[Аналогичный ценовой план уже существует.]]></string>
+    <string name="_bx_acl_err_price_duplicate"><![CDATA[Примечание! Аналогичный ценовой план уже существует.]]></string>
     <string name="_bx_acl_err_cannot_perform"><![CDATA[Невозможно выполнить действие. Пожалуйста, оповестите нас об этой проблеме.]]></string>
     <string name="_bx_acl_err_cannot_perform"><![CDATA[Невозможно выполнить действие. Пожалуйста, оповестите нас об этой проблеме.]]></string>
 
 
-    <string name="_bx_acl_txt_select_level"><![CDATA[Выберите уровень...]]></string>
+    <string name="_bx_acl_txt_all_level"><![CDATA[Все уровни]]></string>
     <string name="_bx_acl_txt_cart_item_title"><![CDATA[{0} ({1} {2})]]></string>
     <string name="_bx_acl_txt_cart_item_title"><![CDATA[{0} ({1} {2})]]></string>
     <string name="_bx_acl_txt_cart_item_title_lifetime"><![CDATA[{0} (пожизненно)]]></string>
     <string name="_bx_acl_txt_cart_item_title_lifetime"><![CDATA[{0} (пожизненно)]]></string>
     <string name="_bx_acl_txt_cart_item_description"><![CDATA[Членство на сайте {0}.]]></string>
     <string name="_bx_acl_txt_cart_item_description"><![CDATA[Членство на сайте {0}.]]></string>