Ver Fonte

#56 menu triggers

Alex Trofimov há 12 anos atrás
pai
commit
ded92432e3

+ 16 - 1
inc/classes/BxDolDb.php

@@ -757,7 +757,7 @@ EOJ;
             elseif (is_numeric($mixedArg))
                 $s = $mixedArg;
             else
-                $s = "'" . mysql_real_escape_string($mixedArg) . "'";
+                $s = "'" . mysql_real_escape_string($mixedArg, $this->_rLink) . "'";
 
             $i = bx_mb_strpos($sQuery, '?', $iPos);
             $sQuery = bx_mb_substr_replace($sQuery, $s, $i, 1);
@@ -766,6 +766,21 @@ EOJ;
         return $sQuery;
     }
 
+    /**
+     * Convert array of key => values to SQL query.
+     * Array keys are field names and array values are field values.
+     * @param $a array
+     * @param $sDiv fields separator, by default it is ',', another useful value is ' AND '
+     * @return part of SQL query string
+     */
+    function arrayToSQL ($a, $sDiv = ',') 
+    {
+        $s = '';
+        foreach ($a as $k => $v)
+            $s .= "`{$k}` = '" . $this->escape($v) . "'" . $sDiv;
+        return trim($s, $sDiv);
+    }
+
     function log ($s) 
     {
         return file_put_contents(BX_DIRECTORY_PATH_ROOT . 'tmp/db.err.log', date('Y-m-d H:i:s') . "\t" . $s . "\n", FILE_APPEND);

+ 38 - 0
inc/classes/BxDolMenu.php

@@ -163,6 +163,44 @@ class BxDolMenu extends BxDol implements iBxDolFactoryObject, iBxDolReplaceable
         self::$SEL_NAME = $sName;
     }
 
+    /**
+     * Process menu triggers.
+     * Menu triggers allow to automatically add menu items to modules with no different if dependant module was install before or after the module menu item belongs to.
+     * For example module "Notes" adds menu items to all profiles modules (Persons, Organizations, etc) 
+     * with no difference if persons module was installed before or after "Notes" module was installed.
+     * @param $sSetName set name to ad menu item to 
+     * @param $aMenuItem array of menu item descrition, array keys are database fields names, array values are database fields values
+     * @return true on success
+     */
+    static public function processMenuTrigger ($sMenuTriggerName) {
+
+        // get list of active modules
+        bx_import('BxDolModuleQuery');
+        $aModules = BxDolModuleQuery::getInstance()->getModulesBy(array(
+            'type' => 'modules',
+            'active' => 1,
+        ));
+        
+        // get list of menu triggers 
+        $aMenuItem = BxDolMenuQuery::getMenuTriggers($sMenuTriggerName);
+
+        // check each menu item trigger for all modules
+        foreach ($aMenuItem as $aMenuItem) {
+            foreach ($aModules as $aModule) {
+                if (!BxDolRequest::serviceExists($aModule['name'], 'get_menu_set_name_for_menu_trigger'))
+                    continue;
+
+                if (!($sMenuSet = BxDolService::call($aModule['name'], 'get_menu_set_name_for_menu_trigger', array($sMenuTriggerName))))
+                    continue;
+
+                $aMenuItem['set_name'] = $sMenuSet;
+                BxDolMenuQuery::addMenuItemToSet($aMenuItem);
+            }
+        }
+
+        return true;
+    }
+
     /**
      * Set selected menu item for current menu object only.
      * @param $sModule menu item module to set as selected

+ 21 - 0
inc/classes/BxDolMenuQuery.php

@@ -31,6 +31,27 @@ class BxDolMenuQuery extends BxDolDb {
         return $aObject;
     }
 
+    static public function getMenuTriggers($sTriggerName) {
+        $oDb = BxDolDb::getInstance();
+        $sQuery = $oDb->prepare("SELECT * FROM `sys_menu_items` WHERE `set_name` = ? ORDER BY `order` DESC", $sTriggerName);
+        return $oDb->getAll($sQuery);
+    }
+
+    static public function addMenuItemToSet($aMenuItem) {
+        $oDb = BxDolDb::getInstance();
+        
+        if (empty($aMenuItem['set_name']))
+            return false;
+
+        if (empty($aMenuItem['order'])) {
+            $sQuery = $oDb->prepare("SELECT `order` FROM `sys_menu_items` WHERE `set_name` = ? AND `active` = 1 ORDER BY `order` DESC LIMIT 1", $aMenuItem['set_name']);
+            $iProfileMenuOrder = (int)$oDb->getOne($sQuery);
+            $aMenuItem['order'] = $iProfileMenuOrder + 1;
+        }
+
+        unset($aMenuItem['id']);
+        return $oDb->query("INSERT INTO `sys_menu_items` SET " . $oDb->arrayToSQL($aMenuItem));
+    }
 
     public function getMenuItems() {
         $sQuery = $this->prepare("SELECT * FROM `sys_menu_items` WHERE `set_name` = ? ORDER BY `order` ASC", $this->_aObject['set_name']);

+ 29 - 18
modules/base/general/classes/BxBaseModGeneralInstaller.php

@@ -17,11 +17,15 @@ bx_import('BxDolService');
 class BxBaseModGeneralInstaller extends BxDolStudioInstaller 
 {
     protected $_aStorages = array (); // storage objects to automatically delete files from upon module uninstallation, don't add storage objects used in image transcoder objects
+
     protected $_aTranscoders = array (); // image transcoder objects to automatically register/unregister necessary alerts for
+
     protected $_aConnections = array (); // connections objects associated with module data, it must be defined which content is associated with the connection, the key is connection object name and value is array (possible array values: type, conn, table, field_id), if 'type' == 'profiles', then it is considered profiles connection and other possible param is 'conn' ('initiator', 'content' or 'both') when 'type' == 'custom' (or ommited), then other possible params are 'conn', 'table' and 'field_id' 
 
     protected $_bUpdateTimeline = false; // set to true to automatically register handlers for timeline module
 
+    protected $_aMenuTriggers = array(); // list of menu triggers, it must be specified in the module which adds menu item and in modules where menu items are added, @see BxDolMenu::processMenuTrigger
+
     function __construct($aConfig) 
     {
         parent::__construct($aConfig);
@@ -39,6 +43,12 @@ class BxBaseModGeneralInstaller extends BxDolStudioInstaller
         if ($this->_bUpdateTimeline && BxDolRequest::serviceExists('timeline', 'add_handlers'))
             BxDolService::call('timeline', 'add_handlers', array($this->_aConfig['home_uri']));
 
+        if ($this->_aMenuTriggers) {
+            bx_import('BxDolMenu');
+            foreach ($this->_aMenuTriggers as $sMenuTriggerName)
+                BxDolMenu::processMenuTrigger($sMenuTriggerName);
+        }
+
         return $aResult;
     }
 
@@ -97,25 +107,26 @@ class BxBaseModGeneralInstaller extends BxDolStudioInstaller
         }
                 
         // delete associated connections
-        if ($this->_aConnections)
+        if ($this->_aConnections) {
             bx_import('BxDolConnection');
-        foreach ($this->_aConnections as $sObjectConnections => $a) {
-            $o = BxDolConnection::getObjectInstance($sObjectConnections);
-            if (!$o)
-                continue;
-
-            $sFuncSuffix = 'DeleteInitiatorAndContent';
-            if (isset($a['conn']) && 'initiator' == $a['conn'])
-                $sFuncSuffix = 'DeleteInitiator';
-            elseif (isset($a['conn']) && 'content' == $a['conn'])
-                $sFuncSuffix = 'DeleteContent';
-
-            if (isset($a['type']) && 'profiles' == $a['type']) {
-                $sFunc = 'onModuleProfile' . $sFuncSuffix;
-                $o->$sFunc($this->_aConfig['name']);
-            } else {
-                $sFunc = 'onModule' . $sFuncSuffix;
-                $o->$sFunc($a['table'], $a['field_id']);
+            foreach ($this->_aConnections as $sObjectConnections => $a) {
+                $o = BxDolConnection::getObjectInstance($sObjectConnections);
+                if (!$o)
+                    continue;
+
+                $sFuncSuffix = 'DeleteInitiatorAndContent';
+                if (isset($a['conn']) && 'initiator' == $a['conn'])
+                    $sFuncSuffix = 'DeleteInitiator';
+                elseif (isset($a['conn']) && 'content' == $a['conn'])
+                    $sFuncSuffix = 'DeleteContent';
+
+                if (isset($a['type']) && 'profiles' == $a['type']) {
+                    $sFunc = 'onModuleProfile' . $sFuncSuffix;
+                    $o->$sFunc($this->_aConfig['name']);
+                } else {
+                    $sFunc = 'onModule' . $sFuncSuffix;
+                    $o->$sFunc($a['table'], $a['field_id']);
+                }
             }
         }
 

+ 7 - 0
modules/base/profile/classes/BxBaseModProfileModule.php

@@ -27,6 +27,13 @@ class BxBaseModProfileModule extends BxBaseModGeneralModule implements iBxDolPro
 
     // ====== SERVICE METHODS
 
+    public function serviceGetMenuSetNameForMenuTrigger ($sMenuTriggerName)
+    {
+        if ('trigger_profile_view_submenu' == $sMenuTriggerName)
+            return $this->_oConfig->CNF['OBJECT_MENU_SUBMENU_VIEW_ENTRY'];
+        return '';
+    }
+
     public function serviceProfilesSearch ($sTerm, $iLimit) 
     {
         $aRet = array();

+ 1 - 0
modules/boonex/notes/install/installer.php

@@ -18,6 +18,7 @@ class BxNotesInstaller extends BxBaseModTextInstaller
         parent::__construct($aConfig);
         $this->_aTranscoders = array ('bx_notes_preview');
         $this->_aStorages = array ('bx_notes_files');
+        $this->_aMenuTriggers = array ('trigger_profile_view_submenu');
     }
 }
 

+ 2 - 3
modules/boonex/notes/install/sql/enable.sql

@@ -157,11 +157,10 @@ INSERT INTO `sys_menu_items`(`set_name`, `module`, `name`, `title_system`, `titl
 ('bx_notes_view_submenu', 'bx_notes', 'view-note-comments', '_bx_notes_menu_item_title_system_view_entry_comments', '_bx_notes_menu_item_title_view_entry_submenu_comments', 'page.php?i=view-note-comments&id={content_id}', '', '', '', '', 2147483647, 1, 0, 2);
 
 
--- MENU: add to persons menu
+-- MENU: add menu item to profiles modules (trigger* menu sets are processed separately upon modules enable/disable)
 
-SET @iProfileMenuOrder = (SELECT `order` FROM `sys_menu_items` WHERE `set_name` = 'bx_persons_view_submenu' AND `active` = 1 ORDER BY `order` DESC LIMIT 1);
 INSERT INTO `sys_menu_items`(`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `submenu_object`, `visible_for_levels`, `active`, `copyable`, `order`) VALUES 
-('bx_persons_view_submenu', 'bx_notes', 'notes-author', '_bx_notes_menu_item_title_system_view_entries_author', '_bx_notes_menu_item_title_view_entries_author', 'page.php?i=notes-author&profile_id={profile_id}', '', '', '', '', 2147483647, 1, 0, IFNULL(@iProfileMenuOrder, 0) + 1);
+('trigger_profile_view_submenu', 'bx_notes', 'notes-author', '_bx_notes_menu_item_title_system_view_entries_author', '_bx_notes_menu_item_title_view_entries_author', 'page.php?i=notes-author&profile_id={profile_id}', '', '', '', '', 2147483647, 1, 0, 0);
 
 
 -- PRIVACY 

+ 1 - 0
modules/boonex/organizations/install/installer.php

@@ -22,6 +22,7 @@ class BxOrgsInstaller extends BxBaseModProfileInstaller
             'sys_profiles_friends' => array ('type' => 'profiles'),
             'sys_profiles_subscriptions' => array ('type' => 'profiles'),
         );
+        $this->_aMenuTriggers = array ('trigger_profile_view_submenu');
     }
 }
 

+ 1 - 0
modules/boonex/persons/install/installer.php

@@ -22,6 +22,7 @@ class BxPersonsInstaller extends BxBaseModProfileInstaller
             'sys_profiles_friends' => array ('type' => 'profiles'),
             'sys_profiles_subscriptions' => array ('type' => 'profiles'),
         );
+        $this->_aMenuTriggers = array ('trigger_profile_view_submenu');
     }
 }
 

+ 18 - 0
studio/classes/BxDolStudioInstaller.php

@@ -165,6 +165,13 @@ class BxDolStudioInstaller extends BxDolInstallerUtils {
                 'result' => false
             );
 
+        $sAction = $bEnable ? 'enable' : 'install';
+
+        $aResult = array();
+        bx_alert('system', 'before_' . $sAction, 0, false, array ('config' => $this->_aConfig, 'result' => &$aResult));
+        if ($aResult && !$aResult['result'])
+            return $aResult;
+
         //--- Check mandatory settings ---//
         if($this->oDb->isModuleParamsUsed($this->_aConfig['home_uri'], $this->_aConfig['home_dir'], $this->_aConfig['db_prefix'], $this->_aConfig['class_prefix']))
     		return array(
@@ -244,10 +251,12 @@ class BxDolStudioInstaller extends BxDolInstallerUtils {
             $aResult['message'] = $aResult['message'] . $aResultEnable['message'];
         }
 
+        bx_alert('system', $sAction, 0, false, array ('config' => $this->_aConfig, 'result' => &$aResult));
         return $aResult;
     }
 
     public function uninstall($aParams, $bDisable = false) {
+
         //--- Check whether the module was already uninstalled ---//
         if(!$this->oDb->isModule($this->_aConfig['home_uri']))
             return array(
@@ -255,6 +264,13 @@ class BxDolStudioInstaller extends BxDolInstallerUtils {
                 'result' => false
             );
 
+        $sAction = $bDisable ? 'disable' : 'uninstall';
+
+        $aResult = array();
+        bx_alert('system', 'before_' . $sAction, 0, false, array ('config' => $this->_aConfig, 'result' => &$aResult));
+        if ($aResult && !$aResult['result'])
+            return $aResult;
+
         //--- Check for dependent modules ---//
         $bDependent = false;
         $aDependents = $this->oDb->getDependent($this->_aConfig['home_uri']);
@@ -289,6 +305,7 @@ class BxDolStudioInstaller extends BxDolInstallerUtils {
             $this->oDb->cleanMemory ('sys_modules');
         }
 
+        
         if($bDisable) {
             $aResultEnable = $this->disable($aParams);
 
@@ -296,6 +313,7 @@ class BxDolStudioInstaller extends BxDolInstallerUtils {
             $aResult['message'] = $aResult['message'] . $aResultEnable['message'];
         }
 
+        bx_alert('system', $sAction, 0, false, array ('config' => $this->_aConfig, 'result' => &$aResult));
         return $aResult;
     }