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

Ticket #3923 - Market: Improve Icon and Header Image usage.

AntonLV 4 лет назад
Родитель
Сommit
72e234192e

+ 4 - 0
modules/base/general/classes/BxBaseModGeneralModule.php

@@ -2941,6 +2941,10 @@ class BxBaseModGeneralModule extends BxDolModule
             return false;
 
         $iId = (int)$aContentInfo[$CNF[$sField]];
+        $aFile = BxDolStorage::getObjectInstance($CNF['OBJECT_STORAGE'])->getFile($iId);
+        if(strpos($aFile['mime_type'], 'svg') !== false)
+            return array('id' => $iId, 'object' => $CNF['OBJECT_STORAGE']);
+
         foreach($aTranscoders as $sTranscoder)
             if(!empty($CNF[$sTranscoder]))
                 return array('id' => $iId, 'transcoder' => $CNF[$sTranscoder]);

+ 6 - 1
modules/boonex/artificer/data/template/bx_market/unit_gallery.html

@@ -1,5 +1,5 @@
 <div class="__class__  bx-base-text-unit bx-base-text-unit-gallery bx-def-gal-unit-size p-2">
-    <div class="bx-market-unit-gallery-cnt bx-def-box bx-def-box-round-corners bx-def-color-bg-box">
+    <div class="bx-market-unit-gallery-cnt bx-def-box bx-def-box-round-corners bx-def-color-bg-box w-full">
         <!-- Author section -->
         <bx_if:show_section_author>
             <div class="bx-market-unit-cnt p-4">
@@ -15,6 +15,11 @@
 
         <!-- Main section -->
         <div class="bx-market-unit-cnt bx-market-unit-cover">
+            <bx_if:show_cover_raw>
+                <a href="__content_url__" title="__summary_attr__">
+                    <div class="bx-base-text-unit-thumb bx-base-text-unit-thumb-raw">__cover_raw__</div>
+                </a>
+            </bx_if:show_cover_raw>
             <bx_if:show_cover>
                 <a href="__content_url__" title="__summary_attr__">
                     <div class="bx-base-text-unit-thumb bx-def-gal-div-size bx-def-font-middle bg-cover bg-center bg-no-repeat" style="background-image:url(__cover_url__)">

+ 1 - 0
modules/boonex/market/classes/BxMarketConfig.php

@@ -69,6 +69,7 @@ class BxMarketConfig extends BxBaseModTextConfig
             'FIELD_SUBENTRIES' => 'subentries',
             'FIELD_PHOTO' => 'pictures',
             'FIELD_THUMB' => 'thumb',
+            'FIELD_COVER_RAW' => 'cover_raw',
             'FIELD_COVER' => 'cover',
             'FIELD_FILE' => 'files',
             'FIELD_PACKAGE' => 'package',

+ 45 - 38
modules/boonex/market/classes/BxMarketFormEntry.php

@@ -24,20 +24,23 @@ class BxMarketFormEntry extends BxBaseModTextFormEntry
         $iProfileId = bx_get_logged_profile_id();
 
         if(isset($this->aInputs[$CNF['FIELD_TITLE']], $this->aInputs[$CNF['FIELD_NAME']])) {
-        	$sJsObject = $this->_oModule->_oConfig->getJsObject('form');
+            $sJsObject = $this->_oModule->_oConfig->getJsObject('form');
 
-        	$aMask = array('mask' => "javascript:%s.checkName('%s', '%s');", $sJsObject, $CNF['FIELD_TITLE'], $CNF['FIELD_NAME']);
+            $aMask = array('mask' => "javascript:%s.checkName('%s', '%s');", $sJsObject, $CNF['FIELD_TITLE'], $CNF['FIELD_NAME']);
             if($this->aParams['display'] == $CNF['OBJECT_FORM_ENTRY_DISPLAY_EDIT'] && bx_get('id') !== false) {
                 $aMask['mask'] = "javascript:%s.checkName('%s', '%s', %d);";
                 $aMask[] = (int)bx_get('id');
             }
 
             $sOnBlur = call_user_func_array('sprintf', array_values($aMask)); 
-        	$this->aInputs[$CNF['FIELD_TITLE']]['attrs']['onblur'] = $sOnBlur;
-        	$this->aInputs[$CNF['FIELD_NAME']]['attrs']['onblur'] = $sOnBlur;
+            $this->aInputs[$CNF['FIELD_TITLE']]['attrs']['onblur'] = $sOnBlur;
+            $this->aInputs[$CNF['FIELD_NAME']]['attrs']['onblur'] = $sOnBlur;
         }
 
-	    if(isset($this->aInputs[$CNF['FIELD_FILE']])) {
+        if(isset($this->aInputs[$CNF['FIELD_COVER_RAW']]))
+            $this->aInputs[$CNF['FIELD_COVER_RAW']]['code'] = 1;
+
+        if(isset($this->aInputs[$CNF['FIELD_FILE']])) {
             $this->aInputs[$CNF['FIELD_FILE']]['storage_object'] = $CNF['OBJECT_STORAGE_FILES'];
             $this->aInputs[$CNF['FIELD_FILE']]['uploaders'] =  !empty($this->aInputs[$CNF['FIELD_FILE']]['value']) ? unserialize($this->aInputs[$CNF['FIELD_FILE']]['value']) : $CNF['OBJECT_UPLOADERS'];
             $this->aInputs[$CNF['FIELD_FILE']]['images_transcoder'] = '';
@@ -49,61 +52,65 @@ class BxMarketFormEntry extends BxBaseModTextFormEntry
 
         $bRecurring = $this->_oModule->_oDb->getParam($CNF['OPTION_ENABLE_RECURRING']) == 'on';
         if(!$bRecurring) {
-        	$this->aInputs[$CNF['FIELD_DURATION_RECURRING']]['type'] = 'hidden';
-			$this->aInputs[$CNF['FIELD_PRICE_RECURRING']]['type'] = 'hidden';
-			$this->aInputs[$CNF['FIELD_PRICE_RECURRING']]['value'] = 0;
+            $this->aInputs[$CNF['FIELD_DURATION_RECURRING']]['type'] = 'hidden';
+            $this->aInputs[$CNF['FIELD_PRICE_RECURRING']]['type'] = 'hidden';
+            $this->aInputs[$CNF['FIELD_PRICE_RECURRING']]['value'] = 0;
 
-			unset($this->aInputs[$CNF['FIELD_HEADER_BEG_RECURRING']]);
-			unset($this->aInputs[$CNF['FIELD_HEADER_END_RECURRING']]);
+            unset($this->aInputs[$CNF['FIELD_HEADER_BEG_RECURRING']]);
+            unset($this->aInputs[$CNF['FIELD_HEADER_END_RECURRING']]);
         }
 
         $oPayment = BxDolPayments::getInstance();
         if(isset($this->aInputs[$CNF['FIELD_WARNING_SINGLE']])) {
-	        if(!$oPayment->isAcceptingPayments($iProfileId, BX_PAYMENT_TYPE_SINGLE)) 
-	        	$this->aInputs[$CNF['FIELD_WARNING_SINGLE']]['value'] = MsgBox(_t($this->aInputs[$CNF['FIELD_WARNING_SINGLE']]['value'], $oPayment->getDetailsUrl()));
-	        else 
-	        	unset($this->aInputs[$CNF['FIELD_WARNING_SINGLE']]);
+            if(!$oPayment->isAcceptingPayments($iProfileId, BX_PAYMENT_TYPE_SINGLE)) 
+                $this->aInputs[$CNF['FIELD_WARNING_SINGLE']]['value'] = MsgBox(_t($this->aInputs[$CNF['FIELD_WARNING_SINGLE']]['value'], $oPayment->getDetailsUrl()));
+            else 
+                unset($this->aInputs[$CNF['FIELD_WARNING_SINGLE']]);
         }
 
         if(isset($this->aInputs[$CNF['FIELD_WARNING_RECURRING']])) {
-	        if($bRecurring && !$oPayment->isAcceptingPayments($iProfileId, BX_PAYMENT_TYPE_RECURRING))
-	        	$this->aInputs[$CNF['FIELD_WARNING_RECURRING']]['value'] = MsgBox(_t($this->aInputs[$CNF['FIELD_WARNING_RECURRING']]['value'], $oPayment->getDetailsUrl()));
-	        else 
-	        	unset($this->aInputs[$CNF['FIELD_WARNING_RECURRING']]);
+            if($bRecurring && !$oPayment->isAcceptingPayments($iProfileId, BX_PAYMENT_TYPE_RECURRING))
+                $this->aInputs[$CNF['FIELD_WARNING_RECURRING']]['value'] = MsgBox(_t($this->aInputs[$CNF['FIELD_WARNING_RECURRING']]['value'], $oPayment->getDetailsUrl()));
+            else 
+                unset($this->aInputs[$CNF['FIELD_WARNING_RECURRING']]);
         }
 
-		if(isset($this->aInputs[$CNF['FIELD_ALLOW_PURCHASE_TO']]))
-			$this->aInputs[$CNF['FIELD_ALLOW_PURCHASE_TO']] = BxDolPrivacy::getGroupChooser($CNF['OBJECT_PRIVACY_PURCHASE']);
+        if(isset($this->aInputs[$CNF['FIELD_ALLOW_PURCHASE_TO']]))
+            $this->aInputs[$CNF['FIELD_ALLOW_PURCHASE_TO']] = BxDolPrivacy::getGroupChooser($CNF['OBJECT_PRIVACY_PURCHASE']);
 
-		$aDynamicGroups = array(
-			array ('key' => '', 'value' => '----'),
-			array ('key' => 'c', 'value' => _t('_bx_market_privacy_group_customers'))
-		);
+        $aDynamicGroups = array(
+            array ('key' => '', 'value' => '----'),
+            array ('key' => 'c', 'value' => _t('_bx_market_privacy_group_customers'))
+        );
 
-		if(isset($this->aInputs[$CNF['FIELD_ALLOW_COMMENT_TO']])) {
-			$this->aInputs[$CNF['FIELD_ALLOW_COMMENT_TO']] = BxDolPrivacy::getGroupChooser($CNF['OBJECT_PRIVACY_COMMENT'], $iProfileId, array('dynamic_groups' => $aDynamicGroups));
-			$this->aInputs[$CNF['FIELD_ALLOW_COMMENT_TO']]['db']['pass'] = 'Xss';
-		}
+        if(isset($this->aInputs[$CNF['FIELD_ALLOW_COMMENT_TO']])) {
+            $this->aInputs[$CNF['FIELD_ALLOW_COMMENT_TO']] = BxDolPrivacy::getGroupChooser($CNF['OBJECT_PRIVACY_COMMENT'], $iProfileId, array('dynamic_groups' => $aDynamicGroups));
+            $this->aInputs[$CNF['FIELD_ALLOW_COMMENT_TO']]['db']['pass'] = 'Xss';
+        }
 
-		if(isset($this->aInputs[$CNF['FIELD_ALLOW_VOTE_TO']])) {
-			$this->aInputs[$CNF['FIELD_ALLOW_VOTE_TO']] = BxDolPrivacy::getGroupChooser($CNF['OBJECT_PRIVACY_VOTE'], $iProfileId, array('dynamic_groups' => $aDynamicGroups));
-			$this->aInputs[$CNF['FIELD_ALLOW_VOTE_TO']]['db']['pass'] = 'Xss';
-		}
+        if(isset($this->aInputs[$CNF['FIELD_ALLOW_VOTE_TO']])) {
+            $this->aInputs[$CNF['FIELD_ALLOW_VOTE_TO']] = BxDolPrivacy::getGroupChooser($CNF['OBJECT_PRIVACY_VOTE'], $iProfileId, array('dynamic_groups' => $aDynamicGroups));
+            $this->aInputs[$CNF['FIELD_ALLOW_VOTE_TO']]['db']['pass'] = 'Xss';
+        }
 
-		if(isset($this->aInputs[$CNF['FIELD_SUBENTRIES']]) && $this->_oModule->checkAllowedSetSubentries() !== CHECK_ACTION_RESULT_ALLOWED)
-		    unset($this->aInputs[$CNF['FIELD_SUBENTRIES']]);
+        if(isset($this->aInputs[$CNF['FIELD_SUBENTRIES']]) && $this->_oModule->checkAllowedSetSubentries() !== CHECK_ACTION_RESULT_ALLOWED)
+            unset($this->aInputs[$CNF['FIELD_SUBENTRIES']]);
     }
 
     function getCode($bDynamicMode = false)
     {
-    	$sJs = $this->_oModule->_oTemplate->addJs(array('form.js'), $bDynamicMode);
+        $sCss = $this->_oModule->_oTemplate->addCss([BX_DIRECTORY_PATH_PLUGINS_PUBLIC . 'codemirror/|codemirror.css'], $bDynamicMode);
+    	$sJs = $this->_oModule->_oTemplate->addJs([
+            'codemirror/codemirror.min.js',
+            'form.js'
+        ], $bDynamicMode);
 
         $sCode = '';
         if($bDynamicMode)
-        	$sCode .= $sJs;
+            $sCode .= $sCss . $sJs;
 
-		$sCode .= $this->_oModule->_oTemplate->getJsCode('form');
-		$sCode .= $this->_oModule->_oTemplate->parseHtmlByName('form.html', array(
+        $sCode .= $this->_oModule->_oTemplate->getJsCode('form');
+        $sCode .= $this->_oModule->_oTemplate->parseHtmlByName('form.html', array(
             'content' => parent::getCode($bDynamicMode)
         ));
 

+ 25 - 12
modules/boonex/market/classes/BxMarketModule.php

@@ -700,26 +700,39 @@ class BxMarketModule extends BxBaseModTextModule
     	$CNF = &$this->_oConfig->CNF;
 
         if(!$iItemId)
-			return array();
+            return [];
 
     	$aData = $this->_oDb->getContentInfoById($iItemId);
-    	
+
     	$aPhotos = $this->_oDb->getPhoto(array('type' => 'content_id', 'content_id' => $aData[$CNF['FIELD_ID']], 'except' => array($aData[$CNF['FIELD_THUMB']], $aData[$CNF['FIELD_COVER']])));
     	if(empty($aPhotos) || !is_array($aPhotos))
-    		return array();
+            return [];
+
+        $oStorage = BxDolStorage::getObjectInstance($CNF['OBJECT_STORAGE']);
+        if(!$oStorage)
+            return [];
 
-		$oStorage = BxDolStorage::getObjectInstance($CNF['OBJECT_STORAGE']);
     	$oImagesTranscoder = BxDolTranscoderImage::getObjectInstance($CNF['OBJECT_IMAGES_TRANSCODER_SCREENSHOT']);
 
-    	$aResult = array();
-    	foreach($aPhotos as $aPhoto) 
-    		$aResult[] = array(
-    			'id' => $aPhoto['file_id'],
-    			'url_sm' => $oImagesTranscoder ? $oImagesTranscoder->getFileUrl($aPhoto['file_id']) : '',
-    			'url_bg' => $oStorage ? $oStorage->getFileUrlById($aPhoto['file_id']) : ''
-    		);
+    	$aResult = [];
+    	foreach($aPhotos as $aPhoto) {
+            $sUrlSm = '';
+            $sUrlBg = $oStorage->getFileUrlById($aPhoto['file_id']);
+
+            $aPhotoInfo = $oStorage->getFile($aPhoto['file_id']);
+            if(strpos($aPhotoInfo['mime_type'], 'svg') !== false)
+                $sUrlSm = $sUrlBg;
+            else
+                $sUrlSm = $oImagesTranscoder ? $oImagesTranscoder->getFileUrl($aPhoto['file_id']) : '';
+
+            $aResult[] = [
+                'id' => $aPhoto['file_id'],
+                'url_sm' => $sUrlSm,
+                'url_bg' => $sUrlBg
+            ];
+        }
 
-		return $aResult;
+        return $aResult;
     }
 
 	/**

+ 1 - 1
modules/boonex/market/classes/BxMarketSearchResult.php

@@ -21,7 +21,7 @@ class BxMarketSearchResult extends BxBaseModTextSearchResult
             'object_metatags' => 'bx_market',
             'title' => _t('_bx_market_page_title_browse'),
             'table' => 'bx_market_products',
-            'ownFields' => array('id', 'title', 'text', 'price_single', 'price_recurring', 'duration_recurring', 'thumb', 'cover', 'author', 'added'),
+            'ownFields' => array('id', 'title', 'text', 'price_single', 'price_recurring', 'duration_recurring', 'thumb', 'cover', 'cover_raw', 'author', 'added'),
             'searchFields' => array(),
             'restriction' => array(
                 'author' => array('value' => '', 'field' => 'author', 'operator' => '='),

+ 46 - 12
modules/boonex/market/classes/BxMarketTemplate.php

@@ -52,6 +52,19 @@ class BxMarketTemplate extends BxBaseModTextTemplate
 
         $aVars = parent::getTmplVarsText($aData);
 
+        //--- Process Cover
+        $bCoverRaw = !empty($CNF['FIELD_COVER_RAW']) && !empty($aData[$CNF['FIELD_COVER_RAW']]);
+
+        $aVars['bx_if:show_image_raw'] = [
+            'condition' => $bCoverRaw,
+            'content' => [
+                'image_raw' => $aData[$CNF['FIELD_COVER_RAW']]
+            ]
+        ];
+
+        $aVars['bx_if:show_image']['condition'] = !$bCoverRaw && $aVars['bx_if:show_image']['condition'];
+
+        //--- Process Thumb
         $sIcon = '';
         $mixedIcon = $oModule->getEntryImageData($aData, 'FIELD_THUMB', array('OBJECT_IMAGES_TRANSCODER_THUMB', 'OBJECT_IMAGES_TRANSCODER_GALLERY'));
         if($mixedIcon !== false) {
@@ -71,6 +84,7 @@ class BxMarketTemplate extends BxBaseModTextTemplate
             )
         );
 
+        //--- Process Screenshots
         $sScreenshots = $this->getScreenshots($aData);
         $bScreenshots = !empty($sScreenshots);
         if($bScreenshots) {
@@ -94,11 +108,11 @@ class BxMarketTemplate extends BxBaseModTextTemplate
 
     	$CNF = &$oModule->_oConfig->CNF;
     	$aPhotos = $oModule->serviceGetScreenshots($aData[$CNF['FIELD_ID']]);
-		if(empty($aPhotos) || !is_array($aPhotos))
-    		return '';
+        if(empty($aPhotos) || !is_array($aPhotos))
+            return '';
 
-		return $this->parseHtmlByName('entry-screenshots.html', array(
-    		'bx_repeat:items' => $aPhotos
+        return $this->parseHtmlByName('entry-screenshots.html', array(
+            'bx_repeat:items' => $aPhotos
     	));
     }
     
@@ -197,23 +211,35 @@ class BxMarketTemplate extends BxBaseModTextTemplate
         //--- Icon Info
         $sIconUrl = '';
         if(!empty($CNF['FIELD_THUMB']) && $aData[$CNF['FIELD_THUMB']]) {
-            $oImagesTranscoder = BxDolTranscoderImage::getObjectInstance($CNF['OBJECT_IMAGES_TRANSCODER_ICON']);
-            if($oImagesTranscoder)
-                $sIconUrl = $oImagesTranscoder->getFileUrl($aData[$CNF['FIELD_THUMB']]);
+            $iThumb = (int)$aData[$CNF['FIELD_THUMB']];
+
+            $oStorage = BxDolStorage::getObjectInstance($CNF['OBJECT_STORAGE']);
+            $aThumb = $oStorage->getFile($iThumb);
+
+            if(strpos($aThumb['mime_type'], 'svg') !== false)
+                $sIconUrl = $oStorage->getFileUrlById($iThumb);
+
+            if(empty($sIconUrl)) {
+                $oImagesTranscoder = BxDolTranscoderImage::getObjectInstance($CNF['OBJECT_IMAGES_TRANSCODER_ICON']);
+                if($oImagesTranscoder)
+                    $sIconUrl = $oImagesTranscoder->getFileUrl($iThumb);
+            }
 
             if(empty($sIconUrl)) {
                 $oImagesTranscoder = BxDolTranscoderImage::getObjectInstance($CNF['OBJECT_IMAGES_TRANSCODER_THUMB']);
                 if($oImagesTranscoder)
-                    $sIconUrl = $oImagesTranscoder->getFileUrl($aData[$CNF['FIELD_THUMB']]);
+                    $sIconUrl = $oImagesTranscoder->getFileUrl($iThumb);
             }
         }
 
         //--- Cover Info
+        $bCoverRaw = !empty($CNF['FIELD_COVER_RAW']) && !empty($aData[$CNF['FIELD_COVER_RAW']]);
+
         $sCoverUrl = '';
-        if(!empty($CNF['FIELD_COVER']) && $aData[$CNF['FIELD_COVER']]) {
+        if(!$bCoverRaw && !empty($CNF['FIELD_COVER']) && $aData[$CNF['FIELD_COVER']]) {
             $oImagesTranscoder = BxDolTranscoderImage::getObjectInstance($CNF['OBJECT_IMAGES_TRANSCODER_GALLERY']);
-                if($oImagesTranscoder)
-                    $sCoverUrl = $oImagesTranscoder->getFileUrl($aData[$CNF['FIELD_COVER']]);
+            if($oImagesTranscoder)
+                $sCoverUrl = $oImagesTranscoder->getFileUrl($aData[$CNF['FIELD_COVER']]);
 
             if(empty($sCoverUrl)) {
                 $oImagesTranscoder = BxDolTranscoderImage::getObjectInstance($CNF['OBJECT_IMAGES_TRANSCODER_COVER']);
@@ -320,6 +346,14 @@ class BxMarketTemplate extends BxBaseModTextTemplate
                     'icon' => $CNF['ICON']
                 ),
             ),
+            'bx_if:show_cover_raw' => array (
+                'condition' => $bCoverRaw,
+                'content' => array (
+                    'summary_attr' => bx_html_attribute($sSummaryPlain),
+                    'content_url' => $sUrl,
+                    'cover_raw' => $aData[$CNF['FIELD_COVER_RAW']],
+                ),
+            ),
             'bx_if:show_cover' => array (
                 'condition' => $sCoverUrl,
                 'content' => array (
@@ -330,7 +364,7 @@ class BxMarketTemplate extends BxBaseModTextTemplate
                 ),
             ),
             'bx_if:show_cover_empty' => array (
-                'condition' => !$sCoverUrl,
+                'condition' => !$bCoverRaw && !$sCoverUrl,
                 'content' => array (
                     'summary_plain' => $sSummaryPlain,
                     'strecher' => mb_strlen($sSummaryPlain) > 240 ? '' : str_repeat('&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ', round((240 - mb_strlen($sSummaryPlain)) / 6)),

+ 6 - 3
modules/boonex/market/install/langs/en.xml

@@ -37,10 +37,10 @@
 	<string name="_bx_market_form_entry_input_cat"><![CDATA[Category]]></string>
     <string name="_bx_market_form_entry_input_cat_err"><![CDATA[Please select category]]></string>
     <string name="_bx_market_form_entry_input_sys_price_single"><![CDATA[Price]]></string>
-	<string name="_bx_market_form_entry_input_price_single"><![CDATA[Price]]></string>
+    <string name="_bx_market_form_entry_input_price_single"><![CDATA[Price]]></string>
     <string name="_bx_market_form_entry_input_price_single_inf"><![CDATA[Leave empty to make the product free.]]></string>
     <string name="_bx_market_form_entry_input_sys_price_recurring"><![CDATA[Recurring price]]></string>
-	<string name="_bx_market_form_entry_input_price_recurring"><![CDATA[Price]]></string>
+    <string name="_bx_market_form_entry_input_price_recurring"><![CDATA[Price]]></string>
     <string name="_bx_market_form_entry_input_price_recurring_inf"><![CDATA[Leave empty to make the product free.]]></string>
     <string name="_bx_market_form_entry_input_sys_duration_recurring"><![CDATA[Billing period]]></string>
     <string name="_bx_market_form_entry_input_duration_recurring"><![CDATA[Billing period]]></string>
@@ -75,7 +75,10 @@
 	<string name="_bx_market_form_entry_input_delete_confirm"><![CDATA[I am sure I want to delete this product]]></string>
 	<string name="_bx_market_form_entry_input_delete_confirm_info"><![CDATA[This action can not be undone]]></string>
 	<string name="_bx_market_form_entry_input_delete_confirm_error"><![CDATA[Please check this checkbox if you really want to delete the product]]></string>
-	<string name="_bx_market_form_entry_input_sys_pictures"><![CDATA[Pictures]]></string>
+        <string name="_bx_market_form_entry_input_sys_cover_raw"><![CDATA[Header Image RAW]]></string>
+	<string name="_bx_market_form_entry_input_cover_raw"><![CDATA[Header Image RAW]]></string>
+        <string name="_bx_market_form_entry_input_cover_raw_inf"><![CDATA[If provided, it'll be used instead of image based variant.]]></string>
+        <string name="_bx_market_form_entry_input_sys_pictures"><![CDATA[Pictures]]></string>
 	<string name="_bx_market_form_entry_input_pictures"><![CDATA[Pictures]]></string>
 	<string name="_bx_market_form_entry_input_pictures_title"><![CDATA[Title]]></string>
 	<string name="_bx_market_form_entry_input_pictures_use_as_thumb"><![CDATA[Icon]]></string>

+ 61 - 57
modules/boonex/market/install/sql/install.sql

@@ -9,6 +9,7 @@ CREATE TABLE IF NOT EXISTS `bx_market_products` (
   `changed` int(11) NOT NULL default '0',
   `thumb` int(11) NOT NULL default '0',
   `cover` int(11) NOT NULL default '0',
+  `cover_raw` text NOT NULL,
   `package` int(11) NOT NULL default '0',
   `name` varchar(255) NOT NULL,
   `title` varchar(255) NOT NULL,
@@ -372,7 +373,7 @@ CREATE TABLE IF NOT EXISTS `bx_market_scores_track` (
 -- STORAGES & TRANSCODERS
 INSERT INTO `sys_objects_storage` (`object`, `engine`, `params`, `token_life`, `cache_control`, `levels`, `table_files`, `ext_mode`, `ext_allow`, `ext_deny`, `quota_size`, `current_size`, `quota_number`, `current_number`, `max_file_size`, `ts`) VALUES
 ('bx_market_files', @sStorageEngine, '', 360, 2592000, 3, 'bx_market_files', 'allow-deny', 'zip', '', 0, 0, 0, 0, 0, 0),
-('bx_market_photos', @sStorageEngine, '', 360, 2592000, 3, 'bx_market_photos', 'allow-deny', 'jpg,jpeg,jpe,gif,png', '', 0, 0, 0, 0, 0, 0),
+('bx_market_photos', @sStorageEngine, '', 360, 2592000, 3, 'bx_market_photos', 'allow-deny', 'jpg,jpeg,jpe,gif,png,svg', '', 0, 0, 0, 0, 0, 0),
 ('bx_market_photos_resized', @sStorageEngine, '', 360, 2592000, 3, 'bx_market_photos_resized', 'allow-deny', 'jpg,jpeg,jpe,gif,png', '', 0, 0, 0, 0, 0, 0);
 
 INSERT INTO `sys_objects_transcoder` (`object`, `storage_object`, `source_type`, `source_params`, `private`, `atime_tracking`, `atime_pruning`, `ts`) VALUES 
@@ -412,6 +413,7 @@ INSERT INTO `sys_form_inputs`(`object`, `module`, `name`, `value`, `values`, `ch
 ('bx_market', 'bx_market', 'do_publish', '_bx_market_form_entry_input_do_publish', '', 0, 'submit', '_bx_market_form_entry_input_sys_do_publish', '', '', 0, 0, 0, '', '', '', '', '', '', '', '', 1, 0),
 ('bx_market', 'bx_market', 'do_submit', '_bx_market_form_entry_input_do_submit', '', 0, 'submit', '_bx_market_form_entry_input_sys_do_submit', '', '', 0, 0, 0, '', '', '', '', '', '', '', '', 1, 0),
 ('bx_market', 'bx_market', 'location', '', '', 0, 'location', '_sys_form_input_sys_location', '_sys_form_input_location', '', 0, 0, 0, '', '', '', '', '', '', '', '', 1, 0),
+('bx_market', 'bx_market', 'cover_raw', '', '', 0, 'textarea', '_bx_market_form_entry_input_sys_cover_raw', '_bx_market_form_entry_input_cover_raw', '_bx_market_form_entry_input_cover_raw_inf', 0, 0, 0, '', '', '', '', '', '', 'XssHtml', '', 1, 0),
 ('bx_market', 'bx_market', 'pictures', 'a:1:{i:0;s:15:"bx_market_html5";}', 'a:2:{s:16:"bx_market_simple";s:26:"_sys_uploader_simple_title";s:15:"bx_market_html5";s:25:"_sys_uploader_html5_title";}', 0, 'files', '_bx_market_form_entry_input_sys_pictures', '_bx_market_form_entry_input_pictures', '', 0, 0, 0, '', '', '', '', '', '', '', '', 1, 0),
 ('bx_market', 'bx_market', 'files', 'a:1:{i:0;s:15:"bx_market_html5";}', 'a:2:{s:16:"bx_market_simple";s:26:"_sys_uploader_simple_title";s:15:"bx_market_html5";s:25:"_sys_uploader_html5_title";}', 0, 'files', '_bx_market_form_entry_input_sys_files', '_bx_market_form_entry_input_files', '', 0, 0, 0, '', '', '', '', '', '', '', '', 1, 0),
 ('bx_market', 'bx_market', 'text', '', '', 0, 'textarea', '_bx_market_form_entry_input_sys_text', '_bx_market_form_entry_input_text', '', 1, 0, 2, '', '', '', 'Avail', '', '_bx_market_form_entry_input_text_err', 'XssHtml', '', 1, 0),
@@ -446,34 +448,35 @@ INSERT INTO `sys_form_display_inputs`(`display_name`, `input_name`, `visible_for
 ('bx_market_entry_add', 'name', 2147483647, 1, 2),
 ('bx_market_entry_add', 'cat', 2147483647, 1, 3),
 ('bx_market_entry_add', 'text', 2147483647, 1, 4),
-('bx_market_entry_add', 'pictures', 2147483647, 1, 5),
-('bx_market_entry_add', 'files', 2147483647, 1, 6),
-('bx_market_entry_add', 'header_beg_single', 2147483647, 1, 7),
-('bx_market_entry_add', 'warning_single', 2147483647, 1, 8),
-('bx_market_entry_add', 'price_single', 2147483647, 1, 9),
-('bx_market_entry_add', 'header_end_single', 2147483647, 1, 10),
-('bx_market_entry_add', 'header_beg_recurring', 2147483647, 1, 11),
-('bx_market_entry_add', 'warning_recurring', 2147483647, 1, 12),
-('bx_market_entry_add', 'duration_recurring', 2147483647, 1, 13),
-('bx_market_entry_add', 'price_recurring', 2147483647, 1, 14),
-('bx_market_entry_add', 'trial_recurring', 2147483647, 1, 15),
-('bx_market_entry_add', 'header_end_recurring', 2147483647, 1, 16),
-('bx_market_entry_add', 'header_beg_privacy', 2147483647, 1, 17),
-('bx_market_entry_add', 'allow_view_to', 2147483647, 1, 18),
-('bx_market_entry_add', 'allow_purchase_to', 2147483647, 1, 19),
-('bx_market_entry_add', 'allow_comment_to', 2147483647, 1, 20),
-('bx_market_entry_add', 'allow_vote_to', 2147483647, 1, 21),
-('bx_market_entry_add', 'cf', 2147483647, 1, 22),
-('bx_market_entry_add', 'header_end_privacy', 2147483647, 1, 23),
-('bx_market_entry_add', 'header_beg_notes', 2147483647, 1, 24),
-('bx_market_entry_add', 'notes', 2147483647, 1, 25),
-('bx_market_entry_add', 'notes_purchased', 2147483647, 1, 26),
-('bx_market_entry_add', 'header_end_notes', 2147483647, 1, 27),
-('bx_market_entry_add', 'header_beg_other', 2147483647, 1, 28),
-('bx_market_entry_add', 'location', 2147483647, 1, 29),
-('bx_market_entry_add', 'subentries', 2147483647, 1, 30),
-('bx_market_entry_add', 'header_end_other', 2147483647, 1, 31),
-('bx_market_entry_add', 'do_publish', 2147483647, 1, 32),
+('bx_market_entry_add', 'cover_raw', 2147483647, 0, 5),
+('bx_market_entry_add', 'pictures', 2147483647, 1, 6),
+('bx_market_entry_add', 'files', 2147483647, 1, 7),
+('bx_market_entry_add', 'header_beg_single', 2147483647, 1, 8),
+('bx_market_entry_add', 'warning_single', 2147483647, 1, 9),
+('bx_market_entry_add', 'price_single', 2147483647, 1, 10),
+('bx_market_entry_add', 'header_end_single', 2147483647, 1, 11),
+('bx_market_entry_add', 'header_beg_recurring', 2147483647, 1, 12),
+('bx_market_entry_add', 'warning_recurring', 2147483647, 1, 13),
+('bx_market_entry_add', 'duration_recurring', 2147483647, 1, 14),
+('bx_market_entry_add', 'price_recurring', 2147483647, 1, 15),
+('bx_market_entry_add', 'trial_recurring', 2147483647, 1, 16),
+('bx_market_entry_add', 'header_end_recurring', 2147483647, 1, 17),
+('bx_market_entry_add', 'header_beg_privacy', 2147483647, 1, 18),
+('bx_market_entry_add', 'allow_view_to', 2147483647, 1, 19),
+('bx_market_entry_add', 'allow_purchase_to', 2147483647, 1, 20),
+('bx_market_entry_add', 'allow_comment_to', 2147483647, 1, 21),
+('bx_market_entry_add', 'allow_vote_to', 2147483647, 1, 22),
+('bx_market_entry_add', 'cf', 2147483647, 1, 23),
+('bx_market_entry_add', 'header_end_privacy', 2147483647, 1, 24),
+('bx_market_entry_add', 'header_beg_notes', 2147483647, 1, 25),
+('bx_market_entry_add', 'notes', 2147483647, 1, 26),
+('bx_market_entry_add', 'notes_purchased', 2147483647, 1, 27),
+('bx_market_entry_add', 'header_end_notes', 2147483647, 1, 28),
+('bx_market_entry_add', 'header_beg_other', 2147483647, 1, 29),
+('bx_market_entry_add', 'location', 2147483647, 1, 30),
+('bx_market_entry_add', 'subentries', 2147483647, 1, 31),
+('bx_market_entry_add', 'header_end_other', 2147483647, 1, 32),
+('bx_market_entry_add', 'do_publish', 2147483647, 1, 33),
 
 ('bx_market_entry_delete', 'delete_confirm', 2147483647, 1, 1),
 ('bx_market_entry_delete', 'do_submit', 2147483647, 1, 2),
@@ -482,34 +485,35 @@ INSERT INTO `sys_form_display_inputs`(`display_name`, `input_name`, `visible_for
 ('bx_market_entry_edit', 'name', 2147483647, 1, 2),
 ('bx_market_entry_edit', 'cat', 2147483647, 1, 3),
 ('bx_market_entry_edit', 'text', 2147483647, 1, 4),
-('bx_market_entry_edit', 'pictures', 2147483647, 1, 5),
-('bx_market_entry_edit', 'files', 2147483647, 1, 6),
-('bx_market_entry_edit', 'header_beg_single', 2147483647, 1, 7),
-('bx_market_entry_edit', 'warning_single', 2147483647, 1, 8),
-('bx_market_entry_edit', 'price_single', 2147483647, 1, 9),
-('bx_market_entry_edit', 'header_end_single', 2147483647, 1, 10),
-('bx_market_entry_edit', 'header_beg_recurring', 2147483647, 1, 11),
-('bx_market_entry_edit', 'warning_recurring', 2147483647, 1, 12),
-('bx_market_entry_edit', 'duration_recurring', 2147483647, 1, 13),
-('bx_market_entry_edit', 'price_recurring', 2147483647, 1, 14),
-('bx_market_entry_edit', 'trial_recurring', 2147483647, 1, 15),
-('bx_market_entry_edit', 'header_end_recurring', 2147483647, 1, 16),
-('bx_market_entry_edit', 'header_beg_privacy', 2147483647, 1, 17),
-('bx_market_entry_edit', 'allow_view_to', 2147483647, 1, 18),
-('bx_market_entry_edit', 'allow_purchase_to', 2147483647, 1, 19),
-('bx_market_entry_edit', 'allow_comment_to', 2147483647, 1, 20),
-('bx_market_entry_edit', 'allow_vote_to', 2147483647, 1, 21),
-('bx_market_entry_edit', 'cf', 2147483647, 1, 22),
-('bx_market_entry_edit', 'header_end_privacy', 2147483647, 1, 23),
-('bx_market_entry_edit', 'header_beg_notes', 2147483647, 1, 24),
-('bx_market_entry_edit', 'notes', 2147483647, 1, 25),
-('bx_market_entry_edit', 'notes_purchased', 2147483647, 1, 26),
-('bx_market_entry_edit', 'header_end_notes', 2147483647, 1, 27),
-('bx_market_entry_edit', 'header_beg_other', 2147483647, 1, 28),
-('bx_market_entry_edit', 'location', 2147483647, 1, 29),
-('bx_market_entry_edit', 'subentries', 2147483647, 1, 30),
-('bx_market_entry_edit', 'header_end_other', 2147483647, 1, 31),
-('bx_market_entry_edit', 'do_submit', 2147483647, 1, 32),
+('bx_market_entry_edit', 'cover_raw', 2147483647, 0, 5),
+('bx_market_entry_edit', 'pictures', 2147483647, 1, 6),
+('bx_market_entry_edit', 'files', 2147483647, 1, 7),
+('bx_market_entry_edit', 'header_beg_single', 2147483647, 1, 8),
+('bx_market_entry_edit', 'warning_single', 2147483647, 1, 9),
+('bx_market_entry_edit', 'price_single', 2147483647, 1, 10),
+('bx_market_entry_edit', 'header_end_single', 2147483647, 1, 11),
+('bx_market_entry_edit', 'header_beg_recurring', 2147483647, 1, 12),
+('bx_market_entry_edit', 'warning_recurring', 2147483647, 1, 13),
+('bx_market_entry_edit', 'duration_recurring', 2147483647, 1, 14),
+('bx_market_entry_edit', 'price_recurring', 2147483647, 1, 15),
+('bx_market_entry_edit', 'trial_recurring', 2147483647, 1, 16),
+('bx_market_entry_edit', 'header_end_recurring', 2147483647, 1, 17),
+('bx_market_entry_edit', 'header_beg_privacy', 2147483647, 1, 18),
+('bx_market_entry_edit', 'allow_view_to', 2147483647, 1, 19),
+('bx_market_entry_edit', 'allow_purchase_to', 2147483647, 1, 20),
+('bx_market_entry_edit', 'allow_comment_to', 2147483647, 1, 21),
+('bx_market_entry_edit', 'allow_vote_to', 2147483647, 1, 22),
+('bx_market_entry_edit', 'cf', 2147483647, 1, 23),
+('bx_market_entry_edit', 'header_end_privacy', 2147483647, 1, 24),
+('bx_market_entry_edit', 'header_beg_notes', 2147483647, 1, 25),
+('bx_market_entry_edit', 'notes', 2147483647, 1, 26),
+('bx_market_entry_edit', 'notes_purchased', 2147483647, 1, 27),
+('bx_market_entry_edit', 'header_end_notes', 2147483647, 1, 28),
+('bx_market_entry_edit', 'header_beg_other', 2147483647, 1, 29),
+('bx_market_entry_edit', 'location', 2147483647, 1, 30),
+('bx_market_entry_edit', 'subentries', 2147483647, 1, 31),
+('bx_market_entry_edit', 'header_end_other', 2147483647, 1, 32),
+('bx_market_entry_edit', 'do_submit', 2147483647, 1, 33),
 
 ('bx_market_entry_view', 'cat', 2147483647, 1, 1),
 ('bx_market_entry_view', 'added', 2147483647, 1, 2),

+ 17 - 1
modules/boonex/market/js/form.js

@@ -9,7 +9,7 @@
  */
 
 function BxMarketForm(oOptions) {
-	this._sActionsUri = oOptions.sActionUri;
+    this._sActionsUri = oOptions.sActionUri;
     this._sActionsUrl = oOptions.sActionUrl;
     this._sObjName = oOptions.sObjName == undefined ? 'oBxMarketForm' : oOptions.sObjName;
     this._iOwnerId = oOptions.iOwnerId == undefined ? 0 : oOptions.iOwnerId;
@@ -17,8 +17,24 @@ function BxMarketForm(oOptions) {
     this._iAnimationSpeed = oOptions.iAnimationSpeed == undefined ? 'slow' : oOptions.iAnimationSpeed;
     this._aHtmlIds = oOptions.aHtmlIds == undefined ? {} : oOptions.aHtmlIds;
     this._oRequestParams = oOptions.oRequestParams == undefined ? {} : oOptions.oRequestParams;
+    
+    var $this = this;
+    jQuery(document).ready(function() {
+        $this.init();
+    });
 }
 
+BxMarketForm.prototype.init = function() {
+    jQuery("textarea[name='cover_raw']").each(function() {
+        CodeMirror.fromTextArea(this, {
+            lineNumbers: true,
+            mode: "htmlmixed",
+            htmlMode: true,
+            matchBrackets: true
+        });
+    });
+};
+
 BxMarketForm.prototype.checkName = function(sTitleId, sNameId, iId) {
 	var oDate = new Date();
 

+ 3 - 0
modules/boonex/market/template/entry-text.html

@@ -1,5 +1,8 @@
 <div class="bx-content-description-before">__content_description_before__</div>
 <div class="bx-content-description">
+    <bx_if:show_image_raw>
+        <div class="bx-base-text-entity-image bx-def-margin-bottom bx-def-font-align-center">__image_raw__</div>
+    </bx_if:show_image_raw>
     <bx_if:show_image>
         <div class="bx-base-text-entity-image bx-def-margin-bottom bx-def-font-align-center">
             <img class="bx-def-border-radius-block" src="__entry_image__" />

+ 14 - 9
modules/boonex/market/template/unit_gallery.html

@@ -15,19 +15,24 @@
 
         <!-- Main section -->
         <div class="bx-market-unit-cnt bx-market-unit-cover">
-		    <bx_if:show_cover>
-	            <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(__cover_url__)">
-	                    <div class="bx-base-text-unit-strecher">__strecher__</div>
-	                </div>
-	            </a>
-	        </bx_if:show_cover>
-	        <bx_if:show_cover_empty>
+            <bx_if:show_cover_raw>
+                <a href="__content_url__" title="__summary_attr__">
+                    <div class="bx-base-text-unit-thumb bx-base-text-unit-thumb-raw">__cover_raw__</div>
+                </a>
+            </bx_if:show_cover_raw>
+            <bx_if:show_cover>
+                <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(__cover_url__)">
+                        <div class="bx-base-text-unit-strecher">__strecher__</div>
+                    </div>
+                </a>
+            </bx_if:show_cover>
+            <bx_if:show_cover_empty>
                 <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-border bx-def-box-sizing">
                     __summary_plain__
                     <div class="bx-base-text-unit-strecher">__strecher__</div>
                 </div>
-	        </bx_if:show_cover_empty>
+            </bx_if:show_cover_empty>
         </div>
 		<div class="bx-market-unit-cnt bx-def-padding">
             <div class="bx-market-unit-info">

+ 6 - 3
modules/boonex/russian/data/langs/bx_market/ru.xml

@@ -39,10 +39,10 @@
 	<string name="_bx_market_form_entry_input_sys_price_single"><![CDATA[Цена]]></string>
 	<string name="_bx_market_form_entry_input_price_single"><![CDATA[Цена]]></string>
     <string name="_bx_market_form_entry_input_price_single_inf"><![CDATA[Оставьте пустым, чтобы сделать продукт бесплатным.]]></string>
-	<string name="_bx_market_form_entry_input_sys_price_recurring"><![CDATA[Периодические выплаты]]></string>
-	<string name="_bx_market_form_entry_input_price_recurring"><![CDATA[Цена]]></string>
+    <string name="_bx_market_form_entry_input_sys_price_recurring"><![CDATA[Периодические выплаты]]></string>
+    <string name="_bx_market_form_entry_input_price_recurring"><![CDATA[Цена]]></string>
     <string name="_bx_market_form_entry_input_price_recurring_inf"><![CDATA[Оставьте пустым, чтобы сделать продукт бесплатным.]]></string>
-	<string name="_bx_market_form_entry_input_sys_duration_recurring"><![CDATA[Период оплаты]]></string>
+    <string name="_bx_market_form_entry_input_sys_duration_recurring"><![CDATA[Период оплаты]]></string>
     <string name="_bx_market_form_entry_input_duration_recurring"><![CDATA[Период оплаты]]></string>
     <string name="_bx_market_form_entry_input_sys_trial_recurring"><![CDATA[Пробный период]]></string>
     <string name="_bx_market_form_entry_input_trial_recurring"><![CDATA[Пробный период]]></string>
@@ -75,6 +75,9 @@
 	<string name="_bx_market_form_entry_input_delete_confirm"><![CDATA[Я уверен(а), что хочу удалить этот продукт]]></string>
 	<string name="_bx_market_form_entry_input_delete_confirm_info"><![CDATA[Это действие не может быть отменено]]></string>
 	<string name="_bx_market_form_entry_input_delete_confirm_error"><![CDATA[Пожалуйста, отметьте этот флажок, если действительно хотите удалить продукт]]></string>
+        <string name="_bx_market_form_entry_input_sys_cover_raw"><![CDATA[Изображение заголовка (RAW)]]></string>
+	<string name="_bx_market_form_entry_input_cover_raw"><![CDATA[Изображение заголовка (RAW)]]></string>
+        <string name="_bx_market_form_entry_input_cover_raw_inf"><![CDATA[Если предоставлено, то оно будет использоваться вместо варианта на основе изображения.]]></string>
 	<string name="_bx_market_form_entry_input_sys_pictures"><![CDATA[Картинки]]></string>
 	<string name="_bx_market_form_entry_input_pictures"><![CDATA[Картинки]]></string>
 	<string name="_bx_market_form_entry_input_pictures_title"><![CDATA[Название]]></string>