1
0
Эх сурвалжийг харах

Ticket #5332 - Timeline: Don't allow to create an item with non-existed handler.

AntonLV 10 сар өмнө
parent
commit
15e3a321b8

+ 16 - 1
modules/base/notifications/classes/BxBaseModNotificationsDb.php

@@ -211,7 +211,17 @@ class BxBaseModNotificationsDb extends BxBaseModGeneralDb
 
                     $sWhereClause = "AND `id`=:id";
                     break;
-                
+
+                case 'by_unit_action':
+                    $aMethod['name'] = 'getRow';
+                    $aMethod['params'][1] = [
+                        'alert_unit' => $aParams['unit'],
+                        'alert_action' => $aParams['action'],
+                    ];
+
+                    $sWhereClause = "AND `alert_unit`=:alert_unit AND `alert_action`=:alert_action";
+                    break;
+
                 case 'by_type':
                     $aMethod['params'][1] = array(
                         'type' => $aParams['value']
@@ -235,6 +245,11 @@ class BxBaseModNotificationsDb extends BxBaseModGeneralDb
         return call_user_func_array(array($this, $aMethod['name']), $aMethod['params']);
     }
 
+    public function isHandler($sUnit, $sAction)
+    {
+        return ($aHandler = $this->getHandlers(['type' => 'by_unit_action', 'unit' => $sUnit, 'action' => $sAction])) && is_array($aHandler);
+    }
+
     public function getSetting($aParams = array())
     {
     	$CNF = &$this->_oConfig->CNF;

+ 11 - 8
modules/boonex/timeline/classes/BxTimelineDb.php

@@ -163,14 +163,17 @@ class BxTimelineDb extends BxBaseModNotificationsDb
 
     public function getReposted($sType, $sAction, $iObjectId)
     {
+        if(!$this->isHandler($sType, $sAction))
+            return [];
+
     	$bSystem = $this->_oConfig->isSystem($sType, $sAction);
 
-        if($bSystem)
-            $aParams = array('browse' => 'descriptor', 'type' => $sType, 'action' => $sAction, 'object_id' => $iObjectId);
-        else
-            $aParams = array('browse' => 'id', 'value' => $iObjectId);
+        $aReposted = $this->getEvents($bSystem ? [
+            'browse' => 'descriptor', 'type' => $sType, 'action' => $sAction, 'object_id' => $iObjectId
+        ] : [
+            'browse' => 'id', 'value' => $iObjectId
+        ]);
 
-        $aReposted = $this->getEvents($aParams);
         if($bSystem && (empty($aReposted) || !is_array($aReposted))) {
             $iOwnerId = 0;
             $iDate = 0;
@@ -184,7 +187,7 @@ class BxTimelineDb extends BxBaseModNotificationsDb
                     $sStatus = BX_TIMELINE_STATUS_ACTIVE;
             }
 
-            $iId = $this->insertEvent(array(
+            $iId = $this->insertEvent([
                 'owner_id' => $iOwnerId,
                 'type' => $sType,
                 'action' => $sAction,
@@ -197,9 +200,9 @@ class BxTimelineDb extends BxBaseModNotificationsDb
                 'date' => $iDate,
                 'reacted' => $iDate,
                 'status' => $sStatus
-            ));
+            ]);
 
-            $aReposted = $this->getEvents(array('browse' => 'id', 'value' => $iId));
+            $aReposted = $this->getEvents(['browse' => 'id', 'value' => $iId]);
         }
 
         return $aReposted;

+ 44 - 27
modules/boonex/timeline/classes/BxTimelineModule.php

@@ -424,8 +424,11 @@ class BxTimelineModule extends BxBaseModNotificationsModule implements iBxDolCon
         if(!empty($aResult) && is_array($aResult))
             return echoJson($aResult);
 
-        $aParams = $this->_oConfig->getRepostDefaults();
         $aReposted = $this->_oDb->getReposted($sType, $sAction, $iObjectId);
+        if(empty($aReposted) || !is_array($aReposted))
+            return echoJson(['code' => 1, 'message' => _t('_bx_timeline_txt_err_cannot_repost')]);
+
+        $aParams = $this->_oConfig->getRepostDefaults();
 
         echoJson([
             'code' => 0, 
@@ -452,33 +455,36 @@ class BxTimelineModule extends BxBaseModNotificationsModule implements iBxDolCon
         $iObjectId = bx_process_input(bx_get('object_id'), BX_DATA_INT);
 
         $oForm = BxDolForm::getObjectInstance($this->_oConfig->getObject('form_repost'), $this->_oConfig->getObject('form_display_repost_with'));
-        $oForm->initChecker(array(
+        $oForm->initChecker([
             'reposter_id' => $iReposterId,
             'owner_id' => $iOwnerId,
             'type' => $sType,
             'action' => $sAction, 
             'object_id' => $iObjectId
-        ));
+        ]);
 
         if($oForm->isSubmitted()) {
             if(!$oForm->isValid())
-                return echoJson(array('popup' => array(
+                return echoJson(['popup' => [
                     'html' => BxTemplFunctions::getInstance()->transBox($this->_oConfig->getHtmlIds('repost', 'with_popup'), $this->_oTemplate->getRepostWith($oForm)), 
-                    'options' => array('closeOnOuterClick' => false, 'removeOnClose' => true)
-                )));
+                    'options' => ['closeOnOuterClick' => false, 'removeOnClose' => true]
+                ]]);
 
-            $this->repost($iReposterId, $iOwnerId, $sType, $sAction, $iObjectId, ['text' => $oForm->getCleanValue('text')]);
+            $aResult = $this->repost($iReposterId, $iOwnerId, $sType, $sAction, $iObjectId, ['text' => $oForm->getCleanValue('text')]);
+            if(!empty($aResult) && is_array($aResult))
+                return echoJson($aResult);
 
             $aReposted = $this->_oDb->getReposted($sType, $sAction, $iObjectId);
-            $sCounter = $this->_oTemplate->getRepostCounter($aReposted);
+            if(empty($aReposted) || !is_array($aReposted))
+                return echoJson(['code' => 1, 'message' => _t('_bx_timeline_txt_err_cannot_repost')]);
 
-            return echoJson(array(
+            return echoJson([
                 'code' => 0, 
                 'message' => _t('_bx_timeline_txt_msg_success_repost'), 
                 'count' => $aReposted['reposts'], 
                 'countf' => (int)$aReposted['reposts'] > 0 ? $this->_oTemplate->getRepostCounterLabel($aReposted['reposts']) : '',
-                'counter' => $sCounter,
-            ));
+                'counter' => $this->_oTemplate->getRepostCounter($aReposted),
+            ]);
         }
 
         echo $this->_oTemplate->getRepostTo($oForm);
@@ -495,21 +501,21 @@ class BxTimelineModule extends BxBaseModNotificationsModule implements iBxDolCon
         $iObjectId = bx_process_input(bx_get('object_id'), BX_DATA_INT);
 
         $oForm = BxDolForm::getObjectInstance($this->_oConfig->getObject('form_repost'), $this->_oConfig->getObject('form_display_repost_to'));
-        $oForm->initChecker(array(
+        $oForm->initChecker([
             'reposter_id' => $iReposterId,
             'type' => $sType,
             'action' => $sAction, 
             'object_id' => $iObjectId
-        ));
+        ]);
 
         if($oForm->isSubmitted()) {
             if(!$oForm->isValid())
-                return echoJson(array('popup' => array(
+                return echoJson(['popup' => [
                     'html' => BxTemplFunctions::getInstance()->transBox($this->_oConfig->getHtmlIds('repost', 'to_popup'), $this->_oTemplate->getRepostTo($oForm)), 
-                    'options' => array('closeOnOuterClick' => false, 'removeOnClose' => true)
-                )));
+                    'options' => ['closeOnOuterClick' => false, 'removeOnClose' => true]
+                ]]);
 
-            $aContexts = array();
+            $aContexts = [];
             if(($aContextsSearch = $oForm->getCleanValue('search')) !== false)
                 $aContexts = array_merge($aContexts, $aContextsSearch);
 
@@ -518,21 +524,27 @@ class BxTimelineModule extends BxBaseModNotificationsModule implements iBxDolCon
 
             $aContexts = array_unique($aContexts);
             if(empty($aContexts) || !is_array($aContexts))
-                return echoJson(array());
+                return echoJson([]);
 
+            $iResult = 0;
             foreach($aContexts as $iContextId)
-                $this->repost($iReposterId, $iContextId, $sType, $sAction, $iObjectId);
+                if(($mixedResult = $this->repost($iReposterId, $iContextId, $sType, $sAction, $iObjectId)) && !is_array($mixedResult))
+                    $iResult++;
+
+            if(!$iResult)
+                return echoJson(['code' => 1, 'message' => _t('_bx_timeline_txt_err_cannot_repost')]);
 
             $aReposted = $this->_oDb->getReposted($sType, $sAction, $iObjectId);
-            $sCounter = $this->_oTemplate->getRepostCounter($aReposted);
+            if(empty($aReposted) || !is_array($aReposted))
+                return echoJson(['code' => 1, 'message' => _t('_bx_timeline_txt_err_cannot_repost')]);
 
-            return echoJson(array(
+            return echoJson([
                 'code' => 0, 
                 'message' => _t('_bx_timeline_txt_msg_success_repost'), 
                 'count' => $aReposted['reposts'], 
                 'countf' => (int)$aReposted['reposts'] > 0 ? $this->_oTemplate->getRepostCounterLabel($aReposted['reposts']) : '',
-                'counter' => $sCounter,
-            ));
+                'counter' => $this->_oTemplate->getRepostCounter($aReposted),
+            ]);
         }
 
         echo $this->_oTemplate->getRepostTo($oForm);
@@ -2988,6 +3000,8 @@ class BxTimelineModule extends BxBaseModNotificationsModule implements iBxDolCon
             return '';
 
         $aReposted = $this->_oDb->getReposted($sType, $sAction, $iObjectId);
+        if(empty($aReposted) || !is_array($aReposted))
+            return '';
 
         $aParams = array_merge($this->_oConfig->getRepostDefaults(), $aParams);
         return $this->_oTemplate->getRepostCounter($aReposted, $aParams);
@@ -3240,17 +3254,20 @@ class BxTimelineModule extends BxBaseModNotificationsModule implements iBxDolCon
 
     public function repost($iAuthorId, $iOwnerId, $sType, $sAction, $iObjectId, $mixedData = false, $bForce = false)
     {
+        if(!$this->_oDb->isHandler($sType, $sAction))
+            return ['code' => 1, 'message' => _t('_bx_timeline_txt_err_cannot_repost')];
+
         $aReposted = $this->_oDb->getReposted($sType, $sAction, $iObjectId);
         if(empty($aReposted) || !is_array($aReposted))
-            return array('code' => 1, 'message' => _t('_bx_timeline_txt_err_cannot_repost'));
+            return ['code' => 1, 'message' => _t('_bx_timeline_txt_err_cannot_repost')];
 
         $mixedAllowed = $this->isAllowedRepost($aReposted, true);
         if(!$bForce && $mixedAllowed !== true)
-            return array('code' => 2, 'message' => strip_tags($mixedAllowed));
+            return ['code' => 2, 'message' => strip_tags($mixedAllowed)];
 
         $bReposted = $this->_oDb->isReposted($aReposted['id'], $iOwnerId, $iAuthorId);
         if($bReposted)
-            return array('code' => 3, 'message' => _t('_bx_timeline_txt_err_already_reposted'));
+            return ['code' => 3, 'message' => _t('_bx_timeline_txt_err_already_reposted')];
 
         $iDate = time();
         $iId = $this->_oDb->insertEvent([
@@ -3275,7 +3292,7 @@ class BxTimelineModule extends BxBaseModNotificationsModule implements iBxDolCon
         ]);
 
         if(empty($iId))
-            return array('code' => 4, 'message' => _t('_bx_timeline_txt_err_cannot_repost'));
+            return ['code' => 4, 'message' => _t('_bx_timeline_txt_err_cannot_repost')];
 
         $this->_oDb->updateEvent([
             'source' => $this->getName() . '_' . $iAuthorId . '_' . $iId

+ 3 - 3
modules/boonex/timeline/template/repost_to_list.html

@@ -5,9 +5,9 @@
                 <div class="__style_prefix__-rtlm-title bx-def-font-large">__title__</div>
                 <div class="__style_prefix__-rtlm-items">
                     <bx_repeat:contexts>
-                        <div class="__style_prefix__-rtlm-item bx-def-padding-thd-topbottom bx-clearfix">
-                            <div class="__style_prefix__-rtlm-checbox">__checkbox__</div>
-                            <div class="__style_prefix__-rtlm-unit bx-def-margin-left">__unit__</div>            
+                        <div class="__style_prefix__-rtlm-item py-1">
+                            <div class="__style_prefix__-rtlm-checbox ml-1">__checkbox__</div>
+                            <div class="__style_prefix__-rtlm-unit ml-4">__unit__</div>            
                         </div>
                     </bx_repeat:contexts>
                 </div>