Răsfoiți Sursa

#3530 Use inline SVG and Emoji in Icons

RomanL 5 ani în urmă
părinte
comite
dd772503d6

+ 4 - 35
inc/classes/BxDolTemplate.php

@@ -1736,41 +1736,10 @@ class BxDolTemplate extends BxDolFactory implements iBxDolSingleton
      */
     function parseIcon($sName, $aAttrs = array())
     {
-		$sClass = '';
-        if(!empty($aAttrs['class'])) {
-            $sClass = ' ' . $aAttrs['class'] .' ';
-            unset($aAttrs['class']);
-        }
-
-        $sAttrs = '';
-        foreach($aAttrs as $sKey => $sValue)
-            $sAttrs .= ' ' . $sKey . '="' . bx_html_attribute($sValue) . '"';
-		
-		
-		if (strpos($sName, '<svg') !== false){
-			$sSvg = htmlspecialchars_decode($sName);
-			$sClass .= 'sys-icon sys-icon-svg ';
-			if (strpos($sSvg, 'class="') !== false)
-				$sSvg = str_replace('class="', 'class="' . $sClass, $sSvg);
-			else
-				$sSvg = str_replace('<svg', '<svg class="' . $sClass . '" ', $sSvg);
-
-			if ($sAttrs != '')
-				$sSvg = str_replace('<svg', '<svg ' . $sAttrs . ' ', $sSvg);
-			return htmlspecialchars_decode($sSvg);
-		}
-		// emoji
-		if(preg_match('/([0-9#][\x{20E3}])|[\x{00ae}\x{00a9}\x{203C}\x{2047}\x{2048}\x{2049}\x{3030}\x{303D}\x{2139}\x{2122}\x{3297}\x{3299}][\x{FE00}-\x{FEFF}]?|[\x{2190}-\x{21FF}][\x{FE00}-\x{FEFF}]?|[\x{2300}-\x{23FF}][\x{FE00}-\x{FEFF}]?|[\x{2460}-\x{24FF}][\x{FE00}-\x{FEFF}]?|[\x{25A0}-\x{25FF}][\x{FE00}-\x{FEFF}]?|[\x{2600}-\x{27BF}][\x{FE00}-\x{FEFF}]?|[\x{2900}-\x{297F}][\x{FE00}-\x{FEFF}]?|[\x{2B00}-\x{2BF0}][\x{FE00}-\x{FEFF}]?|[\x{1F000}-\x{1F6FF}][\x{FE00}-\x{FEFF}]?/u', $sName, $a)){
-			return '<i class="sys-icon sys-icon-emoji' . $sClass . '"' . $sAttrs . '>' . $sName . '</i>';
-		}
-		
-		// font
-		if(!empty($aAttrs['class'])) {
-			$sName .= ' ' . $aAttrs['class'];
-			unset($aAttrs['class']);
-		}
-		return '<i class="sys-icon ' . $sName .' ' . $sClass . '"' . $sAttrs . '></i>';
-
+		$aIcons = BxTemplFunctions::getInstance()->getIcon($sName, $aAttrs);
+        if ($aIcons[0] != '')
+            $aIcons[0] = '';
+		return implode($aIcons);
     }
 
     function getCacheFilePrefix($sType)

+ 1 - 1
modules/boonex/events/template/form_ghost_template_wrapper.html

@@ -1,6 +1,6 @@
 <div id="bx-events-interval-{interval_id}" class="bx-events-interval-ghost bx-def-margin-sec-top bx-def-padding-sec-top bx-def-border-top bx-clearfix">
     <div class="bx-events-interval-ghost-form">
-        __nested_form__
+        __nested_form__xxx
         <div class="bx-events-interval-form-actions bx-def-margin-top bx-clearfix"><a class="bx-btn bx-btn-small" href="javascript:void(0);" onclick="{js_instance_name}.deleteGhost(this, '{interval_id}')"><bx_text:_Delete /></a></div>
     </div>
 </div>

+ 6 - 0
studio/template/css/permissions.css

@@ -12,6 +12,12 @@ svg.bx-prm-level-icon{
     height: 32px;
 }
 
+div.bx-prm-item-icon-preview {}
+div.bx-prm-item-icon-preview img,
+div.bx-prm-item-icon-preview svg{
+	max-width:128px; 
+    max-height:128px;
+}
 /*--- Levels page -> Add Level block ---*/
 div.bx-prm-add-level {}
 div.bx-prm-add-level-cnt {}

+ 2 - 9
studio/template/nav_item_icon_preview.html

@@ -12,14 +12,7 @@
             </button>
         </p>
 	</bx_if:show_icon_image>
-	<bx_if:show_icon_font>
-		<i class="sys-icon __icon__"></i>
-	</bx_if:show_icon_font>
-	<bx_if:show_icon_svg>
+	<bx_if:show_icon_html>
 		__icon__
-	</bx_if:show_icon_svg>
-	<bx_if:show_icon_emoji>
-		<i class="sys-icon sys-icon-emoji">__icon__</i>
-	</bx_if:show_icon_emoji>
-	
+	</bx_if:show_icon_html>	
 </div>

+ 3 - 9
studio/template/prm_level_icon_preview.html

@@ -1,4 +1,4 @@
-<div id="bx-nav-item-icon-preview-__id__" class="bx-nav-item-icon-preview">
+<div id="bx-prm-item-icon-preview-__id__" class="bx-prm-item-icon-preview">
 	<bx_if:show_icon_empty>
 	    <span class="bx-def-font-small bx-def-color-ft-gray-l3">
 	        <bx_text:_adm_nav_dsc_items_icon_image_current />
@@ -12,13 +12,7 @@
             </button>
         </p>
 	</bx_if:show_icon_image>
-	<bx_if:show_icon_font>
-		<i class="sys-icon __icon__"></i>
-	</bx_if:show_icon_font>
-	<bx_if:show_icon_svg>
+	<bx_if:show_icon_html>
 		__icon__
-	</bx_if:show_icon_svg>
-	<bx_if:show_icon_emoji>
-		<i class="sys-icon sys-icon-emoji">__icon__</i>
-	</bx_if:show_icon_emoji>
+	</bx_if:show_icon_html>
 </div>

+ 8 - 19
studio/template/scripts/BxBaseStudioNavigationItems.php

@@ -848,14 +848,15 @@ class BxBaseStudioNavigationItems extends BxDolStudioNavigationItems
     protected function _getIconPreview($iId, $sIconImage = '', $sIcon = '')
     {
         $bIconImage = !empty($sIconImage);
-		$bIconSvg = !empty($sIcon) && strpos($sIcon, '<svg') !== false;
-		$bIconEmoji = !empty($sIcon) && preg_match('/([0-9#][\x{20E3}])|[\x{00ae}\x{00a9}\x{203C}\x{2047}\x{2048}\x{2049}\x{3030}\x{303D}\x{2139}\x{2122}\x{3297}\x{3299}][\x{FE00}-\x{FEFF}]?|[\x{2190}-\x{21FF}][\x{FE00}-\x{FEFF}]?|[\x{2300}-\x{23FF}][\x{FE00}-\x{FEFF}]?|[\x{2460}-\x{24FF}][\x{FE00}-\x{FEFF}]?|[\x{25A0}-\x{25FF}][\x{FE00}-\x{FEFF}]?|[\x{2600}-\x{27BF}][\x{FE00}-\x{FEFF}]?|[\x{2900}-\x{297F}][\x{FE00}-\x{FEFF}]?|[\x{2B00}-\x{2BF0}][\x{FE00}-\x{FEFF}]?|[\x{1F000}-\x{1F6FF}][\x{FE00}-\x{FEFF}]?/u', $sIcon, $a);
-        $bIconFont = !empty($sIcon) && !$bIconSvg && !$bIconEmoji;
+		
+        $aIcons = BxTemplFunctions::getInstanceWithTemplate($this->_oTemplate)->getIcon($sIcon);
+        $sIconHtml = $aIcons[2] . $aIcons[3] . $aIcons[4];
+		$bIconHtml = !empty($sIconHtml) && !$bIconImage;
 		
         return $this->_oTemplate->parseHtmlByName('nav_item_icon_preview.html', array(
             'id' => $iId,
             'bx_if:show_icon_empty' => array(
-                'condition' => !$bIconImage && !$bIconFont && !$bIconSvg && !$bIconEmoji,
+                'condition' => !$bIconImage && !$bIconHtml,
                 'content' => array()
             ),
             'bx_if:show_icon_image' => array(
@@ -866,22 +867,10 @@ class BxBaseStudioNavigationItems extends BxDolStudioNavigationItems
                     'id' => $iId
                 )
             ),
-            'bx_if:show_icon_font' => array(
-                'condition' => $bIconFont,
-                'content' => array(
-                    'icon' => $sIcon
-                )
-            ),
-			'bx_if:show_icon_svg' => array(
-                'condition' => $bIconSvg,
-                'content' => array(
-                    'icon' => $sIcon
-                )
-            ),
-			'bx_if:show_icon_emoji' => array(
-                'condition' => $bIconEmoji,
+            'bx_if:show_icon_html' => array(
+                'condition' => $bIconHtml,
                 'content' => array(
-                    'icon' => $sIcon
+                    'icon' => $sIconHtml
                 )
             )
         ));

+ 12 - 21
studio/template/scripts/BxBaseStudioPermissionsLevels.php

@@ -322,14 +322,15 @@ class BxBaseStudioPermissionsLevels extends BxDolStudioPermissionsLevels
     protected function _getIconPreview($iId, $sIconImage = '', $sIcon = '')
     {
         $bIconImage = !empty($sIconImage);
-		$bIconSvg = !empty($sIcon) && strpos($sIcon, '<svg') !== false;
-		$bIconEmoji = !empty($sIcon) && preg_match('/([0-9#][\x{20E3}])|[\x{00ae}\x{00a9}\x{203C}\x{2047}\x{2048}\x{2049}\x{3030}\x{303D}\x{2139}\x{2122}\x{3297}\x{3299}][\x{FE00}-\x{FEFF}]?|[\x{2190}-\x{21FF}][\x{FE00}-\x{FEFF}]?|[\x{2300}-\x{23FF}][\x{FE00}-\x{FEFF}]?|[\x{2460}-\x{24FF}][\x{FE00}-\x{FEFF}]?|[\x{25A0}-\x{25FF}][\x{FE00}-\x{FEFF}]?|[\x{2600}-\x{27BF}][\x{FE00}-\x{FEFF}]?|[\x{2900}-\x{297F}][\x{FE00}-\x{FEFF}]?|[\x{2B00}-\x{2BF0}][\x{FE00}-\x{FEFF}]?|[\x{1F000}-\x{1F6FF}][\x{FE00}-\x{FEFF}]?/u', $sIcon, $a);
-        $bIconFont = !empty($sIcon) && !$bIconSvg && !$bIconEmoji;
 		
-        return $this->_oTemplate->parseHtmlByName('nav_item_icon_preview.html', array(
+        $aIcons = BxTemplFunctions::getInstanceWithTemplate($this->_oTemplate)->getIcon($sIcon);
+        $sIconHtml = $aIcons[2] . $aIcons[3] . $aIcons[4];
+		$bIconHtml = !empty($sIconHtml) && !$bIconImage;
+            
+        return $this->_oTemplate->parseHtmlByName('prm_level_icon_preview.html', array(
             'id' => $iId,
             'bx_if:show_icon_empty' => array(
-                'condition' => !$bIconImage && !$bIconFont && !$bIconSvg && !$bIconEmoji,
+                'condition' => !$bIconImage && !$bIconHtml,
                 'content' => array()
             ),
             'bx_if:show_icon_image' => array(
@@ -340,22 +341,10 @@ class BxBaseStudioPermissionsLevels extends BxDolStudioPermissionsLevels
                     'id' => $iId
                 )
             ),
-            'bx_if:show_icon_font' => array(
-                'condition' => $bIconFont,
+            'bx_if:show_icon_html' => array(
+                'condition' => $bIconHtml,
                 'content' => array(
-                    'icon' => $sIcon
-                )
-            ),
-			'bx_if:show_icon_svg' => array(
-                'condition' => $bIconSvg,
-                'content' => array(
-                    'icon' => $sIcon
-                )
-            ),
-			'bx_if:show_icon_emoji' => array(
-                'condition' => $bIconEmoji,
-                'content' => array(
-                    'icon' => $sIcon
+                    'icon' => $sIconHtml
                 )
             )
         ));
@@ -490,12 +479,13 @@ class BxBaseStudioPermissionsLevels extends BxDolStudioPermissionsLevels
                     ),
                 ),
                 'Icon' => array(
-                    'type' => 'text',
+                    'type' => 'textarea',
                     'name' => 'Icon',
                     'caption' => _t('_adm_prm_txt_level_icon'),
                     'info' => _t('_adm_prm_dsc_level_icon'),
                     'value' => '',
                     'required' => '0',
+					'code' => 1,
                     'db' => array (
                         'pass' => 'Xss',
                     ),
@@ -504,6 +494,7 @@ class BxBaseStudioPermissionsLevels extends BxDolStudioPermissionsLevels
                         'params' => array(),
                         'error' => _t('_adm_prm_err_level_icon'),
                     ),
+					'attrs' => array('class' => 'bx-form-input-textarea-small'),
                 ),
                 'Icon_image' => array(
                     'type' => 'file',

+ 1 - 1
template/icon_emoji.html

@@ -1 +1 @@
-<i class="sys-icon sys-icon-emoji">__icon__</i>
+<i class="sys-icon sys-icon-emoji __class__" __attrs__>__icon__</i>

+ 69 - 6
template/scripts/BxBaseFunctions.php

@@ -19,9 +19,6 @@ class BxBaseFunctions extends BxDolFactory implements iBxDolSingleton
 
     protected function __construct($oTemplate)
     {
-        if (isset($GLOBALS['bxDolClasses'][get_class($this)]))
-            trigger_error ('Multiple instances are not allowed for the class: ' . get_class($this), E_USER_ERROR);
-
         parent::__construct();
 
         $this->_oTemplate = $oTemplate ? $oTemplate : BxDolTemplate::getInstance();
@@ -46,10 +43,14 @@ class BxBaseFunctions extends BxDolFactory implements iBxDolSingleton
 
     public static function getInstanceWithTemplate($oTemplate)
     {
-        if(!isset($GLOBALS['bxDolClasses']['BxTemplFunctions']))
-            $GLOBALS['bxDolClasses']['BxTemplFunctions'] = new BxTemplFunctions($oTemplate);
+        $sClassName = 'BxTemplFunctions';
+        if ($oTemplate){
+            $sClassName .= get_class($oTemplate);
+        }
+        if(!isset($GLOBALS['bxDolClasses'][$sClassName]))
+            $GLOBALS['bxDolClasses'][$sClassName] = new BxTemplFunctions($oTemplate);
 
-        return $GLOBALS['bxDolClasses']['BxTemplFunctions'];
+        return $GLOBALS['bxDolClasses'][$sClassName];
     }
     
     public static function getInstance()
@@ -159,6 +160,68 @@ class BxBaseFunctions extends BxDolFactory implements iBxDolSingleton
             'content' => $sContent
         ));
     }
+    
+    function getIcon($sCode, $aAttrs = array())
+    {
+        $sIconFont = false;
+        $sIconA = false;
+        $sIconUrl = false;
+		$sIconHtml = false;
+        $sIconFontWithHtml = false;
+        
+        $sClass = '';
+        if(!empty($aAttrs['class'])) {
+            $sClass = ' ' . $aAttrs['class'] .' ';
+            unset($aAttrs['class']);
+        }
+
+        $sAttrs = '';
+        foreach($aAttrs as $sKey => $sValue)
+            $sAttrs .= ' ' . $sKey . '="' . bx_html_attribute($sValue) . '"';
+		
+        if (!empty($sCode)) {
+            if ((int)$sCode > 0 ) {
+                $oStorage = BxDolStorage::getObjectInstance(BX_DOL_STORAGE_OBJ_IMAGES);
+                $sIconUrl = $oStorage ? $oStorage->getFileUrlById((int)$sCode) : false;
+            } else {
+				//svg
+                if (strpos($sCode, '&lt;svg') !== false || strpos($sCode, '<svg') !== false){
+                    if (strpos($sCode, '&lt;svg') !== false)
+                        $sIconHtml = htmlspecialchars_decode($sCode);
+                    else
+                        $sIconHtml = $sCode;    
+					$sClass .= 'sys-icon sys-icon-svg ';
+					if ($sClass != '' && strpos($sIconHtml, 'class="') !== false)
+						$sIconHtml = str_replace('class="', 'class="' . $sClass, $sIconHtml);
+					else
+						$sIconHtml = str_replace('<svg', '<svg class="' . $sClass . '" ', $sIconHtml);
+                    
+                    if ($sAttrs != '')
+				        $sIconHtml = str_replace('<svg', '<svg ' . $sAttrs . ' ', $sIconHtml);
+				}
+				else{
+					//emoji
+					if(preg_match('/([0-9#][\x{20E3}])|[\x{00ae}\x{00a9}\x{203C}\x{2047}\x{2048}\x{2049}\x{3030}\x{303D}\x{2139}\x{2122}\x{3297}\x{3299}][\x{FE00}-\x{FEFF}]?|[\x{2190}-\x{21FF}][\x{FE00}-\x{FEFF}]?|[\x{2300}-\x{23FF}][\x{FE00}-\x{FEFF}]?|[\x{2460}-\x{24FF}][\x{FE00}-\x{FEFF}]?|[\x{25A0}-\x{25FF}][\x{FE00}-\x{FEFF}]?|[\x{2600}-\x{27BF}][\x{FE00}-\x{FEFF}]?|[\x{2900}-\x{297F}][\x{FE00}-\x{FEFF}]?|[\x{2B00}-\x{2BF0}][\x{FE00}-\x{FEFF}]?|[\x{1F000}-\x{1F6FF}][\x{FE00}-\x{FEFF}]?/u', $sCode, $aTmp)){
+						$sIconHtml = $this->_oTemplate->parseHtmlByName('icon_emoji.html', array('icon' => $sCode, 'class' => $sClass, 'attrs' => $sAttrs));
+					}
+						else{
+						if (false === strpos($sCode, '.')) { 
+							if (0 === strncmp($sCode, 'a:', 2)){
+								$sIconA = substr($sCode, 2); // animated icon
+                            }
+							else{
+								$sIconFont = $sCode; // font icons
+                                $sIconFontWithHtml = '<i class="sys-icon ' . $sIconFont .' ' . $sClass . '"' . $sAttrs . '></i>';
+                            }
+						} else {
+							$sIconUrl = $this->_oTemplate->getIconUrl($sCode);
+						}
+					}
+				}
+            }
+        }
+        return array ($sIconFont, $sIconUrl, $sIconA, $sIconHtml, $sIconFontWithHtml);
+    }
 
     function getTemplateIcon($sName)
     {

+ 1 - 38
template/scripts/BxBaseMenu.php

@@ -264,44 +264,7 @@ class BxBaseMenu extends BxDolMenu
 
     protected function _getMenuIcon ($a)
     {
-        $sIcon = false;
-        $sIconA = false;
-        $sIconUrl = false;
-		$sIconHtml = false;
-		
-        if (!empty($a['icon'])) {
-            if ((int)$a['icon'] > 0 ) {
-                $oStorage = BxDolStorage::getObjectInstance(BX_DOL_STORAGE_OBJ_IMAGES);
-                $sIconUrl = $oStorage ? $oStorage->getFileUrlById((int)$a['icon']) : false;
-            } else {
-				//svg
-				if (strpos($a['icon'], '<svg') !== false){
-					$sIconHtml = $a['icon'];
-					$sClass = 'sys-icon sys-icon-svg-inline ';
-					if ($sClass != '' && strpos($sIconHtml, 'class="') !== false)
-						$sIconHtml = str_replace('class="', 'class="' . $sClass, $sIconHtml);
-					else
-						$sIconHtml = str_replace('<svg', '<svg class="' . $sClass . '" ', $sIconHtml);
-				}
-				else{
-					//emoji
-					if(preg_match('/([0-9#][\x{20E3}])|[\x{00ae}\x{00a9}\x{203C}\x{2047}\x{2048}\x{2049}\x{3030}\x{303D}\x{2139}\x{2122}\x{3297}\x{3299}][\x{FE00}-\x{FEFF}]?|[\x{2190}-\x{21FF}][\x{FE00}-\x{FEFF}]?|[\x{2300}-\x{23FF}][\x{FE00}-\x{FEFF}]?|[\x{2460}-\x{24FF}][\x{FE00}-\x{FEFF}]?|[\x{25A0}-\x{25FF}][\x{FE00}-\x{FEFF}]?|[\x{2600}-\x{27BF}][\x{FE00}-\x{FEFF}]?|[\x{2900}-\x{297F}][\x{FE00}-\x{FEFF}]?|[\x{2B00}-\x{2BF0}][\x{FE00}-\x{FEFF}]?|[\x{1F000}-\x{1F6FF}][\x{FE00}-\x{FEFF}]?/u', $a['icon'], $aTmp)){
-						$sIconHtml = $this->_oTemplate->parseHtmlByName('icon_emoji.html', array('icon' => $a['icon']));
-					}
-						else{
-						if (false === strpos($a['icon'], '.')) { 
-							if (0 === strncmp($a['icon'], 'a:', 2))
-								$sIconA = substr($a['icon'], 2); // animated icon
-							else
-								$sIcon = $a['icon']; // font icons
-						} else {
-							$sIconUrl = $this->_oTemplate->getIconUrl($a['icon']);
-						}
-					}
-				}
-            }
-        }
-        return array ($sIcon, $sIconUrl, $sIconA, $sIconHtml);
+        return BxTemplFunctions::getInstanceWithTemplate($this->_oTemplate)->getIcon(!empty($a['icon']) ? $a['icon'] : '');
     }
 
     protected function _getMenuAddon ($aMenuItem)

+ 1 - 37
template/scripts/BxBaseServiceProfiles.php

@@ -489,43 +489,7 @@ class BxBaseServiceProfiles extends BxDol
 
 	protected function _getIcon ($sIcon)
     {
-        $sIconFont = false;
-        $sIconA = false;
-        $sIconUrl = false;
-		$sIconHtml = false;
-        if ($sIcon != '') {
-            if ((int)$sIcon > 0 ) {
-                $oStorage = BxDolStorage::getObjectInstance(BX_DOL_STORAGE_OBJ_IMAGES);
-                $sIconUrl = $oStorage ? $oStorage->getFileUrlById((int)$sIcon) : false;
-            } else {
-				//svg
-				if (strpos($sIcon, '<svg') !== false){
-					$sIconHtml = $sIcon;
-					$sClass = 'sys-icon sys-icon-svg-inline ';
-					if ($sClass != '' && strpos($sIconHtml, 'class="') !== false)
-						$sIconHtml = str_replace('class="', 'class="' . $sClass, $sIconHtml);
-					else
-						$sIconHtml = str_replace('<svg', '<svg class="' . $sClass . '" ', $sIconHtml);
-				}
-				else{
-					//emoji
-					if(preg_match('/([0-9#][\x{20E3}])|[\x{00ae}\x{00a9}\x{203C}\x{2047}\x{2048}\x{2049}\x{3030}\x{303D}\x{2139}\x{2122}\x{3297}\x{3299}][\x{FE00}-\x{FEFF}]?|[\x{2190}-\x{21FF}][\x{FE00}-\x{FEFF}]?|[\x{2300}-\x{23FF}][\x{FE00}-\x{FEFF}]?|[\x{2460}-\x{24FF}][\x{FE00}-\x{FEFF}]?|[\x{25A0}-\x{25FF}][\x{FE00}-\x{FEFF}]?|[\x{2600}-\x{27BF}][\x{FE00}-\x{FEFF}]?|[\x{2900}-\x{297F}][\x{FE00}-\x{FEFF}]?|[\x{2B00}-\x{2BF0}][\x{FE00}-\x{FEFF}]?|[\x{1F000}-\x{1F6FF}][\x{FE00}-\x{FEFF}]?/u', $sIcon, $aTmp)){
-						$sIconHtml = $this->_oTemplate->parseHtmlByName('icon_emoji.html', array('icon' => $sIcon));
-					}
-						else{
-						if (false === strpos($sIcon, '.')) { 
-							if (0 === strncmp($sIcon, 'a:', 2))
-								$sIconA = substr($sIcon, 2); // animated icon
-							else
-								$sIconFont = $sIcon; // font icons
-						} else {
-							$sIconUrl = $this->_oTemplate->getIconUrl($sIcon);
-						}
-					}
-				}
-            }
-        }
-        return array ($sIconFont, $sIconUrl, $sIconA, $sIconHtml);
+        return BxTemplFunctions::getInstance()->getIcon($sIcon);
     }
 	
     protected function _getLatestModuleTimestamp ()