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

Ticket #3724 - Add mutual friends counter in profile snippet meta menu: Core changes.

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

+ 12 - 0
inc/classes/BxDolConnection.php

@@ -367,6 +367,18 @@ class BxDolConnection extends BxDolFactory implements iBxDolFactoryObject
     {
         return $this->_oQuery->getCommonContent($iInitiator1, $iInitiator2, $isMutual, $iStart, $iLimit, $iOrder);
     }
+    
+    /**
+     * Get common content count between two initiators
+     * @param $iInitiator1 one initiator
+     * @param $iInitiator2 second initiator
+     * @param $isMutual get mutual connections only
+     * @return number of connections
+     */
+    public function getCommonContentCount ($iInitiator1, $iInitiator2, $isMutual = false)
+    {
+        return $this->_oQuery->getCommonContentCount($iInitiator1, $iInitiator2, $isMutual);
+    }
 
     /**
      * Get connected content count

+ 30 - 9
inc/classes/BxDolConnectionQuery.php

@@ -214,7 +214,7 @@ class BxDolConnectionQuery extends BxDolDb
 
     protected function _getConnectionsQuery ($sWhere, $sJoin = '', $sFields = '*', $isMutual = false, $iStart = 0, $iLimit = BX_CONNECTIONS_LIST_LIMIT, $iOrder = BX_CONNECTIONS_ORDER_NONE)
     {
-        $sOrder = $this->_getOrderClause($iOrder);
+        $sOrder = $this->_getOrderClause($iOrder, '`c`');
 
         $sWhere .= (false !== $isMutual) ? $this->prepareAsString(" AND `c`.`mutual` = ?", $isMutual) : '';
 
@@ -225,6 +225,25 @@ class BxDolConnectionQuery extends BxDolDb
         return "SELECT $sFields FROM `" . $this->_sTable . "` AS `c` $sJoin WHERE 1 $sWhere $sOrder $sLimit";
     }
 
+    public function getCommonContentCount($iInitiator1, $iInitiator2, $isMutual)
+    {
+        $sWhereJoin = "";
+        if($isMutual !== false)
+            $sWhereJoin = " AND `c2`.`mutual` = :mutual";
+
+        $sJoin = "INNER JOIN `" . $this->_sTable . "` AS `c2` ON (`c2`.`initiator` = :initiator2 AND `c`.`content` = `c2`.`content` $sWhereJoin)";
+        if($this->_aObject['profile_content'])
+            $sJoin .= "INNER JOIN `sys_profiles` AS `p1` ON (`p1`.`id` = `c`.`content` AND `p1`.`status` = 'active') INNER JOIN `sys_profiles` AS `p2` ON (`p2`.`id` = `c2`.`content` AND `p2`.`status` = 'active')";
+
+        $sWhere = " AND `c`.`initiator` = :initiator1";
+
+        return $this->getOne($this->_getConnectionsQueryCount($sWhere, $sJoin, $isMutual, '`c`.`content`'), [
+            'mutual' => $isMutual,
+            'initiator1' => $iInitiator1,
+            'initiator2' => $iInitiator2,  
+    	]);
+    }
+
     public function getConnectedContentCount ($iInitiator, $isMutual = false)
     {
         $sWhere = $this->prepareAsString(" AND `c`.`initiator` = ?", $iInitiator);
@@ -239,25 +258,27 @@ class BxDolConnectionQuery extends BxDolDb
         return $this->getOne($sQuery);
     }
 
-    protected function _getConnectionsQueryCount ($sWhere, $sJoin = '', $isMutual = false)
+    protected function _getConnectionsQueryCount ($sWhere, $sJoin = '', $isMutual = false, $sFields = '`id`')
     {
         $sWhere .= (false !== $isMutual) ? $this->prepareAsString(" AND `c`.`mutual` = ?", $isMutual) : '';
-        return "SELECT COUNT(`id`) FROM `" . $this->_sTable . "` AS `c` $sJoin WHERE 1 $sWhere";
+        return "SELECT COUNT(" . $sFields . ") FROM `" . $this->_sTable . "` AS `c` $sJoin WHERE 1 $sWhere";
     }
 
     protected function _getOrderClause ($iOrder = BX_CONNECTIONS_ORDER_NONE, $sTable = '')
     {
         if ($sTable)
             $sTable .= '.';
+
         $sOrder = '';
         switch ($iOrder) {
-        case BX_CONNECTIONS_ORDER_ADDED_ASC:
-            $sOrder = "ORDER BY {$sTable}`added` ASC";
-            break;
-        case BX_CONNECTIONS_ORDER_ADDED_DESC:
-            $sOrder = "ORDER BY {$sTable}`added` DESC";
-            break;
+            case BX_CONNECTIONS_ORDER_ADDED_ASC:
+                $sOrder = "ORDER BY {$sTable}`added` ASC";
+                break;
+            case BX_CONNECTIONS_ORDER_ADDED_DESC:
+                $sOrder = "ORDER BY {$sTable}`added` DESC";
+                break;
         }
+
         return $sOrder;
     }
 

+ 18 - 0
modules/base/profile/classes/BxBaseModProfileMenuSnippetMeta.php

@@ -97,6 +97,24 @@ class BxBaseModProfileMenuSnippetMeta extends BxBaseModGeneralMenuSnippetMeta
         return $this->getUnitMetaItemText(_t('_sys_menu_item_title_sm_friends', $iFriends));
     }
 
+    protected function _getMenuItemFriendsMutual($aItem)
+    {
+        $CNF = &$this->_oModule->_oConfig->CNF;
+
+        if(!$this->_bContentPublic || !$this->_oContentProfile)
+            return false;
+
+        $oConnection = BxDolConnection::getObjectInstance('sys_profiles_friends');
+        if(!$oConnection)
+            return false;
+
+        $iFriends = $oConnection->getCommonContentCount($this->_oContentProfile->id(), bx_get_logged_profile_id(), true);
+        if(!$iFriends && !$this->_bShowZeros)
+            return false;
+
+        return $this->getUnitMetaItemText(_t('_sys_menu_item_title_sm_friends_mutual', $iFriends));
+    }
+
     protected function _getMenuItemSubscribers($aItem)
     {
         $CNF = &$this->_oModule->_oConfig->CNF;

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

@@ -982,6 +982,23 @@ class BxBaseModProfileModule extends BxBaseModGeneralModule implements iBxDolCon
         $s = $this->serviceBrowseConnectionsQuick ($aContentInfo['profile_id'], 'sys_profiles_friends', BX_CONNECTIONS_CONTENT_TYPE_CONTENT, true);
         if (!$s)
             return MsgBox(_t('_sys_txt_empty'));
+
+        return $s;
+    }
+
+    public function serviceProfileFriendsMutual ($iContentId = 0)
+    {
+        $mixedContent = $this->_getContent($iContentId);
+        if($mixedContent === false)
+            return false;
+
+        list($iContentId, $aContentInfo) = $mixedContent;
+
+        bx_import('BxDolConnection');
+        $s = $this->serviceBrowseConnectionsQuick ($aContentInfo['profile_id'], 'sys_profiles_friends', BX_CONNECTIONS_CONTENT_TYPE_COMMON, true, bx_get_logged_profile_id());
+        if (!$s)
+            return MsgBox(_t('_sys_txt_empty'));
+
         return $s;
     }
 

+ 2 - 0
modules/boonex/english/data/langs/system/en.xml

@@ -2835,6 +2835,7 @@ If it is not enabled then please consider implement this optimization, since it
     <string name="_sys_menu_item_title_sm_subscribe"><![CDATA[Follow]]></string>
     <string name="_sys_menu_item_title_sm_unsubscribe"><![CDATA[Unfollow]]></string>
     <string name="_sys_menu_item_title_sm_friends"><![CDATA[{0} friends]]></string>
+    <string name="_sys_menu_item_title_sm_friends_mutual"><![CDATA[{0} mutual friends]]></string>
     <string name="_sys_menu_item_title_sm_members"><![CDATA[{0} members]]></string>
     <string name="_sys_menu_item_title_sm_membership"><![CDATA[Membership]]></string>
     <string name="_sys_menu_item_title_sm_subscribers"><![CDATA[{0} followers]]></string>
@@ -2944,6 +2945,7 @@ If it is not enabled then please consider implement this optimization, since it
     <string name="_sys_menu_item_title_system_sm_nl"><![CDATA[New Line]]></string>
     <string name="_sys_menu_item_title_system_sm_subscribe"><![CDATA[Follow]]></string>
     <string name="_sys_menu_item_title_system_sm_friends"><![CDATA[Friends]]></string>
+    <string name="_sys_menu_item_title_system_sm_friends_mutual"><![CDATA[Mutual Friends]]></string>
     <string name="_sys_menu_item_title_system_sm_members"><![CDATA[Members]]></string>
     <string name="_sys_menu_item_title_system_sm_membership"><![CDATA[Membership]]></string>
     <string name="_sys_menu_item_title_system_sm_subscribers"><![CDATA[Followers]]></string>

+ 2 - 0
modules/boonex/russian/data/langs/system/ru.xml

@@ -2815,6 +2815,7 @@
     <string name="_sys_menu_item_title_sm_subscribe"><![CDATA[Получать уведомления]]></string>
     <string name="_sys_menu_item_title_sm_unsubscribe"><![CDATA[Отключить уведомления]]></string>
     <string name="_sys_menu_item_title_sm_friends"><![CDATA[Друзья: {0}]]></string>
+    <string name="_sys_menu_item_title_sm_friends_mutual"><![CDATA[Общие друзья: {0}]]></string>
     <string name="_sys_menu_item_title_sm_members"><![CDATA[Участники: {0}]]></string>
     <string name="_sys_menu_item_title_sm_subscribers"><![CDATA[Подписчики: {0}]]></string>
     <string name="_sys_menu_item_title_sm_country"><![CDATA[Страна]]></string>
@@ -2922,6 +2923,7 @@
     <string name="_sys_menu_item_title_system_sm_country"><![CDATA[Страна]]></string>
     <string name="_sys_menu_item_title_system_sm_country_city"><![CDATA[Страна и город]]></string>
     <string name="_sys_menu_item_title_system_sm_friends"><![CDATA[Друзья]]></string>
+    <string name="_sys_menu_item_title_system_sm_friends_mutual"><![CDATA[Общие друзья]]></string>
     <string name="_sys_menu_item_title_system_sm_members"><![CDATA[Участники]]></string>
     <string name="_sys_menu_item_title_system_sm_membership"><![CDATA[Членство]]></string>
     <string name="_sys_menu_item_title_system_sm_subscribers"><![CDATA[Подписки]]></string>