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

Ticket #5319 - Timeline: Display style for filters.

AntonLV 9 месяцев назад
Родитель
Сommit
b41fdcf33a

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

@@ -82,6 +82,7 @@
     <string name="_bx_timeline_option_filters_style_default"><![CDATA[По умолчанию]]></string>
     <string name="_bx_timeline_option_filters_style_display"><![CDATA[Отображение]]></string>
     <string name="_bx_timeline_option_filters_contexts_hide"><![CDATA[Фильтры: По контекстам]]></string>
+    <string name="_bx_timeline_option_filters_media_hide"><![CDATA[Фильтры: По прикрепленному медиа]]></string>
     <string name="_bx_timeline_option_for_you_sources"><![CDATA[Лента 'Для Вас' состоит из]]></string>
     <string name="_bx_timeline_option_for_you_sources_err"><![CDATA[Для фида должен быть включен хотя бы один источник.]]></string>
     <string name="_bx_timeline_option_for_you_sources_public"><![CDATA[Публичная лента]]></string>
@@ -183,6 +184,7 @@
     <string name="_bx_timeline_form_filters_input_by_media"><![CDATA[Прикрепленные медиа:]]></string>
     <string name="_bx_timeline_form_filters_input_by_media_all"><![CDATA[Все]]></string>
     <string name="_bx_timeline_form_filters_input_by_media_selected"><![CDATA[Выборочно]]></string>
+    <string name="_bx_timeline_form_filters_input_by_media_text"><![CDATA[текст]]></string>
     <string name="_bx_timeline_form_filters_input_by_media_links"><![CDATA[ссылки]]></string>
     <string name="_bx_timeline_form_filters_input_by_media_images"><![CDATA[изображения]]></string>
     <string name="_bx_timeline_form_filters_input_by_media_videos"><![CDATA[видео]]></string>

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

@@ -37,6 +37,9 @@ class BxTimelineConfig extends BxBaseModNotificationsConfig
     protected $_aFiltersStyles;
     protected $_sFiltersStyle;
     protected $_aFiltersContextsHide;
+    protected $_aFiltersMediaAvailable;
+    protected $_aFiltersMediaHide;
+    protected $_aFiltersMedia;
 
     protected $_iRssLength;
     protected $_iLiveUpdateLength;
@@ -465,6 +468,7 @@ class BxTimelineConfig extends BxBaseModNotificationsConfig
     {
     	parent::init($oDb);
 
+        $sDbPrefix = $this->getDbPrefix();
     	$sOptionPrefix = $this->getPrefix('option');
     	$this->_bAllowEdit = getParam($sOptionPrefix . 'enable_edit') == 'on';
         $this->_bAllowDelete = getParam($sOptionPrefix . 'enable_delete') == 'on';
@@ -507,6 +511,16 @@ class BxTimelineConfig extends BxBaseModNotificationsConfig
         $this->_aFiltersStyles = ['default', 'display'];
         $this->_sFiltersStyle = getParam($sOptionPrefix . 'filters_style');
         $this->_aFiltersContextsHide = ($sValue = getParam($sOptionPrefix . 'filters_contexts_hide')) ? explode(',', $sValue) : [];        
+        $this->_aFiltersMediaAvailable = [
+            'text' => '',
+            'links' => $sDbPrefix . 'ef_links',
+            'images' => $sDbPrefix . 'ef_photos',
+            'videos' => $sDbPrefix . 'ef_videos',
+            'files' => $sDbPrefix . 'ef_files',
+            'polls' => $sDbPrefix . 'ef_polls'
+        ];
+        $this->_aFiltersMediaHide = ($sValue = getParam($sOptionPrefix . 'filters_media_hide')) ? explode(',', $sValue) : [];
+        $this->_aFiltersMedia = array_diff_key($this->_aFiltersMediaAvailable, array_flip($this->_aFiltersMediaHide));
 
         $this->_iRssLength = (int)getParam($sOptionPrefix . 'rss_length');
         $this->_iLiveUpdateLength = (int)getParam($sOptionPrefix . 'live_updates_length');
@@ -892,6 +906,21 @@ class BxTimelineConfig extends BxBaseModNotificationsConfig
         return $this->_aFiltersContextsHide;
     }
 
+    public function getFiltersMediaAvailable($bListOnly = true)
+    {
+        return $bListOnly ? array_keys($this->_aFiltersMediaAvailable) : $this->_aFiltersMediaAvailable;
+    }
+
+    public function getFiltersMediaHide()
+    {
+        return $this->_aFiltersMediaHide;
+    }
+
+    public function getFiltersMedia($bListOnly = true)
+    {
+        return $bListOnly ? array_keys($this->_aFiltersMedia) : $this->_aFiltersMedia;
+    }
+
     public function getRssLength()
     {
         return $this->_iRssLength;

+ 23 - 39
modules/boonex/timeline/classes/BxTimelineDb.php

@@ -13,7 +13,6 @@ class BxTimelineDb extends BxBaseModNotificationsDb
 {
     protected $_sTableSlice;
     protected $_sTableEvent2User;
-    protected $_aTablesEventFlags;
 
     protected $_sTableRepostsTrack;
     protected $_sTableHotTrack;
@@ -24,7 +23,7 @@ class BxTimelineDb extends BxBaseModNotificationsDb
     /*
      * Constructor.
      */
-    function __construct(&$oConfig)
+    public function __construct(&$oConfig)
     {
         parent::__construct($oConfig);
 
@@ -33,13 +32,6 @@ class BxTimelineDb extends BxBaseModNotificationsDb
         $this->_sTableAlias = 'te';
         $this->_sTableSlice = $this->_sPrefix . 'events_slice';
         $this->_sTableEvent2User = $this->_sPrefix . 'events2users';
-        $this->_aTablesEventFlags = [
-            'links' => $this->_sPrefix . 'ef_links',
-            'images' => $this->_sPrefix . 'ef_photos',
-            'videos' => $this->_sPrefix . 'ef_videos',
-            'files' => $this->_sPrefix . 'ef_files',
-            'polls' => $this->_sPrefix . 'ef_polls',
-        ];
 
         $this->_sTableRepostsTrack = $this->_sPrefix . 'reposts_track';
         $this->_sTableHotTrack = $this->_sPrefix . 'hot_track';
@@ -785,34 +777,31 @@ class BxTimelineDb extends BxBaseModNotificationsDb
         return $this->$sMethod($sSql);
     }
 
-    public function getEventFlagTypes()
-    {
-        return array_keys($this->_aTablesEventFlags);
-    }
-
     public function updateEventFlagsByType($sType, $iEventId)
     {
-        if(!isset($this->_aTablesEventFlags[$sType]))
+        $aTablesEventFlags = $this->_oConfig->getFiltersMedia(false);
+        if(empty($aTablesEventFlags[$sType]))
             return false;
 
-        return $this->query("INSERT IGNORE INTO `" . $this->_aTablesEventFlags[$sType] . "` (`event_id`) VALUES (:event_id)", [
+        return $this->query("INSERT IGNORE INTO `" . $aTablesEventFlags[$sType] . "` (`event_id`) VALUES (:event_id)", [
             'event_id' => $iEventId,
         ]) !== false;
     }
 
     public function deleteEventFlagsByType($sType, $iEventId)
     {
-        if(!isset($this->_aTablesEventFlags[$sType]))
+        $aTablesEventFlags = $this->_oConfig->getFiltersMedia(false);
+        if(empty($aTablesEventFlags[$sType]))
             return false;
 
-        return $this->query("DELETE FROM `" . $this->_aTablesEventFlags[$sType] . "` WHERE `event_id`=:event_id", [
+        return $this->query("DELETE FROM `" . $aTablesEventFlags[$sType] . "` WHERE `event_id`=:event_id", [
             'event_id' => $iEventId
         ]) !== false;
     }
 
     public function deleteEventFlags($iEventId)
     {
-        $aTypes = $this->getEventFlagTypes();
+        $aTypes = $this->_oConfig->getFiltersMedia();
         foreach($aTypes as $sType)
             $this->deleteEventFlagsByType($sType, $iEventId);
     }
@@ -1045,28 +1034,23 @@ class BxTimelineDb extends BxBaseModNotificationsDb
 
         //--- Apply media filter
         $sWhereClauseMedias = "";
-        if(!empty($aParams['media'])) {
-            if(is_array($aParams['media'])) {
-                $aMediaTypes = $aParams['media'];
-                if($aMediaTypes !== array_keys($this->_aTablesEventFlags)) {
-                    $sWhereSubclauseMedias = "0";
-                    foreach($aMediaTypes as $sMediaType) {
-                        if(!isset($this->_aTablesEventFlags[$sMediaType]))
-                            continue;
-
-                        $sTableAliasFlag = 't' . substr($sMediaType, 0, 2);
-                        $mixedJoinClause .= " LEFT JOIN `" . $this->_aTablesEventFlags[$sMediaType] . "` AS `{$sTableAliasFlag}` ON `{$sTableAlias}`.`id`=`{$sTableAliasFlag}`.`event_id`";
-                        $sWhereSubclauseMedias .= " OR NOT ISNULL(`{$sTableAliasFlag}`.`event_id`)";
-                    }
-                    $sWhereClauseMedias .= "AND ({$sWhereSubclauseMedias}) ";
+        if(($sKm = 'media') && !empty($aParams[$sKm])) {
+            $aTablesEventFlags = $this->_oConfig->getFiltersMedia(false);
+            if(is_array($aParams[$sKm]) && ($aMts = $aParams[$sKm]) && !(count($aMts) == 1 && empty($aTablesEventFlags[reset($aMts)])) && $aMts !== array_keys($aTablesEventFlags)) {
+                $sWhereSubclauseMedias = "0";
+                foreach($aMts as $sMt) {
+                    if(empty($aTablesEventFlags[$sMt]))
+                        continue;
+
+                    $sTableAliasFlag = 't' . substr($sMt, 0, 2);
+                    $mixedJoinClause .= " LEFT JOIN `" . $aTablesEventFlags[$sMt] . "` AS `{$sTableAliasFlag}` ON `{$sTableAlias}`.`id`=`{$sTableAliasFlag}`.`event_id`";
+                    $sWhereSubclauseMedias .= " OR NOT ISNULL(`{$sTableAliasFlag}`.`event_id`)";
                 }
+                $sWhereClauseMedias .= "AND ({$sWhereSubclauseMedias}) ";
             }
-            else {
-                $sMediaType = $aParams['media'];
-                if(isset($this->_aTablesEventFlags[$sMediaType])) {
-                    $sTableAliasFlag = 't' . substr($sMediaType, 0, 2);
-                    $mixedJoinClause .= " INNER JOIN `" . $this->_aTablesEventFlags[$sMediaType] . "` AS `{$sTableAliasFlag}` ON `{$sTableAlias}`.`id`=`{$sTableAliasFlag}`.`event_id`";
-                }
+            else if(is_string($aParams[$sKm]) && ($sMt = $aParams[$sKm]) && !empty($aTablesEventFlags[$sMt])) {
+                $sTableAliasFlag = 't' . substr($sMt, 0, 2);
+                $mixedJoinClause .= " INNER JOIN `" . $aTablesEventFlags[$sMt] . "` AS `{$sTableAliasFlag}` ON `{$sTableAlias}`.`id`=`{$sTableAliasFlag}`.`event_id`";
             }
         }
 

+ 29 - 3
modules/boonex/timeline/classes/BxTimelineModule.php

@@ -3466,11 +3466,9 @@ class BxTimelineModule extends BxBaseModNotificationsModule implements iBxDolCon
      */
     public function serviceGetOptionsFiltersContexts()
     {
-        $CNF = &$this->_oConfig->CNF;
-
         $aContexts = bx_srv('system', 'get_modules_by_type', ['context']);
         
-        $aResult = array();
+        $aResult = [];
         foreach($aContexts as $aContext)
             if(($sContext = $aContext['name']) && BxDolModuleQuery::getInstance()->isEnabledByName($sContext))
                 $aResult[$aContext['name']] = ($sLk = '_' . $sContext) && ($_sLk = _t($sLk)) && strcmp($sLk, $_sLk) != 0 ? $_sLk : $aContext['title'];
@@ -3478,6 +3476,34 @@ class BxTimelineModule extends BxBaseModNotificationsModule implements iBxDolCon
         return $aResult;
     }
 
+    /**
+     * @page service Service Calls
+     * @section bx_timeline Timeline
+     * @subsection bx_timeline-other Other
+     * @subsubsection bx_timeline-get_options_filters_media get_options_filters_media
+     * 
+     * @code bx_srv('bx_timeline', 'get_options_filters_media', [...]); @endcode
+     * 
+     * Get an array with available options for 'Filters: By media' setting.
+     *
+     * @return an array with available options represented as key => value pairs.
+     * 
+     * @see BxTimelineModule::serviceGetOptionsFiltersMedia
+     */
+    /** 
+     * @ref bx_timeline-get_options_filters_media "get_options_filters_media"
+     */
+    public function serviceGetOptionsFiltersMedia()
+    {
+        $aMedia = $this->_oConfig->getFiltersMediaAvailable();
+        
+        $aResult = [];
+        foreach($aMedia as $sMedia)
+            $aResult[$sMedia] = _t('_bx_timeline_form_filters_input_by_media_' . $sMedia);
+
+        return $aResult;
+    }
+
     /**
      * @page service Service Calls
      * @section bx_timeline Timeline

+ 3 - 3
modules/boonex/timeline/classes/BxTimelineTemplate.php

@@ -474,7 +474,7 @@ class BxTimelineTemplate extends BxBaseModNotificationsTemplate
                 ]
             ]);
 
-        $aFlagTypes = $this->_oDb->getEventFlagTypes();
+        $aFlagTypes = $this->_oConfig->getFiltersMedia();
         foreach($aFlagTypes as $sFt)
             $aInputs['media']['values'][] = ['key' => $sFt, 'value' => _t('_bx_timeline_form_filters_input_by_media_' . $sFt)];
 
@@ -576,7 +576,7 @@ class BxTimelineTemplate extends BxBaseModNotificationsTemplate
             ]);
 
         //--- by Media
-        $aFlagTypes = $this->_oDb->getEventFlagTypes();
+        $aFlagTypes = $this->_oConfig->getFiltersMedia();
 
         $aMedia = [];
         foreach($aFlagTypes as $sFt)
@@ -1846,7 +1846,7 @@ class BxTimelineTemplate extends BxBaseModNotificationsTemplate
 
         //--- Update Flags ---//
         $aContent = &$aResult['content'];
-        $aFlagTypes = $this->_oDb->getEventFlagTypes();
+        $aFlagTypes = $this->_oConfig->getFiltersMedia();
         foreach($aFlagTypes as $sFt)
             if((!empty($aContent[$sFt]) && is_array($aContent[$sFt])) || (!empty($aContent[$sFt . '_attach']) && is_array($aContent[$sFt .'_attach'])))
                 $this->_oDb->updateEventFlagsByType($sFt, $aEvent['id']);

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

@@ -82,6 +82,7 @@
     <string name="_bx_timeline_option_filters_style_default"><![CDATA[Default]]></string>
     <string name="_bx_timeline_option_filters_style_display"><![CDATA[Display]]></string>
     <string name="_bx_timeline_option_filters_contexts_hide"><![CDATA[Filters: By contexts]]></string>
+    <string name="_bx_timeline_option_filters_media_hide"><![CDATA[Filters: By media]]></string>
     <string name="_bx_timeline_option_for_you_sources"><![CDATA['For You' feed consists of]]></string>
     <string name="_bx_timeline_option_for_you_sources_err"><![CDATA[At least one source should be enabled for the feed.]]></string>
     <string name="_bx_timeline_option_for_you_sources_public"><![CDATA[Public]]></string>
@@ -183,6 +184,7 @@
     <string name="_bx_timeline_form_filters_input_by_media"><![CDATA[Attached media:]]></string>
     <string name="_bx_timeline_form_filters_input_by_media_all"><![CDATA[All]]></string>
     <string name="_bx_timeline_form_filters_input_by_media_selected"><![CDATA[Selected]]></string>
+    <string name="_bx_timeline_form_filters_input_by_media_text"><![CDATA[text]]></string>
     <string name="_bx_timeline_form_filters_input_by_media_links"><![CDATA[links]]></string>
     <string name="_bx_timeline_form_filters_input_by_media_images"><![CDATA[images]]></string>
     <string name="_bx_timeline_form_filters_input_by_media_videos"><![CDATA[videos]]></string>

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

@@ -349,7 +349,8 @@ INSERT INTO `sys_options` (`name`, `value`, `category_id`, `caption`, `type`, `c
 ('bx_timeline_extenals_every_feed_and_hot_preload', '0', @iCategId, '_bx_timeline_option_extenals_every_feed_and_hot_preload', 'digit', '', '', '', '', 49),
 
 ('bx_timeline_filters_style', 'default', @iCategId, '_bx_timeline_option_filters_style', 'select', '', '', '', 'a:2:{s:6:"module";s:11:"bx_timeline";s:6:"method";s:25:"get_options_filters_style";}', 70),
-('bx_timeline_filters_contexts_hide', '', @iCategId, '_bx_timeline_option_filters_contexts_hide', 'rlist', '', '', '', 'a:2:{s:6:"module";s:11:"bx_timeline";s:6:"method";s:28:"get_options_filters_contexts";}', 75);
+('bx_timeline_filters_contexts_hide', '', @iCategId, '_bx_timeline_option_filters_contexts_hide', 'rlist', '', '', '', 'a:2:{s:6:"module";s:11:"bx_timeline";s:6:"method";s:28:"get_options_filters_contexts";}', 75),
+('bx_timeline_filters_media_hide', '', @iCategId, '_bx_timeline_option_filters_media_hide', 'rlist', '', '', '', 'a:2:{s:6:"module";s:11:"bx_timeline";s:6:"method";s:25:"get_options_filters_media";}', 77);
 
 
 -- Category: Card