/components/com_rss/rss.php
PHP | 307 lines | 219 code | 40 blank | 48 comment | 26 complexity | c45e84ca8c94df886a578585e3784253 MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.1
- <?php
- /**
- * @version $Id: rss.php 10002 2008-02-08 10:56:57Z willebil $
- * @package Joomla
- * @subpackage Syndicate
- * @copyright Copyright (C) 2005 Open Source Matters. All rights reserved.
- * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL, see LICENSE.php
- * Joomla! is free software. This version may have been modified pursuant
- * to the GNU General Public License, and as distributed it includes or
- * is derivative of works licensed under the GNU General Public License or
- * other free or open source software licenses.
- * See COPYRIGHT.php for copyright notices and details.
- */
- // no direct access
- defined( '_VALID_MOS' ) or die( 'Restricted access' );
- // load feed creator class
- require_once( $mosConfig_absolute_path .'/includes/feedcreator.class.php' );
- $info = null;
- $rss = null;
- switch ( $task ) {
- case 'live_bookmark':
- feedFrontpage( false );
- break;
- default:
- feedFrontpage( true );
- break;
- }
- /*
- * Creates feed from Content Iems associated to teh frontpage component
- */
- function feedFrontpage( $showFeed ) {
- global $database, $mainframe;
- global $mosConfig_live_site, $mosConfig_cachepath;
- $nullDate = $database->getNullDate();
- // pull id of syndication component
- $query = "SELECT a.id"
- . "\n FROM #__components AS a"
- . "\n WHERE ( a.admin_menu_link = 'option=com_syndicate' OR a.admin_menu_link = 'option=com_syndicate&hidemainmenu=1' )"
- . "\n AND a.option = 'com_syndicate'"
- ;
- $database->setQuery( $query );
- $id = $database->loadResult();
- // load syndication parameters
- $component = new mosComponent( $database );
- $component->load( (int)$id );
- $params = new mosParameters( $component->params );
- // test if security check is enbled
- $check = $params->def( 'check', 1 );
- if($check) {
- // test if rssfeed module is published
- // if not disable access
- $query = "SELECT m.id"
- . "\n FROM #__modules AS m"
- . "\n WHERE m.module = 'mod_rssfeed'"
- . "\n AND m.published = 1"
- ;
- $database->setQuery( $query );
- $check = $database->loadResultArray();
- if(empty($check)) {
- mosNotAuth();
- return;
- }
- }
-
- $now = _CURRENT_SERVER_TIME;
- $iso = split( '=', _ISO );
- // parameter intilization
- $info[ 'date' ] = date( 'r' );
- $info[ 'year' ] = date( 'Y' );
- $info[ 'encoding' ] = $iso[1];
- $info[ 'link' ] = htmlspecialchars( $mosConfig_live_site );
- $info[ 'cache' ] = $params->def( 'cache', 1 );
- $info[ 'cache_time' ] = $params->def( 'cache_time', 3600 );
- $info[ 'count' ] = $params->def( 'count', 5 );
- $info[ 'orderby' ] = $params->def( 'orderby', '' );
- $info[ 'title' ] = $params->def( 'title', 'Joomla! powered Site' );
- $info[ 'description' ] = $params->def( 'description', 'Joomla! site syndication' );
- $info[ 'image_file' ] = $params->def( 'image_file', 'joomla_rss.png' );
- if ( $info[ 'image_file' ] == -1 ) {
- $info[ 'image' ] = NULL;
- } else{
- $info[ 'image' ] = $mosConfig_live_site .'/images/M_images/'. $info[ 'image_file' ];
- }
- $info[ 'image_alt' ] = $params->def( 'image_alt', 'Powered by Joomla!' );
- $info[ 'limit_text' ] = $params->def( 'limit_text', 0 );
- $info[ 'text_length' ] = $params->def( 'text_length', 20 );
- // get feed type from url
- $info[ 'feed' ] = strval( mosGetParam( $_GET, 'feed', 'RSS2.0' ) );
- // live bookmarks
- $info[ 'live_bookmark' ] = $params->def( 'live_bookmark', '' );
- $info[ 'bookmark_file' ] = $params->def( 'bookmark_file', '' );
- // set filename for live bookmarks feed
- if ( !$showFeed & $info[ 'live_bookmark' ] ) {
- if ( $info[ 'bookmark_file' ] ) {
- // custom bookmark filename
- $filename = $info[ 'bookmark_file' ];
- } else {
- // standard bookmark filename
- $filename = $info[ 'live_bookmark' ];
- }
- } else {
- // set filename for rss feeds
- $info[ 'file' ] = strtolower( str_replace( '.', '', $info[ 'feed' ] ) );
-
- // security check to limit arbitrary file creation.
- // and to allow disabling/enabling of selected feed types
- switch ( $info[ 'file' ] ) {
- case 'rss091':
- if ( !$params->get( 'rss091', 1 ) ) {
- echo _NOT_AUTH;
- return;
- }
- break;
- case 'rss10':
- if ( !$params->get( 'rss10', 1 ) ) {
- echo _NOT_AUTH;
- return;
- }
- break;
-
- case 'rss20':
- if ( !$params->get( 'rss20', 1 ) ) {
- echo _NOT_AUTH;
- return;
- }
- break;
-
- case 'atom03':
- if ( !$params->get( 'atom03', 1 ) ) {
- echo _NOT_AUTH;
- return;
- }
- break;
-
- case 'opml':
- if ( !$params->get( 'opml', 1 ) ) {
- echo _NOT_AUTH;
- return;
- }
- break;
-
-
- default:
- echo _NOT_AUTH;
- return;
- break;
- }
- }
- $filename = $info[ 'file' ] .'.xml';
-
- // security check to stop server path disclosure
- if ( strstr( $filename, '/' ) ) {
- echo _NOT_AUTH;
- return;
- }
- $info[ 'file' ] = $mosConfig_cachepath .'/'. $filename;
- // load feed creator class
- $rss = new UniversalFeedCreator();
- // load image creator class
- $image = new FeedImage();
- // loads cache file
- if ( $showFeed && $info[ 'cache' ] ) {
- $rss->useCached( $info[ 'feed' ], $info[ 'file' ], $info[ 'cache_time' ] );
- }
- $rss->title = $info[ 'title' ];
- $rss->description = $info[ 'description' ];
- $rss->link = $info[ 'link' ];
- $rss->syndicationURL = $info[ 'link' ];
- $rss->cssStyleSheet = NULL;
- $rss->encoding = $info[ 'encoding' ];
- if ( $info[ 'image' ] ) {
- $image->url = $info[ 'image' ];
- $image->link = $info[ 'link' ];
- $image->title = $info[ 'image_alt' ];
- $image->description = $info[ 'description' ];
- // loads image info into rss array
- $rss->image = $image;
- }
- // Determine ordering for sql
- switch ( strtolower( $info[ 'orderby' ] ) ) {
- case 'date':
- $orderby = 'a.created';
- break;
- case 'rdate':
- $orderby = 'a.created DESC';
- break;
- case 'alpha':
- $orderby = 'a.title';
- break;
- case 'ralpha':
- $orderby = 'a.title DESC';
- break;
- case 'hits':
- $orderby = 'a.hits DESC';
- break;
- case 'rhits':
- $orderby = 'a.hits ASC';
- break;
- case 'front':
- $orderby = 'f.ordering';
- break;
- default:
- $orderby = 'f.ordering';
- break;
- }
- // query of frontpage content items
- $query = "SELECT a.*, u.name AS author, u.usertype, UNIX_TIMESTAMP( a.created ) AS created_ts, cat.title AS cat_title, sec.title AS section_title"
- . "\n FROM #__content AS a"
- . "\n INNER JOIN #__content_frontpage AS f ON f.content_id = a.id"
- . "\n LEFT JOIN #__users AS u ON u.id = a.created_by"
- . "\n LEFT JOIN #__categories AS cat ON cat.id = a.catid"
- . "\n LEFT JOIN #__sections AS sec ON sec.id = a.sectionid"
- . "\n WHERE a.state = 1"
- . "\n AND cat.published = 1"
- . "\n AND sec.published = 1"
- . "\n AND a.access = 0"
- . "\n AND cat.access = 0"
- . "\n AND sec.access = 0"
- . "\n AND ( a.publish_up = " . $database->Quote( $nullDate ) . " OR a.publish_up <= " . $database->Quote( $now ) . " )"
- . "\n AND ( a.publish_down = " . $database->Quote( $nullDate ) . " OR a.publish_down >= " . $database->Quote( $now ) . " )"
- . "\n ORDER BY $orderby"
- ;
- $database->setQuery( $query, 0, $info[ 'count' ] );
- $rows = $database->loadObjectList();
- foreach ( $rows as $row ) {
- // title for particular item
- $item_title = htmlspecialchars( $row->title );
- $item_title = html_entity_decode( $item_title );
- // url link to article
- // & used instead of & as this is converted by feed creator
- $_Itemid = '';
- $itemid = $mainframe->getItemid( $row->id );
- if ($itemid) {
- $_Itemid = '&Itemid='. $itemid;
- }
-
- $item_link = 'index.php?option=com_content&task=view&id='. $row->id . $_Itemid;
- $item_link = sefRelToAbs( $item_link );
- // removes all formating from the intro text for the description text
- $item_description = $row->introtext;
- $item_description = mosHTML::cleanText( $item_description );
- $item_description = html_entity_decode( $item_description );
- if ( $info[ 'limit_text' ] ) {
- if ( $info[ 'text_length' ] ) {
- // limits description text to x words
- $item_description_array = split( ' ', $item_description );
- $count = count( $item_description_array );
- if ( $count > $info[ 'text_length' ] ) {
- $item_description = '';
- for ( $a = 0; $a < $info[ 'text_length' ]; $a++ ) {
- $item_description .= $item_description_array[$a]. ' ';
- }
- $item_description = trim( $item_description );
- $item_description .= '...';
- }
- } else {
- // do not include description when text_length = 0
- $item_description = NULL;
- }
- }
- // load individual item creator class
- $item = new FeedItem();
- // item info
- $item->title = $item_title;
- $item->link = $item_link;
- $item->description = $item_description;
- $item->source = $info[ 'link' ];
- $item->date = date( 'r', $row->created_ts );
- $item->category = $row->section_title . ' - ' . $row->cat_title;
- // loads item info into rss array
- $rss->addItem( $item );
- }
- // save feed file
- $rss->saveFeed( $info[ 'feed' ], $info[ 'file' ], $showFeed );
- }
- ?>