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

Ticket #4549 - Add subtypes for Module type in sys_modules table.

AntonLV 2 лет назад
Родитель
Сommit
2ba9fc6c3c

+ 51 - 0
inc/classes/BxDolInstallerUtils.php

@@ -105,6 +105,57 @@ class BxDolInstallerUtils extends BxDolIO
         }
     }
 
+    public function getSubtypes($sModule)
+    {
+        $iResult = 0;
+        $oModule = BxDolModule::getInstance($sModule);
+        if(!$oModule)
+            return $iResult;
+
+        $sMethod = 'getSubtypes';
+        if(method_exists($oModule, $sMethod))
+            return $oModule->$sMethod();
+
+        if($oModule instanceof iBxDolProfileService) {
+            if(bx_srv('system', 'is_module_profile', [$oModule]))
+                $iResult |= pow(2, BX_DOL_MODULE_SUBTYPE_PROFILE);
+
+            if(bx_srv('system', 'is_module_context', [$oModule]))
+                $iResult |= pow(2, BX_DOL_MODULE_SUBTYPE_CONTEXT);
+
+            return $iResult;
+        }
+
+        if(bx_srv('system', 'is_module_content', [$oModule])) {
+            $iResult |= pow(2, BX_DOL_MODULE_SUBTYPE_TEXT);
+
+            if($oModule instanceof BxBaseModFilesModule)
+                $iResult |= pow(2, BX_DOL_MODULE_SUBTYPE_FILE);
+
+            return $iResult;
+        }
+
+        if($oModule instanceof BxBaseModPaymentModule) {
+            $iResult |= pow(2, BX_DOL_MODULE_SUBTYPE_PAYMENT);
+
+            return $iResult;
+        }
+
+        if($oModule instanceof BxBaseModNotificationsModule) {
+            $iResult |= pow(2, BX_DOL_MODULE_SUBTYPE_NOTIFICATION);
+
+            return $iResult;
+        }
+
+        if($oModule instanceof BxBaseModConnectModule) {
+            $iResult |= pow(2, BX_DOL_MODULE_SUBTYPE_CONNECT);
+
+            return $iResult;
+        }
+
+        return $iResult;
+    }
+
     /**
      * Generate hash for module files.
      * @param $sPath module's root folder

+ 48 - 18
inc/classes/BxDolModuleQuery.php

@@ -105,9 +105,10 @@ class BxDolModuleQuery extends BxDolDb implements iBxDolSingleton
     }
     function getModulesBy($aParams = array(), $bFromCache = true)
     {
-    	$aMethod = array('name' => 'getAll', 'params' => array(0 => 'query'));
+    	$aMethod = ['name' => 'getAll', 'params' => [0 => 'query']];
         $sPostfix = $sWhereClause = $sOrderByClause = "";
-        $aBindings = array();
+        $sSelectClause = "`id`, `type`, `name`, `title`, `vendor`, `version`, `help_url`, `path`, `uri`, `class_prefix`, `db_prefix`, `lang_category`, `date`, `enabled`";
+        $aBindings = [];
 
         switch($aParams['type']) {
             case 'type':
@@ -125,6 +126,34 @@ class BxDolModuleQuery extends BxDolDb implements iBxDolSingleton
                 $sWhereClause .= " AND `type`=:type";
                 break;
 
+            case 'modules_subtypes':
+                if(!is_array($aParams['value']))
+                    $aParams['value'] = [$aParams['value']];
+
+                $sPostfix .= '_modules_subtypes_' . implode('_', $aParams['value']);
+                $aBindings['type'] = BX_DOL_MODULE_TYPE_MODULE;
+
+                $iSubtypes = 0;
+                foreach($aParams['value'] as $iSubtype) 
+                    $iSubtypes |= pow(2, $iSubtype);
+
+                $aBindings['subtypes'] = $iSubtypes;
+
+                $sWhereClause .= " AND `type`=:type AND `subtypes` & :subtypes";
+                break;
+
+            case 'is_module_subtype':
+                $sPostfix .= '_is_module_' . $aParams['subtype'] . '_' . $aParams['name'];
+                $aMethod['name'] = 'getOne';
+                $aBindings = [
+                    'type' => BX_DOL_MODULE_TYPE_MODULE,
+                    'subtypes' => pow(2, (int)$aParams['subtype']),
+                    'name' => $aParams['name']
+                ];
+                $sSelectClause = "`id`";
+                $sWhereClause .= " AND `type`=:type AND `subtypes` & :subtypes AND `name`=:name";
+                break;
+
             case 'languages':
                 $sPostfix .= '_languages';
                 $aBindings['type'] = BX_DOL_MODULE_TYPE_LANGUAGE;
@@ -176,30 +205,31 @@ class BxDolModuleQuery extends BxDolDb implements iBxDolSingleton
 
         $sOrderByClause = " ORDER BY " . (isset($aParams['order_by']) ? $aParams['order_by'] : '`title`');
 
-        $aMethod['params'][0] = "SELECT
-                `id`,
-                `type`,
-                `name`,
-                `title`,
-                `vendor`,
-                `version`,
-                `help_url`,
-                `path`,
-                `uri`,
-                `class_prefix`,
-                `db_prefix`,
-                `lang_category`,
-                `date`,
-                `enabled`
+        $aMethod['params'][0] = "SELECT " . $sSelectClause . "
             FROM `sys_modules`
             WHERE 1 " . $sWhereClause . $sOrderByClause;
         $aMethod['params'][] = $aBindings;
 
         if(!$bFromCache || empty($sPostfix))
-        	return call_user_func_array(array($this, $aMethod['name']), $aMethod['params']);
+            return call_user_func_array(array($this, $aMethod['name']), $aMethod['params']);
 
         return call_user_func_array(array($this, 'fromMemory'), array_merge(array('sys_modules' . $sPostfix, $aMethod['name']), $aMethod['params']));
     }
+    
+    function isModuleContent($sName)
+    {
+        return (int)$this->getModulesBy(['type' => 'is_module_subtype', 'subtype' => BX_DOL_MODULE_SUBTYPE_TEXT, 'name' => $sName]) != 0;
+    }
+    
+    function isModuleContext($sName)
+    {
+        return (int)$this->getModulesBy(['type' => 'is_module_subtype', 'subtype' => BX_DOL_MODULE_SUBTYPE_CONTEXT, 'name' => $sName]) != 0;
+    }
+    
+    function isModuleProfile($sName)
+    {
+        return (int)$this->getModulesBy(['type' => 'is_module_subtype', 'subtype' => BX_DOL_MODULE_SUBTYPE_PROFILE, 'name' => $sName]) != 0;
+    }
 
     function getModulesUri()
     {

+ 8 - 0
inc/params.inc.php

@@ -54,6 +54,14 @@ if (!defined('BX_DOL_MODULE_TYPE_MODULE')) {
     define('BX_DOL_MODULE_TYPE_TEMPLATE', 'template');
 }
 
+define('BX_DOL_MODULE_SUBTYPE_PROFILE', 1);
+define('BX_DOL_MODULE_SUBTYPE_CONTEXT', 2);
+define('BX_DOL_MODULE_SUBTYPE_TEXT', 3);
+define('BX_DOL_MODULE_SUBTYPE_FILE', 4);
+define('BX_DOL_MODULE_SUBTYPE_PAYMENT', 5);
+define('BX_DOL_MODULE_SUBTYPE_NOTIFICATION', 6);
+define('BX_DOL_MODULE_SUBTYPE_CONNECT', 7);
+
 //--- Payment settings ---//
 define('BX_PAYMENT_TYPE_SINGLE', 'single');
 define('BX_PAYMENT_TYPE_RECURRING', 'recurring');

+ 1 - 0
install/sql/system.sql

@@ -1536,6 +1536,7 @@ INSERT INTO `sys_objects_score` (`name`, `module`, `table_main`, `table_track`,
 CREATE TABLE `sys_modules` (
   `id` int(11) unsigned NOT NULL auto_increment,
   `type` varchar(16) NOT NULL default 'module',
+  `subtypes` int(11) unsigned NOT NULL default '0',
   `name` varchar(32) NOT NULL default '',
   `title` varchar(255) NOT NULL default '',
   `vendor` varchar(64) NOT NULL default '',

+ 20 - 0
modules/base/files/classes/BxBaseModFilesModule.php

@@ -0,0 +1,20 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    BaseFile Base classes for modules
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+class BxBaseModFilesModule extends BxBaseModTextModule
+{
+    public function __construct(&$oConfig)
+    {
+        parent::__construct($oConfig);
+    }
+}
+
+/** @} */

+ 1 - 15
modules/boonex/files/classes/BxFilesModule.php

@@ -12,7 +12,7 @@
 /**
  * Files module
  */
-class BxFilesModule extends BxBaseModTextModule
+class BxFilesModule extends BxBaseModFilesModule
 {
     function __construct(&$aModule)
     {
@@ -615,20 +615,6 @@ class BxFilesModule extends BxBaseModTextModule
 
         return parent::serviceBrowseContext($iProfileId, $aParams);
     }
-
-    public function serviceGetSearchResultExtended($aParams, $iStart = 0, $iPerPage = 0, $bFilterMode = false)
-    {
-        if((empty($aParams) || !is_array($aParams)) && !$bFilterMode)
-            return array();
-
-        $aParams['type'] = [
-            'type' => 'text',
-            'value' => 'file',
-            'operator' => '=',
-        ];
-
-        return $this->_oDb->getEntriesBy(array('type' => 'search_ids', 'search_params' => $aParams, 'start' => $iStart, 'per_page' => $iPerPage));
-    }
 }
 
 /** @} */

+ 6 - 1
modules/boonex/persons/classes/BxPersonsModule.php

@@ -69,7 +69,12 @@ class BxPersonsModule extends BxBaseModProfileModule
         
         return false;
     }
-    
+
+    public function getSubtypes()
+    {
+        return pow(2, BX_DOL_MODULE_SUBTYPE_PROFILE);
+    }
+
     public function getProfileName ($aContentInfo)
     {
         return bx_process_output($aContentInfo[$this->_oConfig->CNF['FIELD_NAME']] . ($aContentInfo[$this->_oConfig->CNF['FIELD_LAST_NAME']] != '' ? ' ' . $aContentInfo[$this->_oConfig->CNF['FIELD_LAST_NAME']] : ''));

+ 1 - 1
modules/boonex/photos/classes/BxPhotosModule.php

@@ -12,7 +12,7 @@
 /**
  * Photos module
  */
-class BxPhotosModule extends BxBaseModTextModule
+class BxPhotosModule extends BxBaseModFilesModule
 {
     function __construct(&$aModule)
     {

+ 3 - 3
modules/boonex/photos/install/config.php

@@ -18,12 +18,12 @@ $aConfig = array(
     'name' => 'bx_photos',
     'title' => 'Photos',
     'note' => 'Basic photo posting module.',
-    'version' => '13.0.8.DEV',
-    'vendor' => 'BoonEx',
+    'version' => '14.0.0.DEV',
+    'vendor' => 'UNA INC',
     'help_url' => 'http://feed.una.io/?section={module_name}',
 
     'compatible_with' => array(
-        '13.0.x'
+        '14.0.x'
     ),
 
     /**

+ 1 - 1
modules/boonex/videos/classes/BxVideosModule.php

@@ -12,7 +12,7 @@
 /**
  * Videos module
  */
-class BxVideosModule extends BxBaseModTextModule
+class BxVideosModule extends BxBaseModFilesModule
 {
     function __construct(&$aModule)
     {

+ 3 - 3
modules/boonex/videos/install/config.php

@@ -18,12 +18,12 @@ $aConfig = array(
     'name' => 'bx_videos',
     'title' => 'Videos',
     'note' => 'Basic video posting module.',
-    'version' => '13.0.7.DEV',
-    'vendor' => 'BoonEx',
+    'version' => '14.0.0.DEV',
+    'vendor' => 'UNA INC',
     'help_url' => 'http://feed.una.io/?section={module_name}',
 
     'compatible_with' => array(
-        '13.0.x'
+        '14.0.x'
     ),
 
     /**

+ 9 - 6
studio/classes/BxDolStudioInstaller.php

@@ -218,6 +218,9 @@ class BxDolStudioInstaller extends BxDolInstallerUtils
         if($aResult['result']) {
             $iModuleId = $this->oDb->insertModule($this->_aConfig);
 
+            if(($iModuleSubtypes = $this->getSubtypes($this->_aConfig['name'])) != 0)
+                $this->oDb->updateModule(['subtypes' => $iModuleSubtypes], ['id' => $iModuleId]);
+
             $sTitleKey = BxDolModule::getTitleKey($this->_aConfig['home_uri']);
 
             $oLanguages = BxDolStudioLanguagesUtils::getInstance();
@@ -240,18 +243,18 @@ class BxDolStudioInstaller extends BxDolInstallerUtils
             	$this->_perform('install_success', $aParams);
         }
     	else {
-        	if(!empty($this->_aConfig['install_failed']))
+            if(!empty($this->_aConfig['install_failed']))
             	$this->_perform('install_failed', $aParams);
         }
 
         bx_alert('system', 'install', 0, false, array ('config' => $this->_aConfig, 'result' => &$aResult));
 
-	    if($aResult['result'] && $bAutoEnable) {
-			$aResultEnable = $this->enable($aParams);
+        if($aResult['result'] && $bAutoEnable) {
+            $aResultEnable = $this->enable($aParams);
 
-			$aResult['result'] = $aResult['result'] & $aResultEnable['result'];
-			$aResult['message'] = $aResult['message'] . $aResultEnable['message'];
-		}
+            $aResult['result'] = $aResult['result'] & $aResultEnable['result'];
+            $aResult['message'] = $aResult['message'] . $aResultEnable['message'];
+        }
 
         return $aResult;
     }

+ 77 - 21
template/scripts/BxBaseServices.php

@@ -451,9 +451,17 @@ class BxBaseServices extends BxDol implements iBxDolProfileService
      */
     public function serviceIsModuleContent($mixedModule)
     {
-        if(is_string($mixedModule))
-            $mixedModule = BxDolModule::getInstance($mixedModule);
+        /*
+         * TODO: Update after UNA 14.0.0-A2 was released.
+         *  Check for 'subtypes' should be removed. Use only DB call, because it's more accurate.
+         */
+        if(is_string($mixedModule)) {
+            $oModuleQuery = BxDolModuleQuery::getInstance();
+            if($oModuleQuery->isFieldExists('sys_modules', 'subtypes'))
+                return $oModuleQuery->isModuleContent($mixedModule);
 
+            $mixedModule = BxDolModule::getInstance($mixedModule);
+        }
 
         return
             $mixedModule instanceof BxDolModule &&
@@ -471,8 +479,17 @@ class BxBaseServices extends BxDol implements iBxDolProfileService
      */
     public function serviceIsModuleContext($mixedModule)
     {
-        if(is_string($mixedModule))
+        /*
+         * TODO: Update after UNA 14.0.0-A2 was released.
+         *  Check for 'subtypes' should be removed. Use only DB call, because it's more accurate.
+         */
+        if(is_string($mixedModule)) {
+            $oModuleQuery = BxDolModuleQuery::getInstance();
+            if($oModuleQuery->isFieldExists('sys_modules', 'subtypes'))
+                return $oModuleQuery->isModuleContext($mixedModule);
+
             $mixedModule = BxDolModule::getInstance($mixedModule);
+        }
 
         return $mixedModule instanceof BxDolModule && $mixedModule instanceof iBxDolProfileService;
     }
@@ -485,8 +502,17 @@ class BxBaseServices extends BxDol implements iBxDolProfileService
      */
     public function serviceIsModuleProfile($mixedModule)
     {
-        if(is_string($mixedModule))
+        /*
+         * TODO: Update after UNA 14.0.0-A2 was released.
+         *  Check for 'subtypes' should be removed. Use only DB call, because it's more accurate.
+         */
+        if(is_string($mixedModule)) {
+            $oModuleQuery = BxDolModuleQuery::getInstance();
+            if($oModuleQuery->isFieldExists('sys_modules', 'subtypes'))
+                return $oModuleQuery->isModuleProfile($mixedModule);
+
             $mixedModule = BxDolModule::getInstance($mixedModule);
+        }
 
         return $mixedModule instanceof BxDolModule && $mixedModule instanceof iBxDolProfileService && $mixedModule->serviceActAsProfile();
     }
@@ -504,27 +530,57 @@ class BxBaseServices extends BxDol implements iBxDolProfileService
         $bIdAsKey = isset($aParams['id_as_key']) && $aParams['id_as_key'] === true;
         $bNameAsKey = !$bIdAsKey && isset($aParams['name_as_key']) && $aParams['name_as_key'] === true;
 
-        $aModules = BxDolModuleQuery::getInstance()->getModulesBy(['type' => 'modules', 'active' => 1]);
-        foreach($aModules as $aModule) {
-            $oModule = BxDolModule::getInstance($aModule['name']);
-            if(!$oModule)
-                continue;
+        //TODO: Remove old variant (from ELSE) after UNA 14.0.0-A2 was released.
+        $oModuleQuery = BxDolModuleQuery::getInstance();
+        if($oModuleQuery->isFieldExists('sys_modules', 'subtypes')) {
+            $iSubtypes = 0;
+            switch($sType) {
+                case 'content';
+                    $iSubtypes = BX_DOL_MODULE_SUBTYPE_TEXT;
+                    break;
+
+                case 'context';
+                    $iSubtypes = BX_DOL_MODULE_SUBTYPE_CONTEXT;
+                    break;
+
+                case 'profile';
+                    $iSubtypes = BX_DOL_MODULE_SUBTYPE_PROFILE;
+                    break;
+            }
 
-            if($sType == 'content' && !$this->serviceIsModuleContent($oModule))
-                continue;
+            $aModules = $oModuleQuery->getModulesBy(['type' => 'modules_subtypes', 'value' => $iSubtypes, 'active' => 1]);
+            foreach($aModules as $aModule) {
+                if($bIdAsKey)
+                    $aResults[$aModule['id']] = $aModule;
+                else if($bNameAsKey)
+                    $aResults[$aModule['name']] = $aModule;
+                else
+                    $aResults[] = $aModule;
+            }
+        }
+        else {
+            $aModules = $oModuleQuery->getModulesBy(['type' => 'modules', 'active' => 1]);
+            foreach($aModules as $aModule) {
+                $oModule = BxDolModule::getInstance($aModule['name']);
+                if(!$oModule)
+                    continue;
 
-            if($sType == 'context' && !$this->serviceIsModuleContext($oModule))
-                continue;
+                if($sType == 'content' && !$this->serviceIsModuleContent($oModule))
+                    continue;
 
-            if($sType == 'profile' && !$this->serviceIsModuleProfile($oModule))
-                continue;
+                if($sType == 'context' && !$this->serviceIsModuleContext($oModule))
+                    continue;
 
-            if($bIdAsKey)
-                $aResults[$aModule['id']] = $aModule;
-            else if($bNameAsKey)
-                $aResults[$aModule['name']] = $aModule;
-            else
-                $aResults[] = $aModule;
+                if($sType == 'profile' && !$this->serviceIsModuleProfile($oModule))
+                    continue;
+
+                if($bIdAsKey)
+                    $aResults[$aModule['id']] = $aModule;
+                else if($bNameAsKey)
+                    $aResults[$aModule['name']] = $aModule;
+                else
+                    $aResults[] = $aModule;
+            }
         }
 
         return $aResults;