AntonLV 8 лет назад
Родитель
Сommit
4d1f77bb95

+ 7 - 2
modules/boonex/russian/data/langs/bx_timeline/ru.xml

@@ -70,8 +70,9 @@
 	<string name="_bx_timeline_acl_action_vote"><![CDATA[Голосовать]]></string>
 	<string name="_bx_timeline_acl_action_repost"><![CDATA[Делать репост]]></string>
 	<string name="_bx_timeline_acl_action_send"><![CDATA[Послать]]></string>
-	<string name="_bx_timeline_acl_action_pin"><![CDATA[Прикреплять]]></string>
-	<string name="_bx_timeline_acl_action_promote"><![CDATA[Рекламировать]]></string>
+	<string name="_bx_timeline_acl_action_pin"><![CDATA[Прикреплять любое сообщение]]></string>
+	<string name="_bx_timeline_acl_action_stick"><![CDATA[Приклеивать любое сообщение]]></string>
+	<string name="_bx_timeline_acl_action_promote"><![CDATA[Рекламировать любое сообщение]]></string>
 
 	<string name="_bx_timeline_page_title_sys_view"><![CDATA[Хроника новостей профайла]]></string>
 	<string name="_bx_timeline_page_title_view"><![CDATA[Хроника новостей профайла]]></string>
@@ -137,6 +138,10 @@
     <string name="_bx_timeline_menu_item_title_item_pin"><![CDATA[Прикалывать]]></string>
     <string name="_bx_timeline_menu_item_title_system_item_unpin"><![CDATA[Откалывать]]></string>
     <string name="_bx_timeline_menu_item_title_item_unpin"><![CDATA[Откалывать]]></string>
+    <string name="_bx_timeline_menu_item_title_system_item_stick"><![CDATA[Приклеить]]></string>
+    <string name="_bx_timeline_menu_item_title_item_stick"><![CDATA[Приклеить]]></string>
+    <string name="_bx_timeline_menu_item_title_system_item_unstick"><![CDATA[Отклеить]]></string>
+    <string name="_bx_timeline_menu_item_title_item_unstick"><![CDATA[Отклеить]]></string>
     <string name="_bx_timeline_menu_item_title_system_item_promote"><![CDATA[Рекламировать]]></string>
     <string name="_bx_timeline_menu_item_title_item_promote"><![CDATA[Рекламировать]]></string>
     <string name="_bx_timeline_menu_item_title_system_item_unpromote"><![CDATA[Не рекламировать]]></string>

+ 19 - 2
modules/boonex/timeline/classes/BxTimelineDb.php

@@ -390,8 +390,25 @@ class BxTimelineDb extends BxBaseModNotificationsDb
         }
 
 		$sSelectClause .= ", DAYOFYEAR(FROM_UNIXTIME(`{$this->_sTable}`.`date`)) AS `days`, DAYOFYEAR(NOW()) AS `today`, ROUND((UNIX_TIMESTAMP() - `{$this->_sTable}`.`date`)/86400) AS `ago_days`, YEAR(FROM_UNIXTIME(`{$this->_sTable}`.`date`)) AS `year`";
-		if($aParams['browse'] == 'list')
-			$sOrderClause = "ORDER BY `{$this->_sTable}`.`pinned` DESC, `{$this->_sTable}`.`date` DESC";
+		if($aParams['browse'] == 'list') {
+			$sOrderClause = "";
+
+			switch($aParams['type']) {
+				case BX_TIMELINE_TYPE_HOT:
+				case BX_BASE_MOD_NTFS_TYPE_PUBLIC:
+				case BX_BASE_MOD_NTFS_TYPE_CONNECTIONS:
+				case BX_TIMELINE_TYPE_OWNER_AND_CONNECTIONS:
+					$sOrderClause = "`{$this->_sTable}`.`sticked` DESC";
+					break;
+
+				case BX_BASE_MOD_NTFS_TYPE_OWNER:
+					$sOrderClause = "`{$this->_sTable}`.`pinned` DESC";
+					break;
+			}
+
+			if(!empty($sOrderClause))
+				$sOrderClause = "ORDER BY " . $sOrderClause . ", `{$this->_sTable}`.`date` DESC";
+		}
 
         if(isset($aParams['count']) && $aParams['count'] === true) {
             $sMethod = 'getOne';

+ 8 - 0
modules/boonex/timeline/classes/BxTimelineMenuItemActions.php

@@ -201,6 +201,14 @@ class BxTimelineMenuItemActions extends BxTemplMenuCustom
                 $sCheckFuncName = 'isAllowedUnpin';
                 break;
 
+			case 'item-stick':
+				$sCheckFuncName = 'isAllowedStick';
+				break;
+
+			case 'item-unstick':
+				$sCheckFuncName = 'isAllowedUnstick';
+				break;
+
             case 'item-promote':
                 $sCheckFuncName = 'isAllowedPromote';
                 break;

+ 60 - 7
modules/boonex/timeline/classes/BxTimelineModule.php

@@ -124,6 +124,28 @@ class BxTimelineModule extends BxBaseModNotificationsModule implements iBxDolCon
 		));
     }
 
+    function actionStick()
+    {
+    	$this->_iOwnerId = bx_process_input(bx_get('owner_id'), BX_DATA_INT);
+
+    	$iId = bx_process_input(bx_get('id'), BX_DATA_INT);
+    	$aEvent = $this->_oDb->getEvents(array('browse' => 'id', 'value' => $iId));
+
+    	$mixedAllowed = $this->{'isAllowed' . ((int)$aEvent['sticked'] == 0 ? 'Stick' : 'Unstick')}($aEvent, true);
+    	if($mixedAllowed !== true)
+    		return echoJson(array('code' => 1, 'message' => strip_tags($mixedAllowed)));
+
+    	$aEvent['sticked'] = (int)$aEvent['sticked'] == 0 ? time() : 0;
+    	if(!$this->_oDb->updateEvent(array('sticked' => $aEvent['sticked']), array('id' => $iId)))
+    		return echoJson(array('code' => 2));
+
+    	echoJson(array(
+	    	'code' => 0,
+	    	'id' => $iId,
+	    	'eval' => $this->_oConfig->getJsObject('view') . '.onStickPost(oData)'
+		));
+    }
+
     function actionPromote()
     {
         $this->_iOwnerId = bx_process_input(bx_get('owner_id'), BX_DATA_INT);
@@ -2204,6 +2226,22 @@ class BxTimelineModule extends BxBaseModNotificationsModule implements iBxDolCon
         return $this->_isAllowedPin($aEvent, $bPerform);
     }
 
+    public function isAllowedStick($aEvent, $bPerform = false)
+    {
+    	if((int)$aEvent['sticked'] != 0)
+    		return false;
+    
+    	return $this->_isAllowedStick($aEvent, $bPerform);
+    }
+    
+    public function isAllowedUnstick($aEvent, $bPerform = false)
+    {
+    	if((int)$aEvent['sticked'] == 0)
+    		return false;
+    
+    	return $this->_isAllowedStick($aEvent, $bPerform);
+    }
+    
     public function isAllowedPromote($aEvent, $bPerform = false)
     {
     	if((int)$aEvent['promoted'] != 0)
@@ -2563,14 +2601,11 @@ class BxTimelineModule extends BxBaseModNotificationsModule implements iBxDolCon
 
 	protected function _isAllowedPin($aEvent, $bPerform = false)
     {
-        if(isAdmin())
-            return true;
-
-        $iUserId = (int)$this->getUserId();
-        if($iUserId == 0)
-            return false;
+    	$iUserId = (int)$this->getUserId();
+    	if($iUserId == 0)
+    		return false;
 
-		if((int)$aEvent['owner_id'] == $iUserId)
+		if(isAdmin() || (int)$aEvent['owner_id'] == $iUserId || ((int)$aEvent['owner_id'] == 0 && $this->_oConfig->isCommon($aEvent['type'], $aEvent['action']) && (int)$aEvent['object_id'] == $iUserId))
            return true;
 
         $aCheckResult = checkActionModule($iUserId, 'pin', $this->getName(), $bPerform);
@@ -2582,6 +2617,24 @@ class BxTimelineModule extends BxBaseModNotificationsModule implements iBxDolCon
         return $aCheckResult[CHECK_ACTION_RESULT] !== CHECK_ACTION_RESULT_ALLOWED ? $aCheckResult[CHECK_ACTION_MESSAGE] : true;
     }
 
+    protected function _isAllowedStick($aEvent, $bPerform = false)
+    {
+    	$iUserId = (int)$this->getUserId();
+    	if($iUserId == 0)
+    		return false;
+
+    	if(isAdmin())
+    		return true;
+
+    	$aCheckResult = checkActionModule($iUserId, 'stick', $this->getName(), $bPerform);
+    
+    	$oProfileOwner = BxDolProfile::getInstance($aEvent['owner_id']);
+    	if($oProfileOwner !== false)
+    		bx_alert($oProfileOwner->getModule(), $this->_oConfig->getUri() . '_stick', $oProfileOwner->id(), $iUserId, array('check_result' => &$aCheckResult));
+    
+    	return $aCheckResult[CHECK_ACTION_RESULT] !== CHECK_ACTION_RESULT_ALLOWED ? $aCheckResult[CHECK_ACTION_MESSAGE] : true;
+    }
+
     protected function _isAllowedPromote($aEvent, $bPerform = false)
     {
         if(isAdmin())

+ 7 - 2
modules/boonex/timeline/install/langs/en.xml

@@ -70,8 +70,9 @@
 	<string name="_bx_timeline_acl_action_vote"><![CDATA[Vote]]></string>
 	<string name="_bx_timeline_acl_action_repost"><![CDATA[Repost]]></string>
 	<string name="_bx_timeline_acl_action_send"><![CDATA[Send]]></string>
-	<string name="_bx_timeline_acl_action_pin"><![CDATA[Pin]]></string>
-	<string name="_bx_timeline_acl_action_promote"><![CDATA[Promote]]></string>
+	<string name="_bx_timeline_acl_action_pin"><![CDATA[Pin Any Post]]></string>
+	<string name="_bx_timeline_acl_action_stick"><![CDATA[Stick Any Post]]></string>
+	<string name="_bx_timeline_acl_action_promote"><![CDATA[Promote Any Post]]></string>
 
 	<string name="_bx_timeline_page_title_sys_view"><![CDATA[Profile Feed]]></string>
 	<string name="_bx_timeline_page_title_view"><![CDATA[Profile Feed]]></string>
@@ -137,6 +138,10 @@
     <string name="_bx_timeline_menu_item_title_item_pin"><![CDATA[Pin]]></string>
     <string name="_bx_timeline_menu_item_title_system_item_unpin"><![CDATA[Unpin]]></string>
     <string name="_bx_timeline_menu_item_title_item_unpin"><![CDATA[Unpin]]></string>
+    <string name="_bx_timeline_menu_item_title_system_item_stick"><![CDATA[Stick]]></string>
+    <string name="_bx_timeline_menu_item_title_item_stick"><![CDATA[Stick]]></string>
+    <string name="_bx_timeline_menu_item_title_system_item_unstick"><![CDATA[Unstick]]></string>
+    <string name="_bx_timeline_menu_item_title_item_unstick"><![CDATA[Unstick]]></string>
     <string name="_bx_timeline_menu_item_title_system_item_promote"><![CDATA[Promote]]></string>
     <string name="_bx_timeline_menu_item_title_item_promote"><![CDATA[Promote]]></string>
     <string name="_bx_timeline_menu_item_title_system_item_unpromote"><![CDATA[Unpromote]]></string>

+ 17 - 7
modules/boonex/timeline/install/sql/enable.sql

@@ -84,11 +84,13 @@ INSERT INTO `sys_menu_sets`(`set_name`, `module`, `title`, `deletable`) VALUES
 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_timeline_menu_item_manage', 'bx_timeline', 'item-pin', '_bx_timeline_menu_item_title_system_item_pin', '_bx_timeline_menu_item_title_item_pin', 'javascript:void(0)', 'javascript:{js_object_view}.pinPost(this, {content_id}, 1)', '_self', 'thumbtack', '', 2147483647, 1, 0, 0),
 ('bx_timeline_menu_item_manage', 'bx_timeline', 'item-unpin', '_bx_timeline_menu_item_title_system_item_unpin', '_bx_timeline_menu_item_title_item_unpin', 'javascript:void(0)', 'javascript:{js_object_view}.pinPost(this, {content_id}, 0)', '_self', 'thumbtack', '', 2147483647, 1, 0, 1),
-('bx_timeline_menu_item_manage', 'bx_timeline', 'item-promote', '_bx_timeline_menu_item_title_system_item_promote', '_bx_timeline_menu_item_title_item_promote', 'javascript:void(0)', 'javascript:{js_object_view}.promotePost(this, {content_id}, 1)', '_self', 'certificate ', '', 2147483647, 1, 0, 2),
-('bx_timeline_menu_item_manage', 'bx_timeline', 'item-unpromote', '_bx_timeline_menu_item_title_system_item_unpromote', '_bx_timeline_menu_item_title_item_unpromote', 'javascript:void(0)', 'javascript:{js_object_view}.promotePost(this, {content_id}, 0)', '_self', 'certificate', '', 2147483647, 1, 0, 3),
-('bx_timeline_menu_item_manage', 'bx_timeline', 'item-report', '_bx_timeline_menu_item_title_system_item_report', '', 'javascript:void(0)', '', '', '', '', 2147483647, 1, 0, 4),
-('bx_timeline_menu_item_manage', 'bx_timeline', 'item-edit', '_bx_timeline_menu_item_title_system_item_edit', '_bx_timeline_menu_item_title_item_edit', 'javascript:void(0)', 'javascript:{js_object_view}.editPost(this, {content_id})', '_self', 'pencil-alt', '', 2147483647, 1, 0, 5),
-('bx_timeline_menu_item_manage', 'bx_timeline', 'item-delete', '_bx_timeline_menu_item_title_system_item_delete', '_bx_timeline_menu_item_title_item_delete', 'javascript:void(0)', 'javascript:{js_object_view}.deletePost(this, {content_id})', '_self', 'remove', '', 2147483647, 1, 0, 6);
+('bx_timeline_menu_item_manage', 'bx_timeline', 'item-stick', '_bx_timeline_menu_item_title_system_item_stick', '_bx_timeline_menu_item_title_item_stick', 'javascript:void(0)', 'javascript:{js_object_view}.stickPost(this, {content_id}, 1)', '_self', 'thumbtack', '', 2147483647, 1, 0, 2),
+('bx_timeline_menu_item_manage', 'bx_timeline', 'item-unstick', '_bx_timeline_menu_item_title_system_item_unstick', '_bx_timeline_menu_item_title_item_unstick', 'javascript:void(0)', 'javascript:{js_object_view}.stickPost(this, {content_id}, 0)', '_self', 'thumbtack', '', 2147483647, 1, 0, 3),
+('bx_timeline_menu_item_manage', 'bx_timeline', 'item-promote', '_bx_timeline_menu_item_title_system_item_promote', '_bx_timeline_menu_item_title_item_promote', 'javascript:void(0)', 'javascript:{js_object_view}.promotePost(this, {content_id}, 1)', '_self', 'certificate ', '', 2147483647, 1, 0, 4),
+('bx_timeline_menu_item_manage', 'bx_timeline', 'item-unpromote', '_bx_timeline_menu_item_title_system_item_unpromote', '_bx_timeline_menu_item_title_item_unpromote', 'javascript:void(0)', 'javascript:{js_object_view}.promotePost(this, {content_id}, 0)', '_self', 'certificate', '', 2147483647, 1, 0, 5),
+('bx_timeline_menu_item_manage', 'bx_timeline', 'item-report', '_bx_timeline_menu_item_title_system_item_report', '', 'javascript:void(0)', '', '', '', '', 2147483647, 1, 0, 6),
+('bx_timeline_menu_item_manage', 'bx_timeline', 'item-edit', '_bx_timeline_menu_item_title_system_item_edit', '_bx_timeline_menu_item_title_item_edit', 'javascript:void(0)', 'javascript:{js_object_view}.editPost(this, {content_id})', '_self', 'pencil-alt', '', 2147483647, 1, 0, 7),
+('bx_timeline_menu_item_manage', 'bx_timeline', 'item-delete', '_bx_timeline_menu_item_title_system_item_delete', '_bx_timeline_menu_item_title_item_delete', 'javascript:void(0)', 'javascript:{js_object_view}.deletePost(this, {content_id})', '_self', 'remove', '', 2147483647, 1, 0, 8);
 
 -- MENU: Item Actions (Comment, Vote, Share, Report, etc)
 INSERT INTO `sys_objects_menu`(`object`, `title`, `set_name`, `module`, `template_id`, `deletable`, `active`, `override_class_name`, `override_class_file`) VALUES 
@@ -196,6 +198,10 @@ INSERT INTO `sys_acl_actions` (`Module`, `Name`, `AdditionalParamName`, `Title`,
 ('bx_timeline', 'pin', NULL, '_bx_timeline_acl_action_pin', '', 1, 3);
 SET @iIdActionPin = LAST_INSERT_ID();
 
+INSERT INTO `sys_acl_actions` (`Module`, `Name`, `AdditionalParamName`, `Title`, `Desc`, `Countable`, `DisabledForLevels`) VALUES
+('bx_timeline', 'stick', NULL, '_bx_timeline_acl_action_stick', '', 1, 3);
+SET @iIdActionStick = LAST_INSERT_ID();
+
 INSERT INTO `sys_acl_actions` (`Module`, `Name`, `AdditionalParamName`, `Title`, `Desc`, `Countable`, `DisabledForLevels`) VALUES
 ('bx_timeline', 'promote', NULL, '_bx_timeline_acl_action_promote', '', 1, 3);
 SET @iIdActionPromote = LAST_INSERT_ID();
@@ -244,11 +250,15 @@ INSERT INTO `sys_acl_matrix` (`IDLevel`, `IDAction`) VALUES
 (@iAdministrator, @iIdActionSend),
 (@iPremium, @iIdActionSend),
 
--- pin
+-- pin any post
 (@iModerator, @iIdActionPin),
 (@iAdministrator, @iIdActionPin),
 
--- promote
+-- stick any post
+(@iModerator, @iIdActionStick),
+(@iAdministrator, @iIdActionStick),
+
+-- promote any post
 (@iModerator, @iIdActionPromote),
 (@iAdministrator, @iIdActionPromote);
 

+ 1 - 0
modules/boonex/timeline/install/sql/install.sql

@@ -24,6 +24,7 @@ CREATE TABLE IF NOT EXISTS `bx_timeline_events` (
   `active` tinyint(4) NOT NULL default '1',
   `hidden` tinyint(4) NOT NULL default '0',
   `pinned` int(11) NOT NULL default '0',
+  `sticked` int(11) NOT NULL default '0',
   `promoted` int(11) NOT NULL default '0',
   PRIMARY KEY (`id`),
   KEY `owner_id` (`owner_id`),

+ 65 - 49
modules/boonex/timeline/js/view.js

@@ -324,60 +324,19 @@ BxTimelineView.prototype.commentItem = function(oLink, sSystem, iId) {
 };
 
 BxTimelineView.prototype.pinPost = function(oLink, iId, iWay) {
-	var $this = this;
-    var oData = this._getDefaultData();
-    oData['id'] = iId;
-
-    $(oLink).parents('.bx-popup-applied:first:visible').dolPopupHide({
-		onHide: function(oPopup) {
-			$(oPopup).remove();
-		}
-	});
-
-    if(this.bViewTimeline)
-    	this.loadingInItem($(this.sIdItemTimeline + iId), true);
-
-    if(this.bViewOutline)
-    	this.loadingInItem($(this.sIdItemOutline + iId), true);
-
-    $.post(
-        this._sActionsUrl + 'pin/',
-        oData,
-        function(oData) {
-        	processJsonData(oData);
-        },
-        'json'
-    );
+	this._markPost(oLink, iId, iWay, 'pin');
 };
 
 BxTimelineView.prototype.onPinPost = function(oData) {
-	var $this = this;
-
-	//--- Pin on Timeline (if available)
-	if(this.bViewTimeline) {
-		var sItemTimeline = this.sIdItemTimeline + oData.id;
-
-		this._oRequestParams['timeline'].start = 0;
-        this._getPosts(this.oViewTimeline, function(oData) {
-        	$(sItemTimeline).bx_anim('hide', $this._sAnimationEffect, $this._iAnimationSpeed, function() {
-    	        $(this).remove();
-
-    	        processJsonData(oData);
-        	});
-        });
-	}
+	this._onMarkPost(oData, 'pin');
+};
 
-	//--- Pin on Outline (if available)
-	if(this.bViewOutline) {
-		var sItemOutline = this.sIdItemOutline + oData.id;
+BxTimelineView.prototype.stickPost = function(oLink, iId, iWay) {
+	this._markPost(oLink, iId, iWay, 'stick');
+};
 
-		this._oRequestParams['outline'].start = 0;
-        this._getPosts(this.oViewOutline, function(oData) {
-        	$this.removeMasonry(sItemOutline, function() {
-        		processJsonData(oData);
-    		});
-        });
-	}
+BxTimelineView.prototype.onStickPost = function(oData) {
+	this._onMarkPost(oData, 'stick');
 };
 
 BxTimelineView.prototype.promotePost = function(oLink, iId, iWay) {
@@ -832,3 +791,60 @@ BxTimelineView.prototype._onGetPost = function(oData) {
 			break;
 	}
 };
+
+BxTimelineView.prototype._markPost = function(oLink, iId, iWay, sAction) {
+	var $this = this;
+    var oData = this._getDefaultData();
+    oData['id'] = iId;
+
+    $(oLink).parents('.bx-popup-applied:first:visible').dolPopupHide({
+		onHide: function(oPopup) {
+			$(oPopup).remove();
+		}
+	});
+
+    if(this.bViewTimeline)
+    	this.loadingInItem($(this.sIdItemTimeline + iId), true);
+
+    if(this.bViewOutline)
+    	this.loadingInItem($(this.sIdItemOutline + iId), true);
+
+    $.post(
+        this._sActionsUrl + sAction + '/',
+        oData,
+        function(oData) {
+        	processJsonData(oData);
+        },
+        'json'
+    );
+};
+
+BxTimelineView.prototype._onMarkPost = function(oData, sAction) {
+	var $this = this;
+
+	//--- Mark on Timeline (if available)
+	if(this.bViewTimeline) {
+		var sItemTimeline = this.sIdItemTimeline + oData.id;
+
+		this._oRequestParams['timeline'].start = 0;
+        this._getPosts(this.oViewTimeline, function(oData) {
+        	$(sItemTimeline).bx_anim('hide', $this._sAnimationEffect, $this._iAnimationSpeed, function() {
+    	        $(this).remove();
+
+    	        processJsonData(oData);
+        	});
+        });
+	}
+
+	//--- Mark on Outline (if available)
+	if(this.bViewOutline) {
+		var sItemOutline = this.sIdItemOutline + oData.id;
+
+		this._oRequestParams['outline'].start = 0;
+        this._getPosts(this.oViewOutline, function(oData) {
+        	$this.removeMasonry(sItemOutline, function() {
+        		processJsonData(oData);
+    		});
+        });
+	}
+};