Kaynağa Gözat

Ticket #4662 - Labels/Hashtags: Multi words labels incorrectly parsed when selected as hashtag.

AntonLV 2 yıl önce
ebeveyn
işleme
0226d72623

+ 48 - 16
inc/classes/BxDolMetatags.php

@@ -145,7 +145,8 @@
 class BxDolMetatags extends BxDolFactory implements iBxDolFactoryObject
 {
     protected static $_aLocationKeys = ['lat', 'lng', 'country', 'state', 'city', 'zip', 'street', 'street_number'];
-    
+    protected static $_sKeywordPattern = '/[\pCc\pZ\p{Ps}\p{Pe}\p{Pi}\p{Pf}]\#(\pL[\pL\pN_]+)/u';
+            
     protected $_sObject;
     protected $_aObject;
     protected $_oQuery;
@@ -197,6 +198,51 @@ class BxDolMetatags extends BxDolFactory implements iBxDolFactoryObject
         return ($GLOBALS['bxDolClasses']['BxDolMetatags!'.$sObject] = $o);
     }
 
+    /**
+     * Get metatags by term
+     * @param string $sMeta - 'keywords' is only supported meta for now
+     * @param type $sMetaItem
+     * @param type $sTerm
+     * @return type
+     */
+    static public function getMetatagsDataByTerm($sMeta, $sMetaItem, $sTerm)
+    {
+        $bHashtagsOnly = getParam('sys_metatags_hashtags_only') == 'on';
+        $aLabels = []; 
+        if($bHashtagsOnly)
+            $aLabels = array_map(function($sValue) {return strtolower($sValue);}, BxDolLabel::getInstance()->getLabels(['type' => 'values']));
+
+        $aValues = [];
+        $aObjects = BxDolMetatagsQuery::getMetatagsObjects();
+        foreach($aObjects as $aObject) {
+            $oObject = BxDolMetatags::getObjectInstance($aObject['object']);
+            if(!$oObject || !$oObject->{$sMeta . 'IsEnabled'}())
+                continue;
+
+            $sMethod = $sMeta . 'GetByTerm';
+            if(!method_exists($oObject->_oQuery, $sMethod))
+                continue;
+
+            $aData = $oObject->_oQuery->$sMethod($sTerm);
+            foreach($aData as $aMeta) {
+                if($bHashtagsOnly && in_array(strtolower($aMeta[$sMetaItem]), $aLabels))
+                    continue;
+
+                $aMatch = [];
+                if(!preg_match(self::$_sKeywordPattern, ' #' . $aMeta[$sMetaItem], $aMatch) || !isset($aMatch[1]) || strcasecmp($aMeta[$sMetaItem], $aMatch[1]) != 0) 
+                    continue;
+
+                $aValues[$aMeta[$sMetaItem]] = [
+                    'id' => $aMeta['object_id'], 
+                    'meta' => $aMeta[$sMetaItem], 
+                    'url' => $oObject->keywordsGetHashTagUrl($aMeta[$sMetaItem], $aMeta['object_id'])
+                ];
+            }
+        }
+
+        return $aValues;
+    }
+
     /**
      * Add all available meta tags to the head section 
      * @return number of successfully added metas
@@ -322,7 +368,7 @@ class BxDolMetatags extends BxDolFactory implements iBxDolFactoryObject
         // process spaces
         $s = str_ireplace(' ', ' ', $s);
         
-        return $this->_metaAdd($iId, ' ' . $s, '/[\pCc\pZ\p{Ps}\p{Pe}\p{Pi}\p{Pf}]\#(\pL[\pL\pN_]+)/u', 'keywordsDelete', 'keywordsAdd', 'keywordsGet', (int)getParam('sys_metatags_hashtags_max'), 'keyword');
+        return $this->_metaAdd($iId, ' ' . $s, self::$_sKeywordPattern, 'keywordsDelete', 'keywordsAdd', 'keywordsGet', (int)getParam('sys_metatags_hashtags_max'), 'keyword');
     }
 
     /**
@@ -687,20 +733,6 @@ class BxDolMetatags extends BxDolFactory implements iBxDolFactoryObject
         return $aRet;
     }
     
-    static public function getMetatagsDataByTerm($sMeta, $sMetaItem, $sTerm)
-    {
-        $aValues = [];
-        $aObjects = BxDolMetatagsQuery::getMetatagsObjects();
-        foreach ($aObjects as $aObject) {
-            $oObject = BxDolMetatags::getObjectInstance($aObject['object']);
-            $aData = call_user_func_array(array($oObject->_oQuery, $sMeta . 'GetByTerm'), [$sTerm]);
-            foreach ($aData as $aMeta) {
-                $aValues[$aMeta[$sMetaItem]] = ['id' => $aMeta['object_id'], 'meta' => $aMeta[$sMetaItem], 'url' => $oObject->keywordsGetHashTagUrl($aMeta[$sMetaItem], $aMeta['object_id'])];
-            }
-        }
-        return $aValues;
-    }
-    
     /**
      * Add location for the content from POST data
      * @param $iId content id

+ 3 - 2
install/sql/system.sql

@@ -553,8 +553,9 @@ INSERT INTO `sys_options`(`category_id`, `name`, `caption`, `value`, `type`, `ex
 (@iCategoryId, 'sys_live_search_limit', '_adm_stg_cpt_option_sys_live_search_limit', '5', 'digit', '', '', '', 22),
 (@iCategoryId, 'sys_profiles_search_limit', '_adm_stg_cpt_option_sys_profiles_search_limit', '20', 'digit', '', '', '', 23),
 
-(@iCategoryId, 'sys_metatags_hashtags_max', '_adm_stg_cpt_option_sys_metatags_hashtags_max', '9', 'digit', '', '', '', 30),
-(@iCategoryId, 'sys_metatags_mentions_max', '_adm_stg_cpt_option_sys_metatags_mentions_max', '9', 'digit', '', '', '', 31),
+(@iCategoryId, 'sys_metatags_hashtags_only', '_adm_stg_cpt_option_sys_metatags_hashtags_only', '', 'checkbox', '', '', '', 30),
+(@iCategoryId, 'sys_metatags_hashtags_max', '_adm_stg_cpt_option_sys_metatags_hashtags_max', '9', 'digit', '', '', '', 31),
+(@iCategoryId, 'sys_metatags_mentions_max', '_adm_stg_cpt_option_sys_metatags_mentions_max', '9', 'digit', '', '', '', 32),
 (@iCategoryId, 'sys_attach_links_max', '_adm_stg_cpt_option_sys_attach_links_max', '0', 'digit', '', '', '', 35),
 
 (@iCategoryId, 'sys_profile_bot', '_adm_stg_cpt_option_sys_profile_bot', '', 'select', 'a:3:{s:6:"module";s:6:"system";s:6:"method";s:23:"get_options_profile_bot";s:5:"class";s:13:"TemplServices";}', '', '', 40),

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

@@ -1727,6 +1727,7 @@
     <string name="_adm_stg_cpt_option_sys_quill_toolbar_mini"><![CDATA[Quill buttons for mini editor]]></string>
     <string name="_adm_stg_cpt_option_sys_quill_toolbar_standard"><![CDATA[Quill buttons for standard editor]]></string>
     <string name="_adm_stg_cpt_option_sys_quill_toolbar_full"><![CDATA[Quill buttons for full editor]]></string>
+    <string name="_adm_stg_cpt_option_sys_metatags_hashtags_only"><![CDATA[Filter out labels from hashtag suggestion list]]></string>
     <string name="_adm_stg_cpt_option_sys_metatags_hashtags_max"><![CDATA[Max number of hashtags per post]]></string>
     <string name="_adm_stg_cpt_option_sys_metatags_mentions_max"><![CDATA[Max number of mentions per post]]></string>
     <string name="_adm_stg_cpt_option_sys_attach_links_max"><![CDATA[Max number of attached links per post (0 - no limit)]]></string>

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

@@ -1702,6 +1702,7 @@
     <string name="_adm_stg_cpt_option_sys_quill_toolbar_mini"><![CDATA[Quill кнопки для мини редактора]]></string>
     <string name="_adm_stg_cpt_option_sys_quill_toolbar_standard"><![CDATA[Quill кнопки для стандартного редактора]]></string>
     <string name="_adm_stg_cpt_option_sys_quill_toolbar_full"><![CDATA[Quill buttons кнопки для полного редактора]]></string>
+    <string name="_adm_stg_cpt_option_sys_metatags_hashtags_only"><![CDATA[Отфильтровать ярлыки из списка предлагаемых хэштегов]]></string>
     <string name="_adm_stg_cpt_option_sys_metatags_hashtags_max"><![CDATA[Максимальное число хэш-тагов в одной публикации]]></string>
     <string name="_adm_stg_cpt_option_sys_metatags_mentions_max"><![CDATA[Максимальное число упоминаний кого-либо в одной публикации]]></string>
     <string name="_adm_stg_cpt_option_sys_attach_links_max"><![CDATA[Максимальное число присоединенных ссылок к одной публикации (0 - без ограничений)]]></string>