Explorar o código

Merge branch 'master' of https://github.com/unaio/una

RomanL %!s(int64=4) %!d(string=hai) anos
pai
achega
d1eb07c2bf

+ 98 - 21
inc/classes/BxDolTemplate.php

@@ -1890,6 +1890,73 @@ 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);
+    }
+
+    function addJsCodeOnLoad($sCallback)
+    {
+        $sMaskLoad = "$(document).ready(function() {%s});";
+
+        return sprintf($sMaskLoad, $sCallback);
+    }
+    
+    function addJsCodeOnLoadWrapped($sCallback)
+    {
+        $sCode = $this->addJsCodeOnLoad($sCallback);
+
+        return $this->_wrapInTagJsCode($sCode); 
+    }
+    
     /**
      * get added js files
      */ 
@@ -1897,7 +1964,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 +2485,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 +2525,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.
      *

+ 3 - 3
modules/boonex/fontawesome/classes/BxFontAwesomeDb.php

@@ -23,9 +23,9 @@ class BxFontAwesomeDb extends BxDolModuleDb
 
     function switchFont($sFont)
     {
-        $this->query("UPDATE `sys_preloader` SET `active` = :active WHERE `module` = 'bx_fontawesome' AND `type` = 'css_system' AND `content` = 'fonts-light.css'", array('active' => 'light' == $sFont ? 1 : 0));
-        $this->query("UPDATE `sys_preloader` SET `active` = :active WHERE `module` = 'bx_fontawesome' AND `type` = 'css_system' AND `content` = 'fonts-duotone.css'", array('active' => 'duotone' == $sFont ? 1 : 0));
-        $this->query("UPDATE `sys_preloader` SET `active` = :active WHERE `module` = 'bx_fontawesome' AND `type` = 'css_system' AND `content` = 'fonts-all.css'", array('active' => 'default' == $sFont ? 1 : 0));
+        $this->query("UPDATE `sys_preloader` SET `active` = :active WHERE `module` = 'bx_fontawesome' AND `type` = 'css_system' AND `content` = 'modules/boonex/fontawesome/template/css/|fonts-light.css'", array('active' => 'light' == $sFont ? 1 : 0));
+        $this->query("UPDATE `sys_preloader` SET `active` = :active WHERE `module` = 'bx_fontawesome' AND `type` = 'css_system' AND `content` = 'modules/boonex/fontawesome/template/css/|fonts-duotone.css'", array('active' => 'duotone' == $sFont ? 1 : 0));
+        $this->query("UPDATE `sys_preloader` SET `active` = :active WHERE `module` = 'bx_fontawesome' AND `type` = 'css_system' AND `content` = 'modules/boonex/fontawesome/template/css/|fonts-all.css'", array('active' => 'default' == $sFont ? 1 : 0));
     }
 }
 

+ 7 - 0
modules/boonex/payment/classes/BxPaymentModule.php

@@ -950,6 +950,13 @@ class BxPaymentModule extends BxBaseModPaymentModule
 
     public function onProfileDelete($iProfileId)
     {
+        //--- Cancel subscriptions
+        $aSubscriptions = $this->_oDb->getSubscription(['type' => 'mixed_ext', 'conditions' => ['client_id' => $iProfileId]]);
+        if(!empty($aSubscriptions) && is_array($aSubscriptions)) 
+            foreach($aSubscriptions as $aSubscription)
+                $this->getObjectSubscriptions()->cancel($aSubscription['pending_id']);
+
+        //--- Clean DB
         $this->_oDb->onProfileDelete($iProfileId);
     }
 

+ 61 - 16
modules/boonex/payment/classes/BxPaymentProviderPayPalApi.php

@@ -189,6 +189,7 @@ class BxPaymentProviderPayPalApi extends BxBaseModPaymentProvider implements iBx
             return array('code' => 2, 'message' => $this->_sLangsPrefix . 'pp_api_err_no_subscription');
 
         $aSubscriber = $this->_getClientInfo($aSubscription['subscriber']);
+        list($bPaid, $bTrial) = $this->_getBillingStatus($aSubscription['billing_info']);
 
         $aResult = array(
             'code' => BX_PAYMENT_RESULT_SUCCESS, 
@@ -197,7 +198,9 @@ class BxPaymentProviderPayPalApi extends BxBaseModPaymentProvider implements iBx
             'customer_id' => $aSubscription['subscriber']['payer_id'], 
             'subscription_id' => $sSubscription,
             'client_name' => _t($this->_sLangsPrefix . 'txt_buyer_name_mask', $aSubscriber['client_first_name'], $aSubscriber['client_last_name']),
-            'client_email' => $aSubscriber['client_email']
+            'client_email' => $aSubscriber['client_email'],
+            'paid' => $bPaid,
+            'trial' => $bTrial,
         );
 
         if($aSubscription['status'] == PP_API_SBS_STATUS_APPROVAL_PENDING)       
@@ -710,29 +713,71 @@ class BxPaymentProviderPayPalApi extends BxBaseModPaymentProvider implements iBx
         $this->_oSession->setValue($this->_sSessionKeySubscription, $sValue);
     }
 
+    /**
+     * Retrieve 'Client Info' from a 'getSubscription' call's response.
+     */
     protected function _getClientInfo($mixedClient)
     {
-        $sName = 'name';
-        $sFirst = 'given_name';
-        $sLast = 'surname';
-        $sEmail = 'email_address';
+        $_sName = 'name';
+        $_sFirst = 'given_name';
+        $_sLast = 'surname';
+        $_sEmail = 'email_address';
 
-        $aResult = array();
+        $aResult = [];
         if(is_object($mixedClient))
-            $aResult = array(
-                'client_first_name' => $mixedClient->$sName->$sFirst,
-                'client_last_name' => $mixedClient->$sName->$sLast,
-                'client_email' => $mixedClient->$sEmail,
-            );
+            $aResult = [
+                'client_first_name' => $mixedClient->$_sName->$_sFirst,
+                'client_last_name' => $mixedClient->$_sName->$_sLast,
+                'client_email' => $mixedClient->$_sEmail,
+            ];
         else
-            $aResult = array(
-                'client_first_name' => $mixedClient[$sName][$sFirst],
-                'client_last_name' => $mixedClient[$sName][$sLast],
-                'client_email' => $mixedClient[$sEmail],
-            );
+            $aResult = [
+                'client_first_name' => $mixedClient[$_sName][$_sFirst],
+                'client_last_name' => $mixedClient[$_sName][$_sLast],
+                'client_email' => $mixedClient[$_sEmail],
+            ];
 
         return $aResult;
     }
+
+    /**
+     * Retrieve 'Billing Status' from a 'getSubscription' call's response.
+     */
+    protected function _getBillingStatus($mixedBillingInfo)
+    {
+        $bTrial = $bPaid = false;
+
+        $_sCycles = 'cycle_executions';
+        $_sCycleType = 'tenure_type';
+        $_sCyclesCompleted = 'cycles_completed';
+        $_sCyclesTotal = 'total_cycles';
+
+        $bByObject = is_object($mixedBillingInfo);
+        $aCycles = $bByObject ? $mixedBillingInfo->$_sCycles : $mixedBillingInfo[$_sCycles];
+        if(empty($aCycles) || !is_array($aCycles))
+            return [$bPaid, $bTrial];
+
+        foreach($aCycles as $mixedCycle) {
+            $sCycleType = $bByObject ? $mixedCycle->$_sCycleType : $mixedCycle[$_sCycleType];
+            $iCyclesCompleted = $bByObject ? $mixedCycle->$_sCyclesCompleted : (int)$mixedCycle[$_sCyclesCompleted];
+            $iCyclesTotal = $bByObject ? $mixedCycle->$_sCyclesTotal : (int)$mixedCycle[$_sCyclesTotal];
+
+            switch($sCycleType) {
+                case 'TRIAL':
+                    if($iCyclesCompleted < $iCyclesTotal) {
+                        $bTrial = true;
+                        break 2;
+                    }
+                    break;
+                
+                case 'REGULAR':
+                    $bPaid = true;
+                    break 2;
+            }
+        }
+
+        return [$bPaid, $bTrial];
+    }
 }
 
 /** @} */

+ 11 - 27
template/scripts/BxBaseEditorQuill.php

@@ -124,37 +124,21 @@ class BxBaseEditorQuill extends BxDolEditor
             'bx_url_root' => bx_js_string(BX_DOL_URL_ROOT, BX_ESCAPE_STR_APOS)
         ));
 
-        if ($bDynamicMode) {
+        $sInitCallBack = "
+            bQuillEditorInited = true;
+            Quill.register('modules/imageUploader', ImageUploader);
+        " . $sInitEditor;
 
+        if ($bDynamicMode) {
             list($aJs, $aCss) = $this->_getJsCss(true);
-            $sCss = $this->_oTemplate->addCss($aCss, true);
-            
-            $sScript = $sCss . "<script>
-                var " . $sEditorName . ";
-                if (typeof bQuillEditorInited === 'undefined') {
-                    bx_get_scripts(" . json_encode($aJs) . ", function () {
-                        bQuillEditorInited = true;
-                        Quill.register('modules/imageUploader', ImageUploader); 
-                        $sInitEditor
-                    });
-                } else {
-                	setTimeout(function () {
-                    	$sInitEditor
-                    }, 10); // wait while html is rendered in case of dynamic adding html with quill
-                } 
-            </script>";
 
-        } else {
+            $sScript = "var " . $sEditorName . "; " . $this->_oTemplate->addJsPreloaded($aJs, $sInitCallBack, "typeof bQuillEditorInited === 'undefined'", $sInitEditor);
+            $sScript = $this->_oTemplate->_wrapInTagJsCode($sScript);
+            $sScript = $this->_oTemplate->addCss($aCss, true) . $sScript;
 
-            $sScript = "
-            <script>
-                var " . $sEditorName . ";
-                $(document).ready(function () {
-                    bQuillEditorInited = true;
-                    Quill.register('modules/imageUploader', ImageUploader); 
-                    $sInitEditor
-                });
-            </script>";
+        } else {
+            $sScript = "var " . $sEditorName . "; " . $this->_oTemplate->addJsCodeOnLoad($sInitCallBack);
+            $sScript = $this->_oTemplate->_wrapInTagJsCode($sScript);
         }
 
         return $this->_addJsCss($bDynamicMode) . $sScript;

+ 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 : '';
     }