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

Merge branch 'master' of github.com:boonex/dolphin

Alex Trofimov 10 лет назад
Родитель
Сommit
2dfb112736
34 измененных файлов с 316 добавлено и 63 удалено
  1. 33 0
      inc/classes/BxDolAccountQuery.php
  2. 9 1
      inc/classes/BxDolAclQuery.php
  3. 80 0
      inc/classes/BxDolCronAccount.php
  4. 17 4
      install/sql/system.sql
  5. 15 5
      modules/base/text/classes/BxBaseModTextPageEntry.php
  6. 2 0
      modules/boonex/air/data/template/system/css/editor.less
  7. 12 1
      modules/boonex/english/data/langs/system/en.xml
  8. 8 0
      modules/boonex/forum/classes/BxForumGrid.php
  9. 1 1
      modules/boonex/groups/classes/BxGroupsSearchResult.php
  10. 1 0
      modules/boonex/groups/install/langs/en.xml
  11. 1 0
      modules/boonex/groups/install/sql/enable.sql
  12. 3 3
      modules/boonex/market/template/unit_gallery.html
  13. 2 0
      modules/boonex/ocean/data/template/system/css/editor.less
  14. 1 1
      modules/boonex/organizations/classes/BxOrgsSearchResult.php
  15. 1 0
      modules/boonex/organizations/install/langs/en.xml
  16. 1 0
      modules/boonex/organizations/install/sql/enable.sql
  17. 1 1
      modules/boonex/persons/classes/BxPersonsSearchResult.php
  18. 1 0
      modules/boonex/persons/install/langs/en.xml
  19. 1 0
      modules/boonex/persons/install/sql/enable.sql
  20. 8 0
      modules/boonex/posts/classes/BxPostsPageEntry.php
  21. 2 2
      modules/boonex/posts/install/sql/enable.sql
  22. 2 0
      modules/boonex/protean/data/template/system/css/editor.less
  23. 1 0
      modules/boonex/russian/data/langs/bx_groups/ru.xml
  24. 1 0
      modules/boonex/russian/data/langs/bx_organizations/ru.xml
  25. 1 0
      modules/boonex/russian/data/langs/bx_persons/ru.xml
  26. 12 1
      modules/boonex/russian/data/langs/system/ru.xml
  27. 0 40
      template/css/editor.css
  28. 27 0
      template/css/editor.less
  29. BIN
      template/images/layout_topbottom_area_bar_left.png
  30. BIN
      template/images/layout_topbottom_area_bar_right.png
  31. 31 0
      template/layout_topbottom_area_bar_left.html
  32. 31 0
      template/layout_topbottom_area_bar_right.html
  33. 7 1
      template/scripts/BxBaseEditorTinyMCE.php
  34. 3 2
      template/scripts/BxBaseMenuSubmenu.php

+ 33 - 0
inc/classes/BxDolAccountQuery.php

@@ -222,6 +222,39 @@ class BxDolAccountQuery extends BxDolDb implements iBxDolSingleton
         return $this->query($sSql);
     }
 
+	/**
+     * Get account(s) by params
+     * @param  array   $aParams browse params
+     * @return array with account(s)
+     */
+    public function getAccounts($aParams)
+    {
+        $aMethod = array('name' => 'getAll', 'params' => array(0 => 'query'));
+
+    	$sFieldsClause = "`ta`.*"; 
+    	$sJoinClause = $sWhereClause = $sGroupClause = $sOrderClause = "";
+
+    	switch($aParams['type']) {
+    		case 'by_join_date':
+    			$aMethod['params'][1] = array(
+    				'date' => $aParams['date']
+    			);
+
+    			$sWhereClause = " AND `ta`.`added` > :date AND `ta`.`added` < UNIX_TIMESTAMP()";
+    			break;
+    	}
+
+    	$sGroupClause = $sGroupClause ? "GROUP BY " . $sGroupClause : "";
+		$sOrderClause = $sOrderClause ? "ORDER BY " . $sOrderClause : "";
+
+		$aMethod['params'][0] = "SELECT
+				" . $sFieldsClause . "
+            FROM `sys_accounts` AS `ta`" . $sJoinClause . "
+            WHERE 1" . $sWhereClause . " " . $sGroupClause . " " . $sOrderClause;
+
+        return call_user_func_array(array($this, $aMethod['name']), $aMethod['params']);
+    }
+
     /**
      * Search account profile by keyword
      */

+ 9 - 1
inc/classes/BxDolAclQuery.php

@@ -365,7 +365,7 @@ class BxDolAclQuery extends BxDolDb implements iBxDolSingleton
             $sWhere .= " AND `tlm`.`IDLevel` IN (" . $this->implode_escape($mixedLevelId) . ")";
         else
             $sWhere .= $this->prepareAsString(" AND `tlm`.`IDLevel` = ?", (int)$mixedLevelId);
-		$sWhere .= " AND (`tlm`.DateStarts IS NULL OR `tlm`.DateStarts <= NOW()) AND (`tlm`.DateExpires IS NULL OR `tlm`.DateExpires > NOW())";
+		$sWhere .= " AND (`tlm`.`DateStarts` IS NULL OR `tlm`.`DateStarts` <= NOW()) AND (`tlm`.`DateExpires` IS NULL OR `tlm`.`DateExpires` > NOW())";
 
 		$sJoin .= " INNER JOIN `sys_acl_levels_members` AS `tlm` ON `" . $sContentTable . "`.`" . $sContentField . "`=`tlm`.`IDMember`";
 		$sJoin .= " INNER JOIN `sys_acl_levels` AS `tl` ON `tlm`.`IDLevel`=`tl`.`ID`"; 
@@ -375,6 +375,14 @@ class BxDolAclQuery extends BxDolDb implements iBxDolSingleton
         	'join' => $sJoin
         );
     }
+
+    function getProfilesByMembership($mixedLevelId)
+    {
+    	$aSqlParts = $this->getContentByLevelAsSQLPart('sys_profiles', 'id', $mixedLevelId);
+
+    	$sSql = $this->prepare("SELECT `sys_profiles`.* FROM `sys_profiles`" . $aSqlParts['join'] . " WHERE 1" . $aSqlParts['where']);
+    	return $this->getAll($sSql); 
+    }
 }
 
 /** @} */

+ 80 - 0
inc/classes/BxDolCronAccount.php

@@ -0,0 +1,80 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) BoonEx Pty Limited - http://www.boonex.com/
+ * CC-BY License - http://creativecommons.org/licenses/by/3.0/
+ *
+ * @defgroup    TridentCore Trident Core
+ * @{
+ */
+
+class BxDolCronAccount extends BxDolCron
+{
+    protected function start()
+    {
+        set_time_limit(0);
+        ignore_user_abort();
+        ob_start();
+    }
+
+    protected function finish()
+    {
+        if (!($sOutput = ob_get_clean()))
+            return;
+
+		if(getParam('enable_notification_account') != 'on')
+			return;
+
+        $aTemplate = BxDolEmailTemplates::getInstance()->parseTemplate('t_Account', array(
+        	'site_title' => getParam('site_title'),
+        	'account_output' => $sOutput
+        ));
+        if(empty($aTemplate))
+        	return;
+
+        $aSent = array();
+        $aProfiles = BxDolAclQuery::getInstance()->getProfilesByMembership(array(MEMBERSHIP_ID_MODERATOR, MEMBERSHIP_ID_ADMINISTRATOR));
+        foreach($aProfiles as $aProfile) {
+        	$oProfile = BxDolProfile::getInstance($aProfile['id']);
+        	if(!$oProfile)
+        		continue;
+        	
+        	$oAccount = $oProfile->getAccountObject();
+        	if(!$oAccount || !$oAccount->isConfirmed())
+        		continue;
+
+        	$aAccount = $oAccount->getInfo();
+        	if((int)$aAccount['receive_news'] != 1)
+        		continue;
+
+        	if(in_array($aAccount['email'], $aSent))
+        		continue;
+
+            if(sendMail($aAccount['email'], $aTemplate['Subject'], $aTemplate['Body'], $aProfile['id']))
+            	$aSent[] = $aAccount['email'];
+        }
+    }
+
+    protected function processNewlyJoined()
+    {
+        $aAccounts = BxDolAccountQuery::getInstance()->getAccounts(array('type' => 'by_join_date', 'date' => time() - 86400));
+
+        $sAccounts = "";
+        foreach($aAccounts as $aAccount) {
+        	$oProfile = BxDolProfile::getInstance($aAccount['profile_id']);
+        	$sAccounts .= _t('_sys_notification_account_link', $oProfile->getUrl(), $oProfile->getDisplayName(), $aAccount['email']);
+        }
+
+        echo _t('_sys_notification_account', $sAccounts);
+    }
+
+    public function processing()
+    {
+        $this->start();
+
+        $this->processNewlyJoined();
+
+        $this->finish();
+    }
+}
+
+/** @} */

+ 17 - 4
install/sql/system.sql

@@ -151,6 +151,7 @@ INSERT INTO `sys_email_templates` (`Module`, `NameSystem`, `Name`, `Subject`, `B
 ('system', '_sys_et_txt_name_system_comment_replied', 't_CommentReplied', '_sys_et_txt_subject_comment_replied', '_sys_et_txt_body_comment_replied'),
 ('system', '_sys_et_txt_name_system_reported', 't_Reported', '_sys_et_txt_subject_system_reported', '_sys_et_txt_body_system_reported'),
 ('system', '_sys_et_txt_name_system_delayed_module_uninstall', 't_DelayedModuleUninstall', '_sys_et_txt_subject_delayed_module_uninstall', '_sys_et_txt_body_delayed_module_uninstall'),
+('system', '_sys_et_txt_name_system_account', 't_Account', '_sys_et_txt_subject_account', '_sys_et_txt_body_account'),
 ('system', '_sys_et_txt_name_system_pruning', 't_Pruning', '_sys_et_txt_subject_pruning', '_sys_et_txt_body_pruning'),
 ('system', '_sys_et_txt_name_profile_change_status_active', 't_ChangeStatusActive', '_sys_et_txt_subject_profile_change_status_active', '_sys_et_txt_body_profile_change_status_active'),
 ('system', '_sys_et_txt_name_profile_change_status_suspended', 't_ChangeStatusSuspended', '_sys_et_txt_subject_profile_change_status_suspended', '_sys_et_txt_body_profile_change_status_suspended'),
@@ -336,9 +337,7 @@ INSERT INTO `sys_options`(`category_id`, `name`, `caption`, `value`, `type`, `ex
 
 (@iCategoryId, 'sys_default_payment', '_adm_stg_cpt_option_sys_default_payment', 'payment', 'select', 'a:3:{s:6:"module";s:6:"system";s:6:"method";s:12:"get_payments";s:5:"class";s:21:"TemplPaymentsServices";}', '', '', 60),
 
-(@iCategoryId, 'sys_maps_api_key', '_adm_stg_cpt_option_sys_maps_api_key', '', 'digit', '', '', '', 70),
-
-(@iCategoryId, 'enable_notification_pruning', '_adm_stg_cpt_option_enable_notification_pruning', 'on', 'checkbox', '', '', '', 80);
+(@iCategoryId, 'sys_maps_api_key', '_adm_stg_cpt_option_sys_maps_api_key', '', 'digit', '', '', '', 70);
 
 
 --
@@ -417,6 +416,17 @@ INSERT INTO `sys_options`(`category_id`, `name`, `caption`, `value`, `type`, `ex
 (@iCategoryId, 'sys_acl_expire_notification_days', '_adm_stg_cpt_option_sys_acl_expire_notification_days', '1', 'digit', '', '', '', 1),
 (@iCategoryId, 'sys_acl_expire_notify_once', '_adm_stg_cpt_option_sys_acl_expire_notify_once', 'on', 'checkbox', '', '', '', 2);
 
+--
+-- CATEGORY: Notifications
+--
+INSERT INTO `sys_options_categories`(`type_id`, `name`, `caption`, `hidden`, `order`) VALUES (@iTypeId, 'notifications', '_adm_stg_cpt_category_notifications', 0, 16);
+SET @iCategoryId = LAST_INSERT_ID();
+
+INSERT INTO `sys_options`(`category_id`, `name`, `caption`, `value`, `type`, `extra`, `check`, `check_error`, `order`) VALUES
+(@iCategoryId, 'enable_notification_pruning', '_adm_stg_cpt_option_enable_notification_pruning', 'on', 'checkbox', '', '', '', 1),
+(@iCategoryId, 'enable_notification_account', '_adm_stg_cpt_option_enable_notification_account', 'on', 'checkbox', '', '', '', 2);
+
+
 --
 -- Table structure for table `sys_options_mixes`
 --
@@ -1202,6 +1212,7 @@ CREATE TABLE `sys_cron_jobs` (
 INSERT INTO `sys_cron_jobs` (`name`, `time`, `class`, `file`, `service_call`) VALUES
 ('pruning', '0 0 * * *', 'BxDolCronPruning', 'inc/classes/BxDolCronPruning.php', ''),
 ('sys_acl', '0 0 * * *', 'BxDolCronAcl', 'inc/classes/BxDolCronAcl.php', ''),
+('sys_account', '0 0 * * *', 'BxDolCronAccount', 'inc/classes/BxDolCronAccount.php', ''),
 ('sys_upgrade', '0 3 * * *', 'BxDolCronUpgradeCheck', 'inc/classes/BxDolCronUpgradeCheck.php', ''),
 ('sys_upgrade_modules', '30 2 * * *', 'BxDolCronUpgradeModulesCheck', 'inc/classes/BxDolCronUpgradeModulesCheck.php', ''),
 ('sys_storage', '* * * * *', 'BxDolCronStorage', 'inc/classes/BxDolCronStorage.php', ''),
@@ -3418,7 +3429,9 @@ INSERT INTO `sys_pages_layouts` (`id`, `name`, `icon`, `title`, `template`, `cel
 (8, 'top_area_3_columns', 'layout_top_area_3_columns.png', '_sys_layout_top_area_3_columns', 'layout_top_area_3_columns.html', 4),
 (9, 'top_area_2_columns', 'layout_top_area_2_columns.png', '_sys_layout_top_area_2_columns', 'layout_top_area_2_columns.html', 3),
 (10, 'topbottom_area_2_columns', 'layout_topbottom_area_2_columns.png', '_sys_layout_topbottom_area_2_columns', 'layout_topbottom_area_2_columns.html', 4),
-(11, 'bottom_area_2_columns', 'layout_bottom_area_2_columns.png', '_sys_layout_bottom_area_2_columns', 'layout_bottom_area_2_columns.html', 3);
+(11, 'bottom_area_2_columns', 'layout_bottom_area_2_columns.png', '_sys_layout_bottom_area_2_columns', 'layout_bottom_area_2_columns.html', 3),
+(12, 'topbottom_area_bar_right', 'layout_topbottom_area_bar_right.png', '_sys_layout_topbottom_area_bar_right', 'layout_topbottom_area_bar_right.html', 4),
+(13, 'topbottom_area_bar_left', 'layout_topbottom_area_bar_left.png', '_sys_layout_topbottom_area_bar_left', 'layout_topbottom_area_bar_left.html', 4);
 
 CREATE TABLE IF NOT EXISTS `sys_pages_design_boxes` (
   `id` int(11) NOT NULL,

+ 15 - 5
modules/base/text/classes/BxBaseModTextPageEntry.php

@@ -34,15 +34,25 @@ class BxBaseModTextPageEntry extends BxBaseModGeneralPageEntry
             ));
 
             // select view entry submenu
-            $oMenuSubmenu = BxDolMenu::getObjectInstance('sys_site_submenu');
-            $oMenuSubmenu->setObjectSubmenu($CNF['OBJECT_MENU_SUBMENU_VIEW_ENTRY'], array (
-                'title' => $sTitle,
-                'link' => $sUrl,
-                'icon' => $CNF['ICON'],
+            $this->_setSubmenu(array(
+            	'title' => $sTitle,
+				'link' => $sUrl,
             ));
         }
     }
 
+    protected function _setSubmenu($aParams)
+    {
+    	$CNF = &$this->_oModule->_oConfig->CNF;
+
+		$oMenuSubmenu = BxDolMenu::getObjectInstance('sys_site_submenu');
+		$oMenuSubmenu->setObjectSubmenu($CNF['OBJECT_MENU_SUBMENU_VIEW_ENTRY'], array_merge(array(
+			'title' => '',
+			'link' => '',
+			'icon' => $CNF['ICON'],
+		), $aParams));
+    }
+
     protected function _getBlockService ($aBlock)
     {
         $a = parent::_getBlockService ($aBlock);

+ 2 - 0
modules/boonex/air/data/template/system/css/editor.less

@@ -0,0 +1,2 @@
+@import 'default.less';
+@import '../../../../../../../template/css/editor.less';

+ 12 - 1
modules/boonex/english/data/langs/system/en.xml

@@ -1146,6 +1146,7 @@
 	<string name="_adm_scs_operation_done"><![CDATA[]]></string>
 	<string name="_adm_stg_cpt_category_account"><![CDATA[Account]]></string>
 	<string name="_adm_stg_cpt_category_acl"><![CDATA[ACL]]></string>
+	<string name="_adm_stg_cpt_category_notifications"><![CDATA[Notifications]]></string>
 	<string name="_adm_stg_cpt_category_cache"><![CDATA[Cache]]></string>
 	<string name="_adm_stg_cpt_category_general"><![CDATA[General]]></string>
 	<string name="_adm_stg_cpt_category_hidden"><![CDATA[Hidden]]></string>
@@ -1161,7 +1162,8 @@
 	<string name="_adm_stg_cpt_option_currency_sign"><![CDATA[Currency sign (for display purposes only)]]></string>
 	<string name="_adm_stg_err_option_currency_sign"><![CDATA[Cannot be empty.]]></string>
 	<string name="_adm_stg_cpt_option_enable_gd"><![CDATA[Use GD library for image processing]]></string>
-	<string name="_adm_stg_cpt_option_enable_notification_pruning"><![CDATA[Enable email notifications for pruning results]]></string>
+	<string name="_adm_stg_cpt_option_enable_notification_account"><![CDATA[Notify about new accounts]]></string>
+	<string name="_adm_stg_cpt_option_enable_notification_pruning"><![CDATA[Notify about pruning results]]></string>
 	<string name="_adm_stg_cpt_option_expire_notification_days"><![CDATA[Number of days before membership expiration to notify members ( -1 = after expiration )]]></string>
 	<string name="_adm_stg_cpt_option_expire_notify_once"><![CDATA[Notify members about membership expiration only once (every day otherwise)]]></string>
 	<string name="_adm_stg_cpt_option_lang_default"><![CDATA[Default Language]]></string>
@@ -1637,6 +1639,9 @@ If it is not enabled then please consider implement this optimization, since it
 	<string name="_sys_et_txt_body_profile_change_status_suspended"><![CDATA[<bx_include_auto:_email_header.html />
 <p>Hello {profile_name},</p>
 <p>Your profile was suspended.</p>
+<bx_include_auto:_email_footer.html />]]></string>
+	<string name="_sys_et_txt_body_account"><![CDATA[<bx_include_auto:_email_header.html />
+<p>{account_output}</p>
 <bx_include_auto:_email_footer.html />]]></string>
 	<string name="_sys_et_txt_body_pruning"><![CDATA[<bx_include_auto:_email_header.html />
 <p>{pruning_output}</p>
@@ -1675,6 +1680,7 @@ If it is not enabled then please consider implement this optimization, since it
 	<string name="_sys_et_txt_name_profile_change_status_active"><![CDATA[Profile status changed to active]]></string>
 	<string name="_sys_et_txt_name_profile_change_status_pending"><![CDATA[Profile status changed to pending]]></string>
 	<string name="_sys_et_txt_name_profile_change_status_suspended"><![CDATA[Profile status changed to suspended]]></string>
+	<string name="_sys_et_txt_name_system_account"><![CDATA[New Accounts]]></string>
 	<string name="_sys_et_txt_name_system_pruning"><![CDATA[Pruning result]]></string>
 	<string name="_sys_et_txt_name_upgrade_failed"><![CDATA[Upgrade failed]]></string>
 	<string name="_sys_et_txt_name_upgrade_modules_failed"><![CDATA[Modules upgrade failed]]></string>
@@ -1693,6 +1699,7 @@ If it is not enabled then please consider implement this optimization, since it
 	<string name="_sys_et_txt_subject_profile_change_status_active"><![CDATA[Profile Activated]]></string>
 	<string name="_sys_et_txt_subject_profile_change_status_pending"><![CDATA[Profile Pending Review]]></string>
 	<string name="_sys_et_txt_subject_profile_change_status_suspended"><![CDATA[Profile was Suspended]]></string>
+	<string name="_sys_et_txt_subject_account"><![CDATA[New members joined to {site_name}]]></string>
 	<string name="_sys_et_txt_subject_pruning"><![CDATA[{site_name} pruning result]]></string>
 	<string name="_sys_et_txt_subject_upgrade_failed"><![CDATA[{site_name} upgrade failed]]></string>
 	<string name="_sys_et_txt_subject_upgrade_modules_failed"><![CDATA[Modules upgrade failed on {site_name}]]></string>
@@ -1908,6 +1915,8 @@ If it is not enabled then please consider implement this optimization, since it
 	<string name="_sys_layout_top_area_bar_left"><![CDATA[Top area with left bar]]></string>
 	<string name="_sys_layout_top_area_bar_right"><![CDATA[Top area with right bar]]></string>
 	<string name="_sys_layout_topbottom_area_2_columns"><![CDATA[Top&bottom areas with 2 columns in the middle]]></string>
+	<string name="_sys_layout_topbottom_area_bar_left"><![CDATA[Top&bottom areas with left bar in the middle]]></string>
+	<string name="_sys_layout_topbottom_area_bar_right"><![CDATA[Top&bottom areas with right bar in the middle]]></string>	
 	<string name="_sys_loading"><![CDATA[Loading...]]></string>
 	<string name="_sys_location_country"><![CDATA[<i class="sys-icon location-arrow"></i> {0}]]></string>
 	<string name="_sys_location_country_city"><![CDATA[<i class="sys-icon location-arrow"></i> {2}, {1}, {0}]]></string>
@@ -2043,6 +2052,8 @@ If it is not enabled then please consider implement this optimization, since it
 	<string name="_sys_mobile_status"><![CDATA[Status]]></string>
     <string name="_sys_name"><![CDATA[Name]]></string>
     <string name="_sys_next"><![CDATA[Next]]></string>
+    <string name="_sys_notification_account"><![CDATA[<h3>Newly joined members:</h3><ul>{0}</ul>]]></string>
+	<string name="_sys_notification_account_link"><![CDATA[<li><a href="{0}">{1}</a> ({2})</li>]]></string>
     <string name="_sys_on"><![CDATA[on]]></string>
     <string name="_sys_off"><![CDATA[off]]></string>
 	<string name="_sys_page_block_title_about"><![CDATA[About]]></string>

+ 8 - 0
modules/boonex/forum/classes/BxForumGrid.php

@@ -24,11 +24,19 @@ class BxForumGrid extends BxTemplGrid
 
         $this->_aOptions['paginate_per_page'] = (int)$this->_oModule->_oDb->getParam('bx_forum_per_page_browse');
         $this->_sDefaultSortingOrder = 'DESC';
+
+	    $sParams = bx_get('params');
+        if(!empty($sParams)) {
+        	$aParams = unserialize(urldecode($sParams));
+        	if(!empty($aParams) && is_array($aParams))
+            	$this->setBrowseParams($aParams);
+        }
     }
 
     public function setBrowseParams($aParams)
     {
     	$this->_aParams = $aParams;
+    	$this->_aQueryAppend['params'] = urlencode(serialize($this->_aParams));
 
     	$sField = 'added';
     	if(!empty($this->_aParams['type']))

+ 1 - 1
modules/boonex/groups/classes/BxGroupsSearchResult.php

@@ -46,7 +46,7 @@ class BxGroupsSearchResult extends BxBaseModProfileSearchResult
                     'joinFields' => array(),
                 ),
             ),
-            'paginate' => array('perPage' => 20, 'start' => 0),
+            'paginate' => array('perPage' => getParam('bx_groups_per_page_browse'), 'start' => 0),
             'sorting' => 'none',
             'rss' => array(
                 'title' => '',

+ 1 - 0
modules/boonex/groups/install/langs/en.xml

@@ -4,6 +4,7 @@
 	<string name="_bx_groups"><![CDATA[Groups]]></string>
 
 	<string name="_bx_groups_option_num_connections_quick"><![CDATA[Number of items in friends block]]></string>
+	<string name="_bx_groups_option_per_page_browse"><![CDATA[Number of items per page]]></string>
 	<string name="_bx_groups_option_num_rss"><![CDATA[Number of items in RSS feed]]></string>
 
 	<string name="_bx_groups_form_profile"><![CDATA[Groups]]></string>

+ 1 - 0
modules/boonex/groups/install/sql/enable.sql

@@ -12,6 +12,7 @@ SET @iCategId = LAST_INSERT_ID();
 
 INSERT INTO `sys_options` (`name`, `value`, `category_id`, `caption`, `type`, `extra`, `check`, `check_error`, `order`) VALUES
 ('bx_groups_num_connections_quick', '4', @iCategId, '_bx_groups_option_num_connections_quick', 'digit', '', '', '', 10),
+('bx_groups_per_page_browse', '20', @iCategId, '_bx_groups_option_per_page_browse', 'digit', '', '', '', 11),
 ('bx_groups_num_rss', '10', @iCategId, '_bx_groups_option_num_rss', 'digit', '', '', '', 12);
 
 -- PAGES

+ 3 - 3
modules/boonex/market/template/unit_gallery.html

@@ -1,5 +1,5 @@
-<div class="bx-base-text-unit bx-base-text-unit-gallery bx-def-gal-unit-size">
-	<div class="bx-market-unit-gallery-cnt bx-def-margin-sec bx-def-round-corners bx-def-box bx-def-color-bg-box">
+<div class="bx-base-text-unit bx-base-text-unit-gallery bx-def-gal-unit-size bx-def-padding-sec">
+	<div class="bx-market-unit-gallery-cnt bx-def-round-corners bx-def-box bx-def-color-bg-box">
 	    <bx_if:thumb>
 	        <a href="__content_url__" title="__summary_attr__">
 	            <div class="bx-base-text-unit-thumb bx-def-gal-div-size bx-def-font-middle" style="background-image:url(__gallery_url__)">
@@ -9,7 +9,7 @@
 	    </bx_if:thumb>
 	    <bx_if:no_thumb>
 	        <div class="bx-def-gal-img-column">
-	            <div class="bx-base-text-unit-no-thumb bx-def-gal-div-size bx-def-box bx-def-font-middle bx-def-font-grayed bx-def-padding bx-def-box-sizing">
+	            <div class="bx-base-text-unit-no-thumb bx-def-gal-div-size bx-def-font-middle bx-def-font-grayed bx-def-padding bx-def-box-sizing">
 	                __summary_plain__
 	                <div class="bx-base-text-unit-strecher">__strecher__</div>
 	            </div>

+ 2 - 0
modules/boonex/ocean/data/template/system/css/editor.less

@@ -0,0 +1,2 @@
+@import 'default.less';
+@import '../../../../../../../template/css/editor.less';

+ 1 - 1
modules/boonex/organizations/classes/BxOrgsSearchResult.php

@@ -49,7 +49,7 @@ class BxOrgsSearchResult extends BxBaseModProfileSearchResult
                     'joinFields' => array(),
                 ),
             ),
-            'paginate' => array('perPage' => 20, 'start' => 0),
+            'paginate' => array('perPage' => getParam('bx_organizations_per_page_browse'), 'start' => 0),
             'sorting' => 'none',
             'rss' => array(
                 'title' => '',

+ 1 - 0
modules/boonex/organizations/install/langs/en.xml

@@ -6,6 +6,7 @@
 	<string name="_bx_orgs_option_autoapproval"><![CDATA[Activate all organizations after creation automatically]]></string>
 	<string name="_bx_orgs_option_default_acl_level"><![CDATA[Default level to assign after organizations's profile creation]]></string>
 	<string name="_bx_orgs_option_num_connections_quick"><![CDATA[Number of items in friends block]]></string>
+	<string name="_bx_orgs_option_per_page_browse"><![CDATA[Number of items per page]]></string>
     <string name="_bx_orgs_option_num_rss"><![CDATA[Number of items in RSS feed]]></string>
     <string name="_bx_orgs_option_searchable_fields"><![CDATA[Searchable fields]]></string>
 

+ 1 - 0
modules/boonex/organizations/install/sql/enable.sql

@@ -14,6 +14,7 @@ INSERT INTO `sys_options` (`name`, `value`, `category_id`, `caption`, `type`, `e
 ('bx_organizations_autoapproval', 'on', @iCategId, '_bx_orgs_option_autoapproval', 'checkbox', '', '', '', 1),
 ('bx_organizations_default_acl_level', '3', @iCategId, '_bx_orgs_option_default_acl_level', 'select', 'a:4:{s:6:"module";s:6:"system";s:6:"method";s:15:"get_memberships";s:6:"params";a:2:{i:0;b:0;i:1;b:1;}s:5:"class";s:16:"TemplAclServices";}', '', '', 2),
 ('bx_organizations_num_connections_quick', '4', @iCategId, '_bx_orgs_option_num_connections_quick', 'digit', '', '', '', 10),
+('bx_organizations_per_page_browse', '20', @iCategId, '_bx_orgs_option_per_page_browse', 'digit', '', '', '', 11),
 ('bx_organizations_num_rss', '10', @iCategId, '_bx_orgs_option_num_rss', 'digit', '', '', '', 12),
 ('bx_organizations_searchable_fields', 'org_name,org_desc', @iCategId, '_bx_orgs_option_searchable_fields', 'list', 'a:2:{s:6:"module";s:16:"bx_organizations";s:6:"method";s:21:"get_searchable_fields";}', '', '', 20);
 

+ 1 - 1
modules/boonex/persons/classes/BxPersonsSearchResult.php

@@ -49,7 +49,7 @@ class BxPersonsSearchResult extends BxBaseModProfileSearchResult
                     'joinFields' => array(),
                 ),
             ),
-            'paginate' => array('perPage' => 20, 'start' => 0),
+            'paginate' => array('perPage' => getParam('bx_persons_per_page_browse'), 'start' => 0),
             'sorting' => 'none',
             'rss' => array(
                 'title' => '',

+ 1 - 0
modules/boonex/persons/install/langs/en.xml

@@ -6,6 +6,7 @@
 	<string name="_bx_persons_option_autoapproval"><![CDATA[Activate all persons after creation automatically]]></string>
 	<string name="_bx_persons_option_default_acl_level"><![CDATA[Default member's level to assign after person's profile creation]]></string>
 	<string name="_bx_persons_option_num_connections_quick"><![CDATA[Number of items in friends block]]></string>
+	<string name="_bx_persons_option_per_page_browse"><![CDATA[Number of items per page]]></string>
 	<string name="_bx_persons_option_num_rss"><![CDATA[Number of items in RSS feed]]></string>
 	<string name="_bx_persons_option_searchable_fields"><![CDATA[Searchable fields]]></string>
 

+ 1 - 0
modules/boonex/persons/install/sql/enable.sql

@@ -14,6 +14,7 @@ INSERT INTO `sys_options` (`name`, `value`, `category_id`, `caption`, `type`, `e
 ('bx_persons_autoapproval', 'on', @iCategId, '_bx_persons_option_autoapproval', 'checkbox', '', '', '', 1),
 ('bx_persons_default_acl_level', '3', @iCategId, '_bx_persons_option_default_acl_level', 'select', 'a:4:{s:6:"module";s:6:"system";s:6:"method";s:15:"get_memberships";s:6:"params";a:2:{i:0;b:0;i:1;b:1;}s:5:"class";s:16:"TemplAclServices";}', '', '', 2),
 ('bx_persons_num_connections_quick', '4', @iCategId, '_bx_persons_option_num_connections_quick', 'digit', '', '', '', 10),
+('bx_persons_per_page_browse', '20', @iCategId, '_bx_persons_option_per_page_browse', 'digit', '', '', '', 11),
 ('bx_persons_num_rss', '10', @iCategId, '_bx_persons_option_num_rss', 'digit', '', '', '', 12),
 ('bx_persons_searchable_fields', 'fullname,description', @iCategId, '_bx_persons_option_searchable_fields', 'list', 'a:2:{s:6:"module";s:10:"bx_persons";s:6:"method";s:21:"get_searchable_fields";}', '', '', 20);
 

+ 8 - 0
modules/boonex/posts/classes/BxPostsPageEntry.php

@@ -19,6 +19,14 @@ class BxPostsPageEntry extends BxBaseModTextPageEntry
         $this->MODULE = 'bx_posts';
         parent::__construct($aObject, $oTemplate);
     }
+
+    protected function _setSubmenu($aParams)
+    {
+    	parent::_setSubmenu(array_merge($aParams, array(
+    		'title' => '',
+    		'icon' => ''
+    	)));
+    }
 }
 
 /** @} */

+ 2 - 2
modules/boonex/posts/install/sql/enable.sql

@@ -209,8 +209,8 @@ INSERT INTO `sys_menu_sets`(`set_name`, `module`, `title`, `deletable`) VALUES
 ('bx_posts_view_submenu', 'bx_posts', '_bx_posts_menu_set_title_view_entry_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_posts_view_submenu', 'bx_posts', 'view-post', '_bx_posts_menu_item_title_system_view_entry', '_bx_posts_menu_item_title_view_entry_submenu_entry', 'page.php?i=view-post&id={content_id}', '', '', '', '', 2147483647, 1, 0, 1),
-('bx_posts_view_submenu', 'bx_posts', 'view-post-comments', '_bx_posts_menu_item_title_system_view_entry_comments', '_bx_posts_menu_item_title_view_entry_submenu_comments', 'page.php?i=view-post-comments&id={content_id}', '', '', '', '', 2147483647, 1, 0, 2);
+('bx_posts_view_submenu', 'bx_posts', 'view-post', '_bx_posts_menu_item_title_system_view_entry', '_bx_posts_menu_item_title_view_entry_submenu_entry', 'page.php?i=view-post&id={content_id}', '', '', '', '', 2147483647, 0, 0, 1),
+('bx_posts_view_submenu', 'bx_posts', 'view-post-comments', '_bx_posts_menu_item_title_system_view_entry_comments', '_bx_posts_menu_item_title_view_entry_submenu_comments', 'page.php?i=view-post-comments&id={content_id}', '', '', '', '', 2147483647, 0, 0, 2);
 
 -- MENU: profile stats
 SET @iNotifMenuOrder = (SELECT IFNULL(MAX(`order`), 0) FROM `sys_menu_items` WHERE `set_name` = 'sys_profile_stats' AND `active` = 1 LIMIT 1);

+ 2 - 0
modules/boonex/protean/data/template/system/css/editor.less

@@ -0,0 +1,2 @@
+@import 'default.less';
+@import '../../../../../../../template/css/editor.less';

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

@@ -4,6 +4,7 @@
 	<string name="_bx_groups"><![CDATA[Группы]]></string>
 
 	<string name="_bx_groups_option_num_connections_quick"><![CDATA[Число элементов в блоке друзей]]></string>
+	<string name="_bx_groups_option_per_page_browse"><![CDATA[Число элементов на странице]]></string>
 	<string name="_bx_groups_option_num_rss"><![CDATA[Число элементов в ленте RSS]]></string>
 
 	<string name="_bx_groups_form_profile"><![CDATA[Группы]]></string>

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

@@ -6,6 +6,7 @@
 	<string name="_bx_orgs_option_autoapproval"><![CDATA[Автоматически активировать все организации после создания]]></string>
 	<string name="_bx_orgs_option_default_acl_level"><![CDATA[Уровень, назначаемый созданному профилю организации по умолчанию]]></string>
 	<string name="_bx_orgs_option_num_connections_quick"><![CDATA[Число элементов в блоке друзей]]></string>
+	<string name="_bx_orgs_option_per_page_browse"><![CDATA[Число элементов на странице]]></string>
     <string name="_bx_orgs_option_num_rss"><![CDATA[Число элементов в ленте RSS]]></string>
     <string name="_bx_orgs_option_searchable_fields"><![CDATA[Поля для поиска]]></string>
 

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

@@ -6,6 +6,7 @@
 	<string name="_bx_persons_option_autoapproval"><![CDATA[Автоматически активировать всех персон после создания]]></string>
 	<string name="_bx_persons_option_default_acl_level"><![CDATA[Уровень, по умолчанию назначаемый созданному персональному профилю]]></string>
 	<string name="_bx_persons_option_num_connections_quick"><![CDATA[Число элементов в блоке друзей]]></string>
+	<string name="_bx_persons_option_per_page_browse"><![CDATA[Число элементов на странице]]></string>
     <string name="_bx_persons_option_num_rss"><![CDATA[Число элементов в ленте RSS]]></string>
     <string name="_bx_persons_option_searchable_fields"><![CDATA[Поля для поиска]]></string>
 

+ 12 - 1
modules/boonex/russian/data/langs/system/ru.xml

@@ -1144,6 +1144,7 @@
 	<string name="_adm_scs_operation_done"><![CDATA[]]></string>
 	<string name="_adm_stg_cpt_category_account"><![CDATA[Аккаунт]]></string>
 	<string name="_adm_stg_cpt_category_acl"><![CDATA[Уровни доступа]]></string>
+	<string name="_adm_stg_cpt_category_notifications"><![CDATA[Оповещения]]></string>
 	<string name="_adm_stg_cpt_category_cache"><![CDATA[Кэш]]></string>
 	<string name="_adm_stg_cpt_category_general"><![CDATA[Общие]]></string>
 	<string name="_adm_stg_cpt_category_hidden"><![CDATA[Скрытые]]></string>
@@ -1159,7 +1160,8 @@
 	<string name="_adm_stg_cpt_option_currency_sign"><![CDATA[Знак валюты (только для отображения)]]></string>
 	<string name="_adm_stg_err_option_currency_sign"><![CDATA[Не должно быть пустым.]]></string>
 	<string name="_adm_stg_cpt_option_enable_gd"><![CDATA[Использовать библиотеку GD для обработки изображений]]></string>
-	<string name="_adm_stg_cpt_option_enable_notification_pruning"><![CDATA[Включить имейл оповещение о результатах очистки]]></string>
+	<string name="_adm_stg_cpt_option_enable_notification_account"><![CDATA[Оповещать о новых аккаунтах]]></string>
+	<string name="_adm_stg_cpt_option_enable_notification_pruning"><![CDATA[Оповещать о результатах очистки]]></string>
 	<string name="_adm_stg_cpt_option_expire_notification_days"><![CDATA[Оповещать перед тем, как истечёт срок членства за такое количество дней ( -1 = после истечения срока )]]></string>
 	<string name="_adm_stg_cpt_option_expire_notify_once"><![CDATA[Оповещать об истечении срока членства только один раз (иначе, каждый день)]]></string>
 	<string name="_adm_stg_cpt_option_lang_default"><![CDATA[Основной Язык]]></string>
@@ -1635,6 +1637,9 @@
 	<string name="_sys_et_txt_body_profile_change_status_suspended"><![CDATA[<bx_include_auto:_email_header.html />
 <p>Привет {profile_name},</p>
 <p>Ваш профиль был заблокирован.</p>
+<bx_include_auto:_email_footer.html />]]></string>
+	<string name="_sys_et_txt_body_account"><![CDATA[<bx_include_auto:_email_header.html />
+<p>{account_output}</p>
 <bx_include_auto:_email_footer.html />]]></string>
 	<string name="_sys_et_txt_body_pruning"><![CDATA[<bx_include_auto:_email_header.html />
 <p>{pruning_output}</p>
@@ -1673,6 +1678,7 @@
 	<string name="_sys_et_txt_name_profile_change_status_active"><![CDATA[Статус профиля изменён на Активный]]></string>
 	<string name="_sys_et_txt_name_profile_change_status_pending"><![CDATA[Статус профиля изменён на Ожидающий]]></string>
 	<string name="_sys_et_txt_name_profile_change_status_suspended"><![CDATA[Статус профиля изменён на Заблокированный]]></string>
+	<string name="_sys_et_txt_name_system_account"><![CDATA[Новые аккаунты]]></string>
 	<string name="_sys_et_txt_name_system_pruning"><![CDATA[Результат очистки]]></string>
 	<string name="_sys_et_txt_name_upgrade_failed"><![CDATA[Обновление не удалось]]></string>
 	<string name="_sys_et_txt_name_upgrade_modules_failed"><![CDATA[Обновление модулей не удалось]]></string>
@@ -1691,6 +1697,7 @@
 	<string name="_sys_et_txt_subject_profile_change_status_active"><![CDATA[Профиль активирован]]></string>
 	<string name="_sys_et_txt_subject_profile_change_status_pending"><![CDATA[Профиль в ожидании одобрения]]></string>
 	<string name="_sys_et_txt_subject_profile_change_status_suspended"><![CDATA[Профиль заблокирован]]></string>
+	<string name="_sys_et_txt_subject_account"><![CDATA[Новые пользователи на {site_name} сайте]]></string>
 	<string name="_sys_et_txt_subject_pruning"><![CDATA[{site_name} - результат очистки]]></string>
 	<string name="_sys_et_txt_subject_upgrade_failed"><![CDATA[{site_name} - обновление не удалось]]></string>
 	<string name="_sys_et_txt_subject_upgrade_modules_failed"><![CDATA[Не удалось обновить модули на сайте {site_name}]]></string>
@@ -1906,6 +1913,8 @@
 	<string name="_sys_layout_top_area_bar_left"><![CDATA[Верхнее пространство с левой линейкой]]></string>
 	<string name="_sys_layout_top_area_bar_right"><![CDATA[Верхнее пространство с правой линейкой]]></string>
 	<string name="_sys_layout_topbottom_area_2_columns"><![CDATA[Верхнее и нижнее пространства с 2 столбцами посередине]]></string>
+	<string name="_sys_layout_topbottom_area_bar_left"><![CDATA[Верхнее и нижнее пространства с левой линейкой посередине]]></string>
+	<string name="_sys_layout_topbottom_area_bar_right"><![CDATA[Верхнее и нижнее пространства с правой линейкой посередине]]></string>
 	<string name="_sys_loading"><![CDATA[Загрузка...]]></string>
 	<string name="_sys_location_country"><![CDATA[<i class="sys-icon location-arrow"></i> {0}]]></string>
 	<string name="_sys_location_country_city"><![CDATA[<i class="sys-icon location-arrow"></i> {2}, {1}, {0}]]></string>
@@ -2041,6 +2050,8 @@
 	<string name="_sys_mobile_status"><![CDATA[Статус]]></string>
     <string name="_sys_name"><![CDATA[Имя]]></string>
     <string name="_sys_next"><![CDATA[Ещё]]></string>
+    <string name="_sys_notification_account"><![CDATA[<h3>Недавно присоединившиеся пользователи:</h3><ul>{0}</ul>]]></string>
+	<string name="_sys_notification_account_link"><![CDATA[<li><a href="{0}">{1}</a> ({2})</li>]]></string>
     <string name="_sys_on"><![CDATA[вкл.]]></string>
     <string name="_sys_off"><![CDATA[выкл.]]></string>
 	<string name="_sys_page_block_title_about"><![CDATA[Об...]]></string>

+ 0 - 40
template/css/editor.css

@@ -1,40 +0,0 @@
-@import url(default.less);
-
-/* NOTE: copied from "fonts" section from default.css */
-
-body, td, pre {
-    font-family: Helvetica, Arial, sans-serif; 
-    font-weight: 400;
-	font-size: 18px;
-	font-size: 1.125rem;
-    color:#333;
-}
-
-h1 {
-	font-size: 38px;
-	font-size: 2.4rem;
-	font-weight: 700;
-}
-
-h2 {
-	font-size: 24px;
-	font-size: 1.5rem;
-	font-weight: 500;
-}
-
-h3 {
-	font-size: 18px;
-	font-size: 1.125rem;
-	font-weight: 500;
-}
-
-blockquote {
-    /* NOTE: copied from common.css */
-    border-left: 2px solid #ccc;
-    padding-left: 10px;
-}
-
-.bx-hide-in-htmleditor {
-    display:none;
-}
-

+ 27 - 0
template/css/editor.less

@@ -0,0 +1,27 @@
+@import 'default.less';
+
+body, td, pre {
+    .bx-def-font;
+}
+
+h1 {
+	.bx-def-font-h1;
+}
+
+h2 {
+	.bx-def-font-h2;
+}
+
+h3 {
+	.bx-def-font-h3;
+}
+
+blockquote {
+    /* NOTE: copied from common.css */
+    border-left: 2px solid #ccc;
+    padding-left: 10px;
+}
+
+.bx-hide-in-htmleditor {
+    display:none;
+}

BIN
template/images/layout_topbottom_area_bar_left.png


BIN
template/images/layout_topbottom_area_bar_right.png


+ 31 - 0
template/layout_topbottom_area_bar_left.html

@@ -0,0 +1,31 @@
+<!-- layout top & bottom areas bar left [ start ] -->
+<div class="bx-layout-wrapper bx-layout-topbottom-area-bar-left">
+
+    <bx_include_auto:_row_1_column.html />
+
+    <div class="bx-layout-row bx-clearfix">
+        <div class="bx-layout-col bx-layout-bar-left-bar bx-layout-column-thin">
+            <div class="bx-layout-cell bx-def-padding-sec-right" id="bx-layout-cell-2">
+                __cell_2__
+            </div>
+        </div>
+        <div class="bx-layout-col bx-layout-bar-left-content bx-layout-column-wide">
+            <div class="bx-layout-cell bx-def-padding-sec-left" id="bx-layout-cell-3">
+                __cell_3__
+            </div>
+        </div>
+    </div>
+
+    <div class="bx-layout-row bx-clearfix">
+        <div class="bx-layout-col bx-layout-1-column-column1 bx-layout-column-fullwidth">
+            <div class="bx-layout-cell" id="bx-layout-cell-4">
+                __cell_4__
+            </div>
+        </div>
+    </div>
+
+</div>
+
+<bx_include_auto:_layout_align_columns.html />
+
+<!-- layout top area 2 columns [  end  ] -->

+ 31 - 0
template/layout_topbottom_area_bar_right.html

@@ -0,0 +1,31 @@
+<!-- layout top & bottom areas bar right [ start ] -->
+<div class="bx-layout-wrapper bx-layout-topbottom-area-bar-right">
+
+    <bx_include_auto:_row_1_column.html />
+
+    <div class="bx-layout-row bx-clearfix">
+        <div class="bx-layout-col bx-layout-bar-right-content bx-layout-column-wide">
+            <div class="bx-layout-cell bx-def-padding-sec-right" id="bx-layout-cell-2">
+                __cell_2__
+            </div>
+        </div>
+        <div class="bx-layout-col bx-layout-bar-right-bar bx-layout-column-thin">
+            <div class="bx-layout-cell bx-def-padding-sec-left" id="bx-layout-cell-3">
+                __cell_3__
+            </div>
+        </div>
+    </div>
+
+    <div class="bx-layout-row bx-clearfix">
+        <div class="bx-layout-col bx-layout-1-column-column1 bx-layout-column-fullwidth">
+            <div class="bx-layout-cell" id="bx-layout-cell-4">
+                __cell_4__
+            </div>
+        </div>
+    </div>
+
+</div>
+
+<bx_include_auto:_layout_align_columns.html />
+
+<!-- layout top area 2 columns [  end  ] -->

+ 7 - 1
template/scripts/BxBaseEditorTinyMCE.php

@@ -168,12 +168,18 @@ class BxBaseEditorTinyMCE extends BxDolEditor
         // detect language
         $sLang = BxDolLanguages::getInstance()->detectLanguageFromArray (self::$CONF_LANGS);
 
+        $sCss = 'editor.less';
+        $aCss = BxDolTemplate::getInstance()->_lessCss(array(
+        	'path' => $this->_oTemplate->getCssPath($sCss),
+        	'url' => $this->_oTemplate->getCssUrl($sCss)
+        ));
+
         // initialize editor
         $sInitEditor = $this->_replaceMarkers(self::$CONF_COMMON, array(
             'bx_var_custom_init' => $sToolsItems,
             'bx_var_custom_conf' => $this->_sConfCustom,
             'bx_var_plugins_path' => bx_js_string(BX_DOL_URL_PLUGINS, BX_ESCAPE_STR_APOS),
-            'bx_var_css_path' => bx_js_string($this->_oTemplate->getCssUrl('editor.css'), BX_ESCAPE_STR_APOS),
+            'bx_var_css_path' => bx_js_string($aCss['url'], BX_ESCAPE_STR_APOS),
             'bx_var_skin' => bx_js_string($this->_aObject['skin'], BX_ESCAPE_STR_APOS),
             'bx_var_lang' => bx_js_string($sLang, BX_ESCAPE_STR_APOS),
             'bx_var_selector' => bx_js_string($sSelector, BX_ESCAPE_STR_APOS),

+ 3 - 2
template/scripts/BxBaseMenuSubmenu.php

@@ -98,17 +98,18 @@ class BxBaseMenuSubmenu extends BxTemplMenu
 
         $oMenuActions = BxDolMenu::getObjectInstance($this->_sObjectActionsMenu);
 
+        $bImage = strpos($aMenuItemSelected['icon'], '.') !== false;
         $aVars = array (
             'object' => $this->_sObject,
             'title' => bx_process_output($aMenuItemSelected['title']),
             'link' => BxDolPermalinks::getInstance()->permalink($aMenuItemSelected['link']),
             'actions' => $oMenuActions ? $oMenuActions->getCode() : '',
             'bx_if:image' => array (
-                'condition' => false !== strpos($aMenuItemSelected['icon'], '.'),
+                'condition' => $bImage,
                 'content' => array('icon_url' => $aMenuItemSelected['icon']),
             ),
             'bx_if:icon' => array (
-                'condition' => false === strpos($aMenuItemSelected['icon'], '.'),
+                'condition' => !$bImage && !empty($aMenuItemSelected['icon']),
                 'content' => array('icon' => $aMenuItemSelected['icon']),
             ),
         );