Przeglądaj źródła

Ticket #5019 - Contexts: Improve invite/join. Invitations list.

AntonLV 1 rok temu
rodzic
commit
e6405ec045

+ 56 - 16
modules/base/groups/classes/BxBaseModGroupsDb.php

@@ -406,31 +406,71 @@ class BxBaseModGroupsDb extends BxBaseModProfileDb
         $this->query("INSERT `" . $CNF["TABLE_INVITES"] . "` (`key`, `group_profile_id`, `author_profile_id`, `invited_profile_id`, `added`) VALUES (:key, :group_profile_id, :author_profile_id, :invited_profile_id, :added)", $aBindings);
         return (int)$this->lastId();
     }
-    
-    public function getInviteByKey($sKey, $iGroupProfileId)
+
+    public function getInvites($aParams = [])
     {
         $CNF = &$this->_oConfig->CNF;
 
-        return $this->getRow("SELECT * FROM `" . $CNF["TABLE_INVITES"] . "` WHERE `key` = :key AND group_profile_id = :group_profile_id", [
-            'key' => $sKey,
-            'group_profile_id' => $iGroupProfileId
-        ]);
-    }
+    	$aMethod = ['name' => 'getAll', 'params' => [0 => 'query']];
+
+        $sSelectClause = "`ti`.*";
+        $sJoinClause = $sWhereClause = $sOrderClause = $sLimitClause = "";
+        switch($aParams['sample']) {
+            case 'key_and_context_pid':
+                $aMethod['name'] = 'getRow';
+                $aMethod['params'][1] = [
+                    'key' => $aParams['key'],
+                    'context_pid' => $aParams['context_pid']
+                ];
+
+                $sWhereClause = " AND `ti`.`key`=:key AND `ti`.`group_profile_id`=:context_pid";
+                break;
+            
+            case 'invited_pid_and_context_pid':
+                $aMethod['name'] = 'getRow';
+                $aMethod['params'][1] = [
+                    'invited_pid' => $aParams['invited_pid'],
+                    'context_pid' => $aParams['context_pid']
+                ];
+
+                $sWhereClause = " AND `ti`.`invited_profile_id`=:invited_pid AND `ti`.`group_profile_id`=:context_pid";
+                break;
 
-    public function getInviteByInvited($iInvitedProfileId, $iGroupProfileId)
+            case 'invited_pid':
+                $aMethod['name'] = 'getAllWithKey';
+                $aMethod['params'][1] = 'group_profile_id';
+                $aMethod['params'][2] = [
+                    'invited_pid' => $aParams['invited_pid'],
+                ];
+
+                $sWhereClause = " AND `ti`.`invited_profile_id`=:invited_pid";
+                break;
+        }
+
+        if(!empty($sOrderClause))
+            $sOrderClause = 'ORDER BY ' . $sOrderClause;
+
+        if(!empty($sLimitClause))
+            $sLimitClause = 'LIMIT ' . $sLimitClause;
+
+        $aMethod['params'][0] = "SELECT " . $sSelectClause . " FROM `" . $CNF["TABLE_INVITES"] . "` AS `ti` " . $sJoinClause . " WHERE 1" . $sWhereClause . " " . $sOrderClause . " " . $sLimitClause;
+
+        return call_user_func_array([$this, $aMethod['name']], $aMethod['params']);
+    }
+    
+    public function getInviteByKey($sKey, $iContextPid)
     {
-        $CNF = &$this->_oConfig->CNF; 
+        return $this->getInvites(['sample' => 'key_and_context_pid', 'key' => $sKey, 'context_pid' => $iContextPid]);
+    }
 
-        return $this->getRow("SELECT * FROM `" . $CNF["TABLE_INVITES"] . "` WHERE `invited_profile_id` = :invited_profile_id AND group_profile_id = :group_profile_id", [
-            'invited_profile_id' => $iInvitedProfileId,
-            'group_profile_id' => $iGroupProfileId
-        ]);
+    public function getInviteByInvited($iInvitedPid, $iContextPid)
+    {
+        return $this->getInvites(['sample' => 'invited_pid_and_context_pid', 'invited_pid' => $iInvitedPid, 'context_pid' => $iContextPid]);
     }
 
-    public function isInviteByInvited($iInvitedProfileId, $iGroupProfileId)
+    public function isInviteByInvited($iInvitedPid, $iContextPid)
     {
-        $aInvite = $this->getInviteByInvited($iInvitedProfileId, $iGroupProfileId);
-        return !empty($aInvite) && is_array($aInvite);
+        return ($aInvite = $this->getInviteByInvited($iInvitedPid, $iContextPid)) && is_array($aInvite);
     }
 
     public function updateInviteByKey($sKey, $iGroupProfileId, $sColumn, $sValue)

+ 47 - 0
modules/base/groups/classes/BxBaseModGroupsModule.php

@@ -236,6 +236,7 @@ class BxBaseModGroupsModule extends BxBaseModProfileModule
             'GetQuestionnaire' => '',
             'GetInitialMembers' => '',
             'EntityInvite' => '',
+            'Invitations' => '',
             'FansWithoutAdmins' => '',
         ]);
     }
@@ -714,6 +715,52 @@ class BxBaseModGroupsModule extends BxBaseModProfileModule
         return $oGrid->getCode();
     }
 
+    public function serviceInvitations ($iInvitedPid = 0, $bAsArray = false)
+    {
+        $CNF = &$this->_oConfig->CNF;
+
+        if(!$iInvitedPid)
+            $iInvitedPid = bx_process_input(bx_get('profile_id'), BX_DATA_INT);
+        if(!$iInvitedPid)
+            return false;
+
+        $aInvites = $this->_oDb->getInvites(['sample' => 'invited_pid', 'invited_pid' => $iInvitedPid]);
+        if($bAsArray)
+            return $aInvites;
+
+        $iStart = $iLimit = 0;
+        if($this->_bIsApi) {
+            $aParams = bx_api_get_browse_params($bAsArray);
+
+            $iStart = isset($aParams['start']) ? (int)$aParams['start'] : 0;
+            $iLimit = isset($aParams['per_page']) ? (int)$aParams['per_page'] : 0;
+        }
+        else {
+            $iStart = (int)bx_get('start');
+            $iLimit = (int)bx_get('per_page');
+        }
+
+        $iLimit = !$iLimit && ($sKey = 'PARAM_NUM_CONNECTIONS_QUICK') && !empty($CNF[$sKey]) && ($iValue = (int)getParam($CNF[$sKey])) ? $iValue : 4;
+
+        if($this->_bIsApi) {
+            $aData = [
+                'data' => [],
+                'request_url' => '/api.php?r=' . $this->_oConfig->getName() . '/invites/&params[]=' . $iInvitedPid . '&params[]=',
+                'params' => [
+                    'start' => $iStart,
+                    'per_page' => $iLimit
+                ]
+            ];
+
+            foreach($aInvites as $aInvite)
+                $aData['data'][] = BxDolProfile::getData($aInvite['group_profile_id']);
+
+            return [bx_api_get_block('profiles_list', $aData)];
+        }
+        else
+            return $this->_serviceBrowseQuick(array_keys($aInvites), $iStart, $iLimit);
+    }
+
     public function serviceFans ($iContentId = 0, $bAsArray = false)
     {
         $CNF = &$this->_oConfig->CNF;

+ 6 - 0
template/scripts/BxBasePage.php

@@ -655,6 +655,11 @@ class BxBasePage extends BxDolPage
                 foreach($aCpIds as $iCpId)
                     $aContexts[] = BxDolProfile::getData($iCpId);
 
+                $aInvitedTo = [];
+                $aInvitations = bx_srv($sContextSwitcher, 'invitations', [$iLogged, true]);
+                foreach($aInvitations as $aInvitation)
+                    $aInvitedTo[] = BxDolProfile::getData($aInvitation['group_profile_id']);
+
                 $aInfo = [];
                 if(($iId = bx_get('id')) !== false) {
                     $aInfo = bx_srv($sModule, 'get_info', [(int)$iId, false]);
@@ -685,6 +690,7 @@ class BxBasePage extends BxDolPage
 
                 $a['context'] = [
                     'list' => $aContexts,
+                    'invitations' => $aInvitedTo,
                     'current' => $aCurrent,
                     'links' => []
                 ];