AntonLV 12 rokov pred
rodič
commit
0202fbd228

+ 7 - 37
get_rss_feed.php

@@ -9,44 +9,14 @@
 
 require_once('./inc/header.inc.php');
 
-$mixedBlockId = bx_process_input(bx_get('ID'));
+$sObject = bx_process_input(bx_get('object'));
+$mixedId = bx_process_input(bx_get('id'));
+$iUserId = bx_process_input(bx_get('member'), BX_DATA_INT);
 
-$aPredefinedRssFeeds = array (
-    'boonex_news' => 'http://www.boonex.com/unity/blog/featured_posts/?rss=1',
-    'boonex_version' => 'http://rss.boonex.com/',
-    'boonex_unity_market' => 'http://www.boonex.com/unity/extensions/latest/?rss=1',
-    'boonex_unity_lang_files' => 'http://www.boonex.com/unity/extensions/tag/translations&rss=1',
-    'boonex_unity_market_templates' => 'http://www.boonex.com/unity/extensions/tag/templates&rss=1',
-    'boonex_unity_market_featured' => 'http://www.boonex.com/unity/extensions/featured_posts?rss=1',
-);
+bx_import('BxDolRss');
+$oRss = BxDolRss::getObjectInstance($sObject);
 
-$sCont = "";
-
-$aMatches = array();
-$sPattern = "/((https?|ftp|news):\/\/)?([a-z]([a-z0-9\-]*\.)+(aero|arpa|biz|com|coop|edu|gov|info|int|jobs|mil|museum|name|nato|net|org|pro|travel|[a-z]{2})|(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))(\/[a-z0-9_\-\.~]+)*(\/([a-z0-9_\-\.]*)(\?[a-z0-9+_\-\.%=&]*)?)?(#[a-z][a-z0-9_]*)?/";
-if(preg_match($sPattern, $mixedBlockId, $aMatches))
-	$sCont = $aMatches[0];
-else if(isset($aPredefinedRssFeeds[$mixedBlockId]))
-    $sCont = $aPredefinedRssFeeds[$mixedBlockId];
-else {
-    bx_import('BxDolPageQuery');
-    $oPageQuery = new BxDolPageQuery(array());
-    $sCont = $oPageQuery->getPageBlockContent($mixedBlockId);
-
-    if (!$sCont)
-        exit;
-}
-
-list($sUrl) = explode( '#', $sCont );
-$sUrl = str_replace('{SiteUrl}', BX_DOL_URL_ROOT, $sUrl);
-
-$iMemID = bx_process_input(bx_get('member'), BX_DATA_INT);
-if ($iMemID) {
-    $aMember = getProfileInfo( $iMemID );
-    $sUrl = str_replace( '{NickName}', $aMember['NickName'], $sUrl );
-}
-
-header('Content-Type: text/xml; charset=utf-8');
-echo bx_file_get_contents($sUrl . (defined('BX_PROFILER') && BX_PROFILER && 0 == strncmp(BX_DOL_URL_ROOT, $sUrl, strlen(BX_DOL_URL_ROOT)) ? '&bx_profiler_disable=1' : ''));
+if($oRss)
+	echo $oRss->getFeed($mixedId, $iUserId);
 
 /** @} */

+ 72 - 0
inc/classes/BxDolRss.php

@@ -0,0 +1,72 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) BoonEx Pty Limited - http://www.boonex.com/
+ * CC-BY License - http://creativecommons.org/licenses/by/3.0/
+ *
+ * @defgroup    DolphinCore Dolphin Core
+ * @{
+ */
+
+bx_import('BxDolRssQuery');
+
+/**
+ * @page objects
+ * @section rss Rss
+ * @ref BxDolRss
+ */
+
+
+class BxDolRss extends BxDol implements iBxDolFactoryObject
+{
+	protected $_oDb;
+	protected $_sObject;
+    protected $_aObject;
+
+    public static $bInitialized = false;
+
+    /**
+     * Constructor
+     */
+    function __construct($aObject)
+    {
+        parent::__construct();
+
+        $this->_aObject = $aObject;
+        $this->_sObject = $aObject['object'];
+
+        $this->_oDb = new BxDolRssQuery($this->_aObject);
+    }
+
+   /**
+     * Get rss object instance by object name
+     * @param $sObject object name
+     * @return object instance or false on error
+     */
+    public static function getObjectInstance($sObject)
+    {
+        if(isset($GLOBALS['bxDolClasses']['BxDolRss!' . $sObject]))
+            return $GLOBALS['bxDolClasses']['BxDolRss!' . $sObject];
+
+        bx_import('BxDolRssQuery');
+        $aObject = BxDolRssQuery::getRssObject($sObject);
+        if(!$aObject || !is_array($aObject))
+            return false;
+
+        bx_import('BxTemplRss');
+        $sClass = 'BxTemplRss';
+        if(!empty($aObject['class_name'])) {
+            $sClass = $aObject['class_name'];
+            if(!empty($aObject['class_file']))
+                require_once(BX_DIRECTORY_PATH_ROOT . $aObject['class_file']);
+            else
+                bx_import($sClass);
+        }
+
+        $o = new $sClass($aObject);
+        return ($GLOBALS['bxDolClasses']['BxDolRss!' . $sObject] = $o);
+    }
+
+    public function getUrl($mixedId) {}
+}
+
+/** @} */

+ 39 - 0
inc/classes/BxDolRssBoonEx.php

@@ -0,0 +1,39 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) BoonEx Pty Limited - http://www.boonex.com/
+ * CC-BY License - http://creativecommons.org/licenses/by/3.0/
+ *
+ * @defgroup    DolphinCore Dolphin Core
+ * @{
+ */
+
+bx_import('BxTemplRss');
+
+class BxDolRssBoonEx extends BxTemplRss
+{
+	protected $aFeeds;
+
+    function __construct($aObject)
+    {
+        parent::__construct($aObject);
+
+        $this->aFeeds = array (
+        	'boonex_version' => 'http://rss.boonex.com/',
+
+		    'boonex_news' => 'http://www.boonex.com/unity/blog/featured_posts/?rss=1',
+		    'boonex_unity_market' => 'http://www.boonex.com/unity/extensions/latest/?rss=1',
+		    'boonex_unity_lang_files' => 'http://www.boonex.com/unity/extensions/tag/translations&rss=1',
+		    'boonex_unity_market_templates' => 'http://www.boonex.com/unity/extensions/tag/templates&rss=1',
+		    'boonex_unity_market_featured' => 'http://www.boonex.com/unity/extensions/featured_posts?rss=1',
+		);
+    }
+
+    public function getUrl($mixedId) {
+		if(!isset($this->aFeeds[$mixedId]))
+			return false;
+
+		return $this->aFeeds[$mixedId];
+    }
+}
+
+/** @} */

+ 35 - 0
inc/classes/BxDolRssPageBlock.php

@@ -0,0 +1,35 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) BoonEx Pty Limited - http://www.boonex.com/
+ * CC-BY License - http://creativecommons.org/licenses/by/3.0/
+ *
+ * @defgroup    DolphinCore Dolphin Core
+ * @{
+ */
+
+bx_import('BxTemplRss');
+
+class BxDolRssPageBlock extends BxTemplRss
+{
+    function __construct($aObject)
+    {
+        parent::__construct($aObject);
+    }
+
+    public function getUrl($mixedId) {
+    	bx_import('BxDolPageQuery');
+	    $oPageQuery = new BxDolPageQuery(array());
+
+	    $sContent = $oPageQuery->getPageBlockContent($mixedId);
+	    if(!$sContent)
+			return false;
+
+		list($sUrl) = explode('#', $sContent);
+		if(!$sUrl)
+			return false;
+
+		return $sUrl;
+    }
+}
+
+/** @} */

+ 35 - 0
inc/classes/BxDolRssQuery.php

@@ -0,0 +1,35 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) BoonEx Pty Limited - http://www.boonex.com/
+ * CC-BY License - http://creativecommons.org/licenses/by/3.0/
+ *
+ * @defgroup    DolphinCore Dolphin Core
+ * @{
+ */
+
+bx_import('BxDolDb');
+
+class BxDolRssQuery extends BxDolDb
+{
+
+    public function __construct($aObject = array())
+    {
+        parent::__construct();
+        $this->_aObject = $aObject;
+    }
+
+    static public function getRssObject($sObject)
+    {
+        $oDb = BxDolDb::getInstance();
+
+        $sQuery = $oDb->prepare("SELECT * FROM `sys_objects_rss` WHERE `object` = ?", $sObject);
+
+        $aObject = $oDb->getRow($sQuery);
+        if(!$aObject || !is_array($aObject))
+            return false;
+
+        return $aObject;
+    }
+}
+
+/** @} */

+ 3 - 2
inc/js/jquery.dolRSSFeed.js

@@ -12,14 +12,15 @@
 		return this.each( function(){
 
 			var $Cont = $(this);
+			var sRSSObject = $Cont.attr( 'rssobject' );
 			var iRSSID = $Cont.attr( 'rssid' );
-			if( !iRSSID && oOptions.forceUrl == undefined )
+			if((!iRSSID || !sRSSObject) && oOptions.forceUrl == undefined)
 				return false;
 
 			var iMaxNum = parseInt( $Cont.attr( 'rssnum' ) || 0 );
 			var iMemID  = parseInt( $Cont.attr( 'member' ) || 0 );
 
-			var sFeedURL = (oOptions.forceUrl != undefined) ? oOptions.forceUrl : sUrlRoot + 'get_rss_feed.php?ID=' + iRSSID + '&member=' + iMemID;
+			var sFeedURL = (oOptions.forceUrl != undefined) ? oOptions.forceUrl : sUrlRoot + 'get_rss_feed.php?object=' + sRSSObject + '&id=' + iRSSID + '&member=' + iMemID;
 
             bx_loading_animate($(this).find('.bx-loading-ajax'));
 

+ 21 - 1
install/sql/system.sql

@@ -5,7 +5,7 @@
 -- --------------------------------------------------------
 
 SET NAMES 'utf8';
-DROP TABLE IF EXISTS `sys_keys`, `sys_objects_editor`, `sys_objects_captcha`, `sys_objects_social_sharing`, `sys_objects_cmts`, `sys_cmts_images`, `sys_cmts_images_preview`, `sys_cmts_images2entries`, `sys_email_templates`, `sys_options`, sys_options_types, `sys_options_categories`, `sys_localization_categories`, `sys_localization_keys`, `sys_localization_languages`, `sys_localization_strings`, `sys_acl_actions`, `sys_acl_actions_track`, `sys_acl_matrix`, `sys_acl_levels`, `sys_sessions`, `sys_acl_levels_members`, `sys_objects_search`, `sys_stat_site`, `sys_alerts`, `sys_alerts_handlers`, `sys_injections`, `sys_injections_admin`, `sys_modules`, `sys_modules_file_tracks`, `sys_modules_relations`, `sys_permalinks`, `sys_objects_privacy`, `sys_privacy_defaults`, `sys_privacy_groups`, `sys_objects_auths`, `sys_objects_vote`, `sys_objects_view`, `sys_cron_jobs`, `sys_objects_storage`, `sys_objects_uploader`, `sys_storage_user_quotas`, `sys_storage_tokens`, `sys_storage_ghosts`, `sys_storage_deletions`, `sys_storage_mime_types`, `sys_objects_transcoder_images`, `sys_transcoder_images_files`, `sys_transcoder_images_filters`, `sys_accounts`, `sys_profiles`, `sys_objects_form`, `sys_form_displays`, `sys_form_inputs`, `sys_form_display_inputs`, `sys_form_pre_lists`, `sys_form_pre_values`, `sys_menu_templates`, `sys_objects_menu`, `sys_menu_sets`, `sys_menu_items`, `sys_objects_grid`, `sys_grid_fields`, `sys_grid_actions`, `sys_objects_connection`, `sys_profiles_conn_subscriptions`, `sys_profiles_conn_friends`, `sys_objects_page`, `sys_pages_layouts`, `sys_pages_design_boxes`, `sys_pages_blocks`, `sys_images`, `sys_std_pages`, `sys_std_widgets`, `sys_std_pages_widgets`;
+DROP TABLE IF EXISTS `sys_keys`, `sys_objects_editor`, `sys_objects_captcha`, `sys_objects_social_sharing`, `sys_objects_cmts`, `sys_cmts_images`, `sys_cmts_images_preview`, `sys_cmts_images2entries`, `sys_email_templates`, `sys_options`, sys_options_types, `sys_options_categories`, `sys_localization_categories`, `sys_localization_keys`, `sys_localization_languages`, `sys_localization_strings`, `sys_acl_actions`, `sys_acl_actions_track`, `sys_acl_matrix`, `sys_acl_levels`, `sys_sessions`, `sys_acl_levels_members`, `sys_objects_rss`, `sys_objects_search`, `sys_stat_site`, `sys_alerts`, `sys_alerts_handlers`, `sys_injections`, `sys_injections_admin`, `sys_modules`, `sys_modules_file_tracks`, `sys_modules_relations`, `sys_permalinks`, `sys_objects_privacy`, `sys_privacy_defaults`, `sys_privacy_groups`, `sys_objects_auths`, `sys_objects_vote`, `sys_objects_view`, `sys_cron_jobs`, `sys_objects_storage`, `sys_objects_uploader`, `sys_storage_user_quotas`, `sys_storage_tokens`, `sys_storage_ghosts`, `sys_storage_deletions`, `sys_storage_mime_types`, `sys_objects_transcoder_images`, `sys_transcoder_images_files`, `sys_transcoder_images_filters`, `sys_accounts`, `sys_profiles`, `sys_objects_form`, `sys_form_displays`, `sys_form_inputs`, `sys_form_display_inputs`, `sys_form_pre_lists`, `sys_form_pre_values`, `sys_menu_templates`, `sys_objects_menu`, `sys_menu_sets`, `sys_menu_items`, `sys_objects_grid`, `sys_grid_fields`, `sys_grid_actions`, `sys_objects_connection`, `sys_profiles_conn_subscriptions`, `sys_profiles_conn_friends`, `sys_objects_page`, `sys_pages_layouts`, `sys_pages_design_boxes`, `sys_pages_blocks`, `sys_images`, `sys_std_pages`, `sys_std_widgets`, `sys_std_pages_widgets`;
 ALTER DATABASE DEFAULT CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci';
 
 
@@ -654,6 +654,26 @@ CREATE TABLE `sys_stat_site` (
   PRIMARY KEY  (`ID`)
 ) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
 
+-- --------------------------------------------------------
+
+--
+-- Table structure for table 'sys_objects_rss'
+--
+
+CREATE TABLE `sys_objects_rss` (
+  `id` int(11) NOT NULL auto_increment,
+  `object` varchar(64) NOT NULL,
+  `class_name` varchar(32) NOT NULL default '',
+  `class_file` varchar(256) NOT NULL default '',
+  PRIMARY KEY  (`id`)
+) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
+
+INSERT INTO `sys_objects_rss` (`object`, `class_name`, `class_file`) VALUES
+('sys_boonex', 'BxDolRssBoonEx', ''),
+('sys_page_block', 'BxDolRssPageBlock', ''),
+('sys_studio_page_help', 'BxDolStudioRssPageHelp', ''),
+('sys_studio_module_help', 'BxDolStudioRssModuleHelp', '');
+
 
 -- --------------------------------------------------------
 

+ 23 - 0
modules/boonex/uni/data/template/system/scripts/BxTemplRss.php

@@ -0,0 +1,23 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) BoonEx Pty Limited - http://www.boonex.com/
+ * CC-BY License - http://creativecommons.org/licenses/by/3.0/
+ *
+ * @defgroup    DolphinCore Dolphin Core
+ * @{
+ */
+
+bx_import('BxBaseRss');
+
+/**
+ * @see BxDolGrid
+ */
+class BxTemplRss extends BxBaseRss
+{
+    public function __construct ($aOptions, $oTemplate = false)
+    {
+        parent::__construct ($aOptions, $oTemplate);
+    }
+}
+
+/** @} */

+ 2 - 1
studio/classes/BxDolStudioDashboard.php

@@ -25,7 +25,8 @@ class BxDolStudioDashboard extends BxTemplStudioPage
                 case 'check_update_script':
                     $aResult = array();
 
-                    $sContent = bx_file_get_contents(BX_DOL_URL_ROOT . 'get_rss_feed.php?ID=boonex_version&member=0');
+                    bx_import('BxDolRss');
+                    $sContent = BxDolRss::getObjectInstance('sys_boonex')->getFeed('boonex_version');
                     if(empty($sContent))
                         break;
 

+ 1 - 1
template/rss_holder.html

@@ -1,3 +1,3 @@
-    <div class="RSSAggrCont" rssid="__rss_id__" rssnum="__rss_num__" member="__member_id__">
+    <div class="RSSAggrCont" rssobject="__rss_object__" rssid="__rss_id__" rssnum="__rss_num__" member="__member_id__">
         <div class="bx-loading-ajax bx-def-margin-top bx-def-margin-bottom" style="position:static;"><div class="bx-loading-ajax-rotating"></div></div>
     </div>

+ 0 - 37
template/scripts/BxBaseFunctions.php

@@ -126,43 +126,6 @@ class BxBaseFunctions extends BxDol implements iBxDolSingleton
         return '<div class="sys_icon">' . ($sUrl ? '<a title="'.$sName.'" href="'.$sUrl.'">' : '') . '<img alt="'.$sName.'" src="'.$sIcon.'" '.($iWidth ? 'width='.$iWidth : '').' />' . ($sUrl ? '</a>' : '') . '</div>';
     }
 
-    /**
-     * Outputs holder html for dynamically loaded RSS.
-     * It automatically adds necessary js, css files and make injection into HTML HEAD section.
-     * @param $mixedRssId - system rss name, or current block id (if inserted into builder page)
-     * @param $iRssNum - numbr of rss items to disolay
-     * @param $iMemberId - optional member id
-     */
-    function getRssHolder ($mixedRssId, $iRssNum, $iMemberId = 0)
-    {
-        if (!isset($GLOBALS['gbBxSysIsRssInitialized']) || !$GLOBALS['gbBxSysIsRssInitialized']) {
-
-            $this->_oTemplate->addCss(array(
-                'rss.css',
-            ));
-
-            $this->_oTemplate->addJs(array(
-                'jquery.jfeed.pack.js',
-                'jquery.dolRSSFeed.js',
-            ));
-
-            $this->_oTemplate->addInjection ('injection_head', 'text', '
-                <script type="text/javascript" language="javascript">
-                    $(document).ready( function() {
-                        $("div.RSSAggrCont").dolRSSFeed();
-                    });
-                </script>');
-
-            $GLOBALS['gbBxSysIsRssInitialized'] = true;
-        }
-
-        return $this->_oTemplate->parseHtmlByName('rss_holder.html', array (
-            'rss_id' => $mixedRssId,
-            'rss_num' => $iRssNum,
-            'member_id' => $iMemberId,
-        ));
-    }
-
     /**
      * functions for limiting maximal string length
      */

+ 2 - 2
template/scripts/BxBasePage.php

@@ -258,8 +258,8 @@ class BxBasePage extends BxDolPage
         list( $sUrl, $iNum ) = explode('#', $aBlock['content']);
         $iNum = (int)$iNum;
 
-        bx_import('BxTemplFunctions');
-        return BxTemplFunctions::getInstance()->getRssHolder ($aBlock['id'], $iNum);
+        bx_import('BxDolRss');
+        return BxDolRss::getObjectInstance('sys_page_block')->getHolder($aBlock['id'], $iNum);
     }
 
     /**

+ 93 - 0
template/scripts/BxBaseRss.php

@@ -0,0 +1,93 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) BoonEx Pty Limited - http://www.boonex.com/
+ * CC-BY License - http://creativecommons.org/licenses/by/3.0/
+ *
+ * @defgroup    DolphinCore Dolphin Core
+ * @{
+ */
+
+bx_import('BxDolRss');
+
+/**
+ * Privacy representation.
+ * @see BxDolPrivacy
+ */
+class BxBaseRss extends BxDolRss
+{
+    protected $_oTemplate;
+
+    public function __construct ($aOptions, $oTemplate)
+    {
+        parent::__construct ($aOptions);
+
+        if ($oTemplate)
+            $this->_oTemplate = $oTemplate;
+        else
+            $this->_oTemplate = BxDolTemplate::getInstance();
+    }
+
+    public function getFeed($mixedId, $iUserId = 0)
+    {
+    	$sUrl = $this->getUrl($mixedId);
+
+    	$aMarkers = array('SiteUrl' => BX_DOL_URL_ROOT);
+
+    	if($iUserId) {
+	    	bx_import('BxDolProfile');
+	        $oProfile = BxDolProfile::getInstance($iUserId);
+	        if(!$oProfile) {
+	            bx_import('BxDolProfileUndefined');
+	            $oProfile = BxDolProfileUndefined::getInstance();
+	        }
+
+	        $aMarkers['NickName'] =  $oProfile->getDisplayName();
+		}
+
+    	$sUrl = bx_replace_markers($sUrl, $aMarkers);
+
+		header('Content-Type: text/xml; charset=utf-8');
+		return bx_file_get_contents($sUrl . (defined('BX_PROFILER') && BX_PROFILER && 0 == strncmp(BX_DOL_URL_ROOT, $sUrl, strlen(BX_DOL_URL_ROOT)) ? '&bx_profiler_disable=1' : ''));
+    }
+
+	/**
+     * Outputs holder html for dynamically loaded RSS.
+     * It automatically adds necessary js, css files and make injection into HTML HEAD section.
+     * @param $mixedRssId - system rss name, or current block id (if inserted into builder page)
+     * @param $iRssNum - numbr of rss items to disolay
+     * @param $iMemberId - optional member id
+     */
+    public function getHolder($mixedRssId, $iRssNum, $iMemberId = 0, $bInit = true)
+    {
+        if($bInit && !self::$bInitialized) {
+			$this->_addJsCss();
+            $this->_addInjection();
+
+            self::$bInitialized = true;
+        }
+
+        return $this->_oTemplate->parseHtmlByName('rss_holder.html', array (
+        	'rss_object' => $this->_sObject,
+            'rss_id' => $mixedRssId,
+            'rss_num' => $iRssNum,
+            'member_id' => $iMemberId,
+        ));
+    }
+
+    protected function _addJsCss()
+    {
+        $this->_oTemplate->addCss(array('rss.css'));
+        $this->_oTemplate->addJs(array(
+			'jquery.jfeed.pack.js',
+            'jquery.dolRSSFeed.js',
+		));
+    }
+
+    protected function _addInjection()
+    {
+    	$sContent = $this->_oTemplate->_wrapInTagJsCode('$(document).ready(function() {$("div.RSSAggrCont").dolRSSFeed();});');
+    	$this->_oTemplate->addInjection ('injection_head', 'text', $sContent);
+    }
+}
+
+/** @} */