Explorar el Código

Ticket #4043 - Timeline: Add 'Hide instead of Remove' feature.

AntonLV hace 4 años
padre
commit
e1ab6ac9da

+ 1 - 0
modules/boonex/russian/data/langs/bx_timeline/ru.xml

@@ -16,6 +16,7 @@
     <string name="_bx_timeline_option_enable_show_all"><![CDATA[Показывать все сообщения в 'Общей хронике', включая те, что были написаны в персональных Хрониках]]></string>
     <string name="_bx_timeline_option_enable_count_all_views"><![CDATA[Считать просмотры для всех событий в хронике]]></string>
     <string name="_bx_timeline_option_enable_repost_own_actions"><![CDATA[Репост использует собственные действия (просмотры, голосование и тп.)]]></string>
+    <string name="_bx_timeline_option_enable_hide_upon_delete"><![CDATA[Деактивировать сообщения при скрывании вместо удаления]]></string>
     <string name="_bx_timeline_option_events_per_page_profile"><![CDATA[Количество элементов на странице профайла]]></string>
     <string name="_bx_timeline_option_events_per_page_account"><![CDATA[Количество элементов на странице "панель аккаунта"]]></string>
     <string name="_bx_timeline_option_events_per_page_home"><![CDATA[Количество элементов на главной странице сайта]]></string>

+ 7 - 0
modules/boonex/timeline/classes/BxTimelineConfig.php

@@ -20,6 +20,7 @@ class BxTimelineConfig extends BxBaseModNotificationsConfig
     protected $_bShowAll;
     protected $_bCountAllViews;
     protected $_bRepostOwnActions;
+    protected $_bHideUponDelete;
 
     protected $_bCacheItem;
     protected $_sCacheItemEngine;
@@ -394,6 +395,7 @@ class BxTimelineConfig extends BxBaseModNotificationsConfig
         $this->_bShowAll = getParam($sOptionPrefix . 'enable_show_all') == 'on';
         $this->_bCountAllViews = getParam($sOptionPrefix . 'enable_count_all_views') == 'on';
         $this->_bRepostOwnActions = getParam($sOptionPrefix . 'enable_repost_own_actions') == 'on';
+        $this->_bHideUponDelete = getParam($sOptionPrefix . 'enable_hide_upon_delete') == 'on';
 
         $this->_bCacheItem = getParam($sOptionPrefix . 'enable_cache_item') == 'on';
         $this->_sCacheItemEngine = getParam($sOptionPrefix . 'cache_item_engine');
@@ -524,6 +526,11 @@ class BxTimelineConfig extends BxBaseModNotificationsConfig
         return $this->_bRepostOwnActions;
     }
 
+    public function isHideUponDelete()
+    {
+        return $this->_bHideUponDelete;
+    }
+
     public function isBriefCards()
     {
         return $this->_bBriefCards;

+ 9 - 0
modules/boonex/timeline/classes/BxTimelineDb.php

@@ -107,6 +107,15 @@ class BxTimelineDb extends BxBaseModNotificationsDb
         return (int)$this->query($sQuery) > 0;
     }
 
+    public function updateRepostTrack($aParamsSet, $aParamsWhere)
+    {
+        if(empty($aParamsSet) || empty($aParamsWhere))
+            return false;
+
+        $sSql = "UPDATE `{$this->_sTableRepostsTrack}` SET " . $this->arrayToSQL($aParamsSet) . " WHERE " . $this->arrayToSQL($aParamsWhere, " AND ");
+        return $this->query($sSql);
+    }
+
     public function deleteRepostTrack($iEventId)
     {
         $sQuery = $this->prepare("DELETE FROM `{$this->_sTableRepostsTrack}` WHERE `event_id` = ?", $iEventId);

+ 15 - 0
modules/boonex/timeline/classes/BxTimelineGridCommon.php

@@ -26,6 +26,21 @@ class BxTimelineGridCommon extends BxTimelineGridManageTools
         $this->_sManageType = BX_DOL_MANAGE_TOOLS_COMMON;
     }
 
+    protected function _enable ($mixedId, $isChecked)
+    {
+        $bResult = parent::_enable($mixedId, $isChecked);
+        if(!$bResult) 
+            return $bResult;
+        
+        $aEvent = $this->_oModule->_oDb->getEvents(['browse' => 'id', 'value' => (int)$mixedId]);
+        if(empty($aEvent) || !is_array($aEvent))
+            return $bResult;
+
+        $this->_oModule->{$isChecked ? 'onUnhide' : 'onHide'}($aEvent);
+
+        return $bResult;
+    }
+
     protected function _getCellSwitcher ($mixedValue, $sKey, $aField, $aRow)
     {
         if(!$this->_switcherState2Checked($aRow['status_admin']))

+ 1 - 1
modules/boonex/timeline/classes/BxTimelineMenuItemActions.php

@@ -111,7 +111,7 @@ class BxTimelineMenuItemActions extends BxTemplMenuCustom
 
             'repost_onclick' => $sRepostOnclick,
 
-            'delete_title' => _t('_bx_timeline_menu_item_title_item_delete_' . ($bSystem ? 'system' : 'common'))
+            'delete_title' => _t('_bx_timeline_menu_item_title_item_delete_' . ($bSystem || $this->_oModule->_oConfig->isHideUponDelete() ? 'system' : 'common'))
         ));
 
         return true;

+ 117 - 5
modules/boonex/timeline/classes/BxTimelineModule.php

@@ -314,7 +314,7 @@ class BxTimelineModule extends BxBaseModNotificationsModule implements iBxDolCon
         if($mixedAllowed !== true)
             return echoJson(array('code' => 2, 'message' => strip_tags($mixedAllowed)));
 
-        if(!$this->deleteEvent($aEvent))
+        if(!$this->{$this->_oConfig->isHideUponDelete() ? 'hideEvent' : 'deleteEvent'}($aEvent))
             return echoJson(array('code' => 3));
 
         echoJson(array(
@@ -3294,6 +3294,15 @@ class BxTimelineModule extends BxBaseModNotificationsModule implements iBxDolCon
         return array('code' => 0, 'content' => $sContent, 'event' => $aEvent);
     }
 
+    public function hideEvent($aEvent)
+    {
+    	if(empty($aEvent) || !is_array($aEvent) || !$this->_oDb->updateEvent(['status' => 'hidden'], ['id' => (int)$aEvent['id']]))
+            return false;
+
+        $this->onHide($aEvent);
+        return true;
+    }
+
     public function deleteEvent($aEvent)
     {
     	if(empty($aEvent) || !is_array($aEvent) || !$this->_oDb->deleteEvent(array('id' => (int)$aEvent['id'])))
@@ -4363,6 +4372,108 @@ class BxTimelineModule extends BxBaseModNotificationsModule implements iBxDolCon
         //--- Timeline -> Update for Alerts Engine ---//
     }
 
+    public function onHide($aEvent)
+    {
+        $CNF = &$this->_oConfig->CNF;
+
+        $iUserId = $this->getUserId();
+    	$sCommonPostPrefix = $this->_oConfig->getPrefix('common_post');
+
+    	//--- Update parent event when repost event was deactivated.
+    	$bRepost = $aEvent['type'] == $sCommonPostPrefix . BX_TIMELINE_PARSE_TYPE_REPOST;
+        if($bRepost) {
+            $this->_oDb->updateRepostTrack(['active' => 0], ['event_id' => $aEvent[$CNF['FIELD_ID']]]);
+
+            $aContent = unserialize($aEvent['content']);
+            $aReposted = $this->_oDb->getReposted($aContent['type'], $aContent['action'], $aContent['object_id']);
+            if(!empty($aReposted) && is_array($aReposted))
+                $this->_oDb->updateRepostCounter($aReposted[$CNF['FIELD_ID']], $aReposted['reposts'], -1);
+        }
+
+        //--- Find and hide repost events when parent event was deactivated.
+        $aRepostEvents = $this->_oDb->getEvents(['browse' => 'reposted_by_track', 'value' => $aEvent[$CNF['FIELD_ID']]]);
+        foreach($aRepostEvents as $aRepostEvent) {
+            if((int)$this->_oDb->updateEvent(['active' => 0], ['id' => (int)$aRepostEvent[$CNF['FIELD_ID']]]) == 0) 
+                continue;
+
+            $this->_oDb->updateRepostTrack(['active' => 0], ['event_id' => $aRepostEvent[$CNF['FIELD_ID']]]);
+
+            bx_alert($this->_oConfig->getObject('alert'), 'hide_repost', $aEvent[$CNF['FIELD_ID']], $iUserId, array(
+                'repost_id' => $aRepostEvent[$CNF['FIELD_ID']],
+            ));
+        }
+
+        //--- Delete associated meta for Common events.
+        if($this->_oConfig->isCommon($aEvent['type'], $aEvent['action'])) {
+            $oMetatags = BxDolMetatags::getObjectInstance($this->_oConfig->getObject('metatags'));
+            $oMetatags->onDeleteContent($aEvent[$CNF['FIELD_ID']]);
+        }
+
+        //--- Delete item cache.
+        $sCacheItemKey = $this->_oConfig->getCacheItemKey($aEvent[$CNF['FIELD_ID']]);
+        $this->getCacheItemObject()->delData($sCacheItemKey);
+
+        //--- Event -> Hide for Alerts Engine ---//
+        if($bRepost)
+            bx_alert($this->_oConfig->getObject('alert'), 'hide_repost', $aReposted[$CNF['FIELD_ID']], $iUserId, array(
+                'repost_id' => $aEvent[$CNF['FIELD_ID']],
+            ));
+        else
+            bx_alert($this->_oConfig->getObject('alert'), 'hide', $aEvent[$CNF['FIELD_ID']], $iUserId);
+        //--- Event -> Hide for Alerts Engine ---//
+    }
+
+    public function onUnhide($aEvent)
+    {
+        $CNF = &$this->_oConfig->CNF;
+
+        $iUserId = $this->getUserId();
+    	$sCommonPostPrefix = $this->_oConfig->getPrefix('common_post');
+
+    	//--- Update parent event when repost event was activated back.
+    	$bRepost = $aEvent['type'] == $sCommonPostPrefix . BX_TIMELINE_PARSE_TYPE_REPOST;
+        if($bRepost) {
+            $this->_oDb->updateRepostTrack(['active' => 1], ['event_id' => $aEvent[$CNF['FIELD_ID']]]);
+
+            $aContent = unserialize($aEvent['content']);
+            $aReposted = $this->_oDb->getReposted($aContent['type'], $aContent['action'], $aContent['object_id']);
+            if(!empty($aReposted) && is_array($aReposted))
+                $this->_oDb->updateRepostCounter($aReposted[$CNF['FIELD_ID']], $aReposted['reposts'], 1);
+        }
+
+        //--- Find and hide repost events when parent event was activated back.
+        $aRepostEvents = $this->_oDb->getEvents(['browse' => 'reposted_by_track', 'value' => $aEvent[$CNF['FIELD_ID']]]);
+        foreach($aRepostEvents as $aRepostEvent) {
+            if((int)$this->_oDb->updateEvent(['active' => 1], ['id' => (int)$aRepostEvent[$CNF['FIELD_ID']]]) == 0) 
+                continue;
+
+            $this->_oDb->updateRepostTrack(['active' => 1], ['event_id' => $aRepostEvent[$CNF['FIELD_ID']]]);
+
+            bx_alert($this->_oConfig->getObject('alert'), 'unhide_repost', $aEvent[$CNF['FIELD_ID']], $iUserId, array(
+                'repost_id' => $aRepostEvent[$CNF['FIELD_ID']],
+            ));
+        }
+
+        //--- Process meta for Common events.
+        if($this->_oConfig->isCommon($aEvent['type'], $aEvent['action'])) {
+            $aContent = unserialize($aEvent['content']);
+
+            $oMetatags = BxDolMetatags::getObjectInstance($this->_oConfig->getObject('metatags'));
+            if(!empty($aContent['text']))
+                $oMetatags->metaAdd($aEvent[$CNF['FIELD_ID']], $aContent['text']);
+            $oMetatags->locationsAddFromForm($aEvent[$CNF['FIELD_ID']], $CNF['FIELD_LOCATION_PREFIX']);
+        }
+
+        //--- Event -> Unhide for Alerts Engine ---//
+        if($bRepost)
+            bx_alert($this->_oConfig->getObject('alert'), 'unhide_repost', $aReposted[$CNF['FIELD_ID']], $iUserId, array(
+                'repost_id' => $aEvent[$CNF['FIELD_ID']],
+            ));
+        else
+            bx_alert($this->_oConfig->getObject('alert'), 'unhide', $aEvent[$CNF['FIELD_ID']], $iUserId);
+        //--- Event -> Unhide for Alerts Engine ---//
+    }
+
     public function onDelete($aEvent)
     {
         $CNF = &$this->_oConfig->CNF;
@@ -4398,7 +4509,6 @@ class BxTimelineModule extends BxBaseModNotificationsModule implements iBxDolCon
         }
 
         //--- Find and delete repost events when parent event was deleted.
-        $bSystem = $this->_oConfig->isSystem($aEvent['type'], $aEvent['action']);
         $aRepostEvents = $this->_oDb->getEvents(array('browse' => 'reposted_by_track', 'value' => $aEvent[$CNF['FIELD_ID']]));
         foreach($aRepostEvents as $aRepostEvent) {
             if((int)$this->_oDb->deleteEvent(array('id' => (int)$aRepostEvent[$CNF['FIELD_ID']])) == 0) 
@@ -4415,9 +4525,11 @@ class BxTimelineModule extends BxBaseModNotificationsModule implements iBxDolCon
             ));
         }
 
-        //--- Delete associated meta.
-        $oMetatags = BxDolMetatags::getObjectInstance($this->_oConfig->getObject('metatags'));
-        $oMetatags->onDeleteContent($aEvent[$CNF['FIELD_ID']]);
+        //--- Delete associated meta for Common events.
+        if($this->_oConfig->isCommon($aEvent['type'], $aEvent['action'])) {
+            $oMetatags = BxDolMetatags::getObjectInstance($this->_oConfig->getObject('metatags'));
+            $oMetatags->onDeleteContent($aEvent[$CNF['FIELD_ID']]);
+        }
         
         //--- Delete item cache.
         $sCacheItemKey = $this->_oConfig->getCacheItemKey($aEvent[$CNF['FIELD_ID']]);

+ 1 - 0
modules/boonex/timeline/install/langs/en.xml

@@ -16,6 +16,7 @@
     <string name="_bx_timeline_option_enable_show_all"><![CDATA[Show all items in Public Feed including ones which were posted in personal Feeds]]></string>
     <string name="_bx_timeline_option_enable_count_all_views"><![CDATA[Count views for all items in the Feed]]></string>
     <string name="_bx_timeline_option_enable_repost_own_actions"><![CDATA[Repost uses its own actions (views, likes, etc)]]></string>
+    <string name="_bx_timeline_option_enable_hide_upon_delete"><![CDATA[Inactivate items upon hiding instead of deletion]]></string>
     <string name="_bx_timeline_option_events_per_page_profile"><![CDATA[Number of items on profile page]]></string>
     <string name="_bx_timeline_option_events_per_page_account"><![CDATA[Number of items on dashboard page]]></string>
     <string name="_bx_timeline_option_events_per_page_home"><![CDATA[Number of items on site home page]]></string>

+ 2 - 1
modules/boonex/timeline/install/sql/enable.sql

@@ -292,7 +292,8 @@ INSERT INTO `sys_options` (`name`, `value`, `category_id`, `caption`, `type`, `c
 ('bx_timeline_enable_delete', 'on', @iCategId, '_bx_timeline_option_enable_delete', 'checkbox', '', '', '', '', 2),
 ('bx_timeline_enable_count_all_views', '', @iCategId, '_bx_timeline_option_enable_count_all_views', 'checkbox', '', '', '', '', 3),
 ('bx_timeline_enable_repost_own_actions', 'on', @iCategId, '_bx_timeline_option_enable_repost_own_actions', 'checkbox', '', '', '', '', 4),
-('bx_timeline_events_hide', CONCAT_WS(',', @iHdrIdComment), @iCategId, '_bx_timeline_option_events_hide', 'rlist', '', '', '', 'a:2:{s:6:"module";s:11:"bx_timeline";s:6:"method";s:21:"get_actions_checklist";}', 5);
+('bx_timeline_enable_hide_upon_delete', '', @iCategId, '_bx_timeline_option_enable_hide_upon_delete', 'checkbox', '', '', '', '', 5),
+('bx_timeline_events_hide', CONCAT_WS(',', @iHdrIdComment), @iCategId, '_bx_timeline_option_events_hide', 'rlist', '', '', '', 'a:2:{s:6:"module";s:11:"bx_timeline";s:6:"method";s:21:"get_actions_checklist";}', 6);
 
 -- Category: Browse
 INSERT INTO `sys_options_categories` (`type_id`, `name`, `caption`, `order`)

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

@@ -212,6 +212,7 @@ CREATE TABLE IF NOT EXISTS `bx_timeline_reposts_track` (
   `author_nip` int(11) unsigned NOT NULL default '0',
   `reposted_id` int(11) NOT NULL default '0',
   `date` int(11) NOT NULL default '0',
+  `active` tinyint(4) NOT NULL default '1',
   PRIMARY KEY (`id`),
   UNIQUE KEY `event_id` (`event_id`),
   KEY `repost` (`reposted_id`, `author_nip`)