Explorar o código

Ticket #3635 - Uploader's JS code is loaded multiple times in 'Add New...' form.

AntonLV %!s(int64=4) %!d(string=hai) anos
pai
achega
80f27804a1
Modificáronse 2 ficheiros con 101 adicións e 30 borrados
  1. 84 21
      inc/classes/BxDolTemplate.php
  2. 17 9
      template/scripts/BxBaseUploaderHTML5.php

+ 84 - 21
inc/classes/BxDolTemplate.php

@@ -1890,6 +1890,59 @@ class BxDolTemplate extends BxDolFactory implements iBxDolSingleton
         return $this->_processFiles('js', 'add', $mixedFiles, $bDynamic);
     }
 
+    function addJsPreloaded($aFiles, $sCallback = false, $sCondition = false, $sConditionElseCallback = false)
+    {
+        if(!$aFiles)
+            return '';
+
+        if(!is_array($aFiles))
+            $aFiles = [$aFiles];
+
+        $sMaskLoad = "bx_get_scripts(%s);";
+        $sMaskLoadWithCallback = "bx_get_scripts(%s, function() {%s});";
+
+        $sMaskCondition = "if(%s) {%s}";
+        $sMaskConditionWithElse = "if(%s) {%s} else {setTimeout(function() {%s}, 10);}";
+
+        $iRev = (int)getParam('sys_revision');
+
+        $aFilesLocated = [];
+        foreach($aFiles as $sFile) {
+            $mixedFile = $this->_locateFile('js', $sFile);
+            if($mixedFile === false)
+                continue;
+
+            list($sUrl) = $mixedFile;
+
+            $aFilesLocated[] = bx_append_url_params($sUrl, ['rev' => $iRev]);
+        }
+        $sFilesLocated = json_encode($aFilesLocated);
+
+        if($sCallback !== false)
+            $sResult = sprintf($sMaskLoadWithCallback, $sFilesLocated, $sCallback);
+        else
+            $sResult = sprintf($sMaskLoad, $sFilesLocated);
+
+        if($sCondition === false)
+            return $sResult;
+
+        if($sConditionElseCallback !== false)
+            $sResult = sprintf($sMaskConditionWithElse, $sCondition, $sResult, $sConditionElseCallback);
+        else
+            $sResult = sprintf($sMaskCondition, $sCondition, $sResult);
+
+        return $sResult;
+    }
+
+    function addJsPreloadedWrapped($aFiles, $sCallback = false, $sCondition = false, $sConditionElseCallback = false)
+    {
+        $sCode = $this->addJsPreloaded($aFiles, $sCallback, $sCondition, $sConditionElseCallback);
+        if(!$sCode)
+            return '';
+
+        return $this->_wrapInTagJsCode($sCode);
+    }
+
     /**
      * get added js files
      */ 
@@ -1897,7 +1950,7 @@ class BxDolTemplate extends BxDolFactory implements iBxDolSingleton
     {
         return $this->aPage['js_compiled'];
     }
-    
+
     /**
      * Add System JS file(s) to global output.
      * System JS files are the files which are attached to all pages. They will be cached separately from the others.
@@ -2418,28 +2471,12 @@ class BxDolTemplate extends BxDolFactory implements iBxDolSingleton
         $sMethodWrap = '_wrapInTag' . $sUpcaseType;
         $sResult = '';
         foreach($mixedFiles as $sFile) {
-            //--- Process 3d Party CSS/JS file ---//
-            if(strpos($sFile, "http://") !== false || strpos($sFile, "https://") !== false) {
-                $sUrl = $sFile;
-                $sPath = $sFile;
-            }
-            //--- Process Custom CSS/JS file ---//
-            else if(strpos($sFile, "|") !== false) {
-                $sFile = implode('', explode("|", $sFile));
-                $sFile = bx_ltrim_str($sFile, BX_DIRECTORY_PATH_ROOT);
-
-                $sUrl = BX_DOL_URL_ROOT . $sFile;
-                $sPath = realpath(BX_DIRECTORY_PATH_ROOT . $sFile);
-            }
-            //--- Process Common CSS/JS file(check in default locations) ---//
-            else {
-                $sUrl = $this->$sMethodLocate('url', $sFile);
-                $sPath = $this->$sMethodLocate('path', $sFile);
-            }
-
-            if(empty($sPath) || empty($sUrl))
+            $mixedFile = $this->_locateFile($sType, $sFile);
+            if($mixedFile === false)
                 continue;
 
+            list($sUrl, $sPath) = $mixedFile;
+
             $sArrayKey = $sType . ($bSystem ? '_system' : '_compiled');
             switch($sAction) {
                 case 'add':
@@ -2474,6 +2511,32 @@ class BxDolTemplate extends BxDolFactory implements iBxDolSingleton
         return $bDynamic ? $sResult : true;
     }
 
+    function _locateFile($sType, $sFile)
+    {
+        //--- Process 3d Party CSS/JS file ---//
+        if(strpos($sFile, "http://") !== false || strpos($sFile, "https://") !== false) {
+            $sUrl = $sFile;
+            $sPath = $sFile;
+        }
+        //--- Process Custom CSS/JS file ---//
+        else if(strpos($sFile, "|") !== false) {
+            $sFile = implode('', explode("|", $sFile));
+            $sFile = bx_ltrim_str($sFile, BX_DIRECTORY_PATH_ROOT);
+
+            $sUrl = BX_DOL_URL_ROOT . $sFile;
+            $sPath = realpath(BX_DIRECTORY_PATH_ROOT . $sFile);
+        }
+        //--- Process Common CSS/JS file(check in default locations) ---//
+        else {
+            $sMethodLocate = '_getAbsoluteLocation' . ucfirst($sType);
+
+            $sUrl = $this->$sMethodLocate('url', $sFile);
+            $sPath = $this->$sMethodLocate('path', $sFile);
+        }
+
+        return !empty($sUrl) && !empty($sPath) ? [$sUrl, $sPath] : false;
+    }
+
     /**
      * Parse content.
      *

+ 17 - 9
template/scripts/BxBaseUploaderHTML5.php

@@ -32,19 +32,27 @@ class BxBaseUploaderHTML5 extends BxDolUploader
     public function addCssJs ($bDynamic = false)
     {
         $s = parent::addCssJs ($bDynamic);
-        $s .= $this->_oTemplate->addJs([
-                'filepond/filepond.min.js',
-                'filepond/filepond-plugin-image-preview.min.js',
-                'filepond/filepond-plugin-image-transform.min.js',
-                'filepond/filepond-plugin-image-crop.min.js',
-                'filepond/filepond-plugin-image-resize.min.js',
-                'filepond/filepond-plugin-file-validate-size.min.js',
-                'filepond/filepond-plugin-file-validate-type.js',
-            ], $bDynamic);
+
+        $aJs = [
+            'filepond/filepond.min.js',
+            'filepond/filepond-plugin-image-preview.min.js',
+            'filepond/filepond-plugin-image-transform.min.js',
+            'filepond/filepond-plugin-image-crop.min.js',
+            'filepond/filepond-plugin-image-resize.min.js',
+            'filepond/filepond-plugin-file-validate-size.min.js',
+            'filepond/filepond-plugin-file-validate-type.js',
+        ];
+
+        if($bDynamic)
+            $s .= $this->_oTemplate->addJsPreloadedWrapped($aJs);
+        else
+            $this->_oTemplate->addJs($aJs);
+        
         $s .= $this->_oTemplate->addCss([
                 BX_DIRECTORY_PATH_PLUGINS_PUBLIC . 'filepond/|filepond.min.css',
                 BX_DIRECTORY_PATH_PLUGINS_PUBLIC . 'filepond/|filepond-plugin-image-preview.min.css',
             ], $bDynamic);
+
         return $bDynamic ? $s : '';
     }