git-svn-id: https://192.168.0.254/svn/Proyectos.FundacionLQDVI_WebCongresos/trunk@2 94ccb1af-fd9d-d947-8d90-7f70ea60afc8
1025 lines
30 KiB
PHP
1025 lines
30 KiB
PHP
<?php
|
|
/**
|
|
* @package domit-rss
|
|
* @version 0.51
|
|
* @copyright (C) 2004 John Heinstein. All rights reserved
|
|
* @license http://www.gnu.org/copyleft/lesser.html LGPL License
|
|
* @author John Heinstein <johnkarl@nbnet.nb.ca>
|
|
* @link http://www.engageinteractive.com/domitrss/ DOMIT! RSS Home Page
|
|
* DOMIT! RSS is Free Software
|
|
**/
|
|
|
|
/** channel constant */
|
|
define('DOMIT_RSS_ELEMENT_CHANNEL', 'channel');
|
|
/** item constant */
|
|
define('DOMIT_RSS_ELEMENT_ITEM', 'item');
|
|
/** title constant */
|
|
define('DOMIT_RSS_ELEMENT_TITLE', 'title');
|
|
/** link constant */
|
|
define('DOMIT_RSS_ELEMENT_LINK', 'link');
|
|
/** description constant */
|
|
define('DOMIT_RSS_ELEMENT_DESCRIPTION', 'description');
|
|
|
|
/** version constant */
|
|
define('DOMIT_RSS_ATTR_VERSION', 'version');
|
|
|
|
/** name of array containing list of existing RSS items */
|
|
define('DOMIT_RSS_ARRAY_ITEMS', 'item'); //formerly named 'domit_rss_items'
|
|
/** name of array containing list of existing RSS channels */
|
|
define('DOMIT_RSS_ARRAY_CHANNELS', 'channel'); //formerly named 'domit_rss_channels'
|
|
/** name of array containing list of existing RSS categories */
|
|
define('DOMIT_RSS_ARRAY_CATEGORIES', 'category'); //formerly named 'domit_rss_categories'
|
|
|
|
/** DOMIT RSS error, attempt to call an abstract method */
|
|
define('DOMIT_RSS_ABSTRACT_METHOD_INVOCATION_ERR', 101);
|
|
/** DOMIT RSS error, specified element not present */
|
|
define('DOMIT_RSS_ELEMENT_NOT_FOUND_ERR', 102);
|
|
/** DOMIT RSS error, specified attribute not present */
|
|
define('DOMIT_RSS_ATTR_NOT_FOUND_ERR', 103);
|
|
/** DOMIT RSS error, parsing failed */
|
|
define('DOMIT_RSS_PARSING_ERR', 104);
|
|
|
|
//DOMIT! RSS Error Modes
|
|
/** continue on error */
|
|
define('DOMIT_RSS_ONERROR_CONTINUE', 1);
|
|
/** die on error */
|
|
define('DOMIT_RSS_ONERROR_DIE', 2);
|
|
/** die on error */
|
|
define('DOMIT_RSS_ONERROR_RETURN', 3);
|
|
|
|
/**
|
|
* The base class of all DOMIT! RSS objects
|
|
*
|
|
* @package domit-rss
|
|
* @author John Heinstein <johnkarl@nbnet.nb.ca>
|
|
*/
|
|
class xml_domit_rss_base {
|
|
/** @var Object The underlying DOMIT! node of the element */
|
|
var $node = null;
|
|
/** @var array A list of valid RSS defined child elements */
|
|
var $rssDefinedElements = array();
|
|
|
|
/**
|
|
* Retrieves the underlying DOMIT node
|
|
* @return Object The underlying DOMIT node
|
|
*/
|
|
function getNode() {
|
|
return $this->node;
|
|
} //getNode
|
|
|
|
/**
|
|
* Retrieves the text of the named attribute, checking first if the attribute exists
|
|
* @param string The attribute name
|
|
* @return string The attribute value, or an empty string
|
|
*/
|
|
function getAttribute($attr) {
|
|
if ($this->node->hasAttribute($attr)) {
|
|
return $this->node->getAttribute($attr);
|
|
}
|
|
|
|
return "";
|
|
} //getAttribute
|
|
|
|
/**
|
|
* Checks whether the named attribute exists
|
|
* @param string The attribute name
|
|
* @return boolean True if the attribute exists
|
|
*/
|
|
function hasAttribute($attr) {
|
|
return (($this->node->nodeType == DOMIT_ELEMENT_NODE) && $this->node->hasAttribute($attr));
|
|
} //hasAttribute
|
|
|
|
/**
|
|
* Tests whether the named element is predefined by the RSS spec
|
|
* @param string The element name
|
|
* @return boolean True if the element is predefined by the RSS spec
|
|
*/
|
|
function isRSSDefined($elementName) {
|
|
$isDefined = false;
|
|
|
|
foreach ($this->rssDefinedElements as $key => $value) {
|
|
if ($elementName == $value) {
|
|
$isDefined = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
return $isDefined;
|
|
} //isRSSDefined
|
|
|
|
/**
|
|
* Tests whether the named element has a single child text node
|
|
* @param string The element name
|
|
* @return boolean True if the named element has a single child text node
|
|
*/
|
|
function isSimpleRSSElement($elementName) {
|
|
$elementName = strtolower($elementName);
|
|
|
|
if (isset($this->DOMIT_RSS_indexer[$elementName])) {
|
|
return (get_class($this->getElement($elementName)) == 'xml_domit_rss_simpleelement');
|
|
}
|
|
else {
|
|
return false;
|
|
}
|
|
} //isSimpleRSSElement
|
|
|
|
/**
|
|
* Generates a string representation of the node and its children
|
|
* @param boolean True if HTML readable output is desired
|
|
* @param boolean True if illegal xml characters in text nodes and attributes should be converted to entities
|
|
* @return string The string representation
|
|
*/
|
|
function get($htmlSafe = false, $subEntities = false) {
|
|
return $this->node->toString($htmlSafe, $subEntities);
|
|
} //toString
|
|
|
|
/**
|
|
* Generates a normalized (formatted for readability) representation of the node and its children
|
|
* @param boolean True if HTML readable output is desired
|
|
* @param boolean True if illegal xml characters in text nodes and attributes should be converted to entities
|
|
* @return string The formatted string representation
|
|
*/
|
|
function toNormalizedString($htmlSafe = false, $subEntities = false) {
|
|
return $this->node->toNormalizedString($htmlSafe, $subEntities);
|
|
} //toNormalizedString
|
|
} //xml_domit_rss_base
|
|
|
|
|
|
/**
|
|
* Represents a collection of custom RSS elements, e.g. a set of dc:creator entries
|
|
*
|
|
* @package domit-rss
|
|
* @subpackage domit-rss-main
|
|
* @author John Heinstein <johnkarl@nbnet.nb.ca>
|
|
*/
|
|
class xml_domit_rss_collection extends xml_domit_rss_elementindexer {
|
|
/** @var array An array holding the collection of custom elements */
|
|
var $elements = array();
|
|
/** @var int The number of custom elements in the collection */
|
|
var $elementCount = 0;
|
|
|
|
/**
|
|
* Adds a custom RSS element (DOM node) to the collection
|
|
* @param Object A DOM node representing a custom RSS element
|
|
*/
|
|
function addElement(&$node) {
|
|
$this->elements[] =& $node;
|
|
$this->elementCount++;
|
|
} //addElement
|
|
|
|
/**
|
|
* Retrieves the element at the specified index
|
|
* @param int The index of the requested custom RSS element
|
|
* @return Object The DOMIT node representing the requested element
|
|
*/
|
|
function &getElementAt($index) {
|
|
return $this->elements[$index];
|
|
} //getElementAt
|
|
|
|
/**
|
|
* Retrieves the element at the specified index (alias for getElementAt)
|
|
* @param int The index of the requested custom RSS element
|
|
* @return Object The DOMIT node representing the requested element
|
|
*/
|
|
function &getElement($index) {
|
|
return $this->getElementAt($index);
|
|
} //getElement
|
|
|
|
/**
|
|
* Returns the number of elements in the collection
|
|
* @return int The number of members in the collection
|
|
*/
|
|
function getElementCount() {
|
|
return $this->elementCount;
|
|
} //getElementCount
|
|
|
|
/**
|
|
* Gets a text representation of the collection (applies the toString method to each member and concatenates)
|
|
* @return string The element text
|
|
*/
|
|
function getElementText() {
|
|
$total = $this->getElementCount();
|
|
$result = '';
|
|
|
|
for ($i = 0; $i < $total; $i++) {
|
|
$result .= $currElement->toString();
|
|
}
|
|
|
|
return $result;
|
|
} //getElementText
|
|
} //xml_domit_rss_collection
|
|
|
|
|
|
/**
|
|
* Provides indexing functionality to RSS classes
|
|
*
|
|
* @package domit-rss
|
|
* @author John Heinstein <johnkarl@nbnet.nb.ca>
|
|
*/
|
|
class xml_domit_rss_elementindexer extends xml_domit_rss_base {
|
|
/** @var Array Name based index to RSS elements */
|
|
var $DOMIT_RSS_indexer = array();
|
|
/** @var Array Numerical index to RSS elements; for optimization purposes, only set if requested by getElementAt */
|
|
var $DOMIT_RSS_numericalIndexer;
|
|
|
|
/**
|
|
* Performs generic initialization of elements
|
|
*/
|
|
function _init(){
|
|
$total = $this->node->childCount;
|
|
|
|
for($i = 0; $i < $total; $i++) {
|
|
$currNode =& $this->node->childNodes[$i];
|
|
//$this->DOMIT_RSS_indexer[$currNode->nodeName] =& $currNode;
|
|
$this->addIndexedElement($currNode);
|
|
}
|
|
} //_init
|
|
|
|
/**
|
|
* Adds a custom element (one not defined by the RSS specs, e..g., dc:creator) to the indexer
|
|
* @param Object A DOMIT! node representing the custom element
|
|
*/
|
|
function addIndexedElement(&$node) {
|
|
$tagName = strtolower($node->nodeName);
|
|
|
|
if (isset($this->DOMIT_RSS_indexer[$tagName])) {
|
|
if (strtolower(get_class($this->DOMIT_RSS_indexer[$tagName])) == 'domit_element') {
|
|
$collection = new xml_domit_rss_collection();
|
|
$collection->addElement($this->DOMIT_RSS_indexer[$tagName]);
|
|
$collection->addElement($node);
|
|
$this->DOMIT_RSS_indexer[$tagName] =& $collection;
|
|
}
|
|
else {
|
|
//Don't think I need this case???
|
|
//$this->DOMIT_RSS_indexer[$tagName]->addElement($node);
|
|
}
|
|
}
|
|
else {
|
|
$this->DOMIT_RSS_indexer[$tagName] =& $node;
|
|
}
|
|
} //addIndexedElement
|
|
|
|
/**
|
|
* Indicates whether the requested element is actually a collection of elements of the same type
|
|
* @param string The name of the requested element
|
|
* @return boolean True if a collection of elements exists
|
|
*/
|
|
function isCollection($elementName) {
|
|
$elementName = strtolower($elementName);
|
|
|
|
if (isset($this->DOMIT_RSS_indexer[$elementName])) {
|
|
return (get_class($this->DOMIT_RSS_indexer[$elementName]) == 'xml_domit_rss_collection');
|
|
}
|
|
else {
|
|
return false;
|
|
}
|
|
} //isCollection
|
|
|
|
/**
|
|
* Indicates whether the requested element is a DOMIT! node
|
|
* @param string The name of the requested element
|
|
* @return boolean True if the requested element is a DOMIT! node
|
|
*/
|
|
function isNode($elementName) {
|
|
$elementName = strtolower($elementName);
|
|
|
|
if (isset($this->DOMIT_RSS_indexer[$elementName])) {
|
|
return (strtolower(get_class($this->DOMIT_RSS_indexer[$elementName])) == 'domit_element');
|
|
}
|
|
else {
|
|
return false;
|
|
}
|
|
} //isNode
|
|
|
|
/**
|
|
* Indicates whether the requested element is a DOMIT! node (alias for isNode)
|
|
* @param string The name of the requested element
|
|
* @return boolean True if the requested element is a DOMIT! node
|
|
*/
|
|
function isCustomRSSElement($elementName) {
|
|
return isNode($elementName);
|
|
} //isCustomRSSElement
|
|
|
|
/**
|
|
* Gets a named list of existing elements as a child of the current element
|
|
* @return array A named list of existing elements
|
|
*/
|
|
function getElementList() {
|
|
return array_keys($this->DOMIT_RSS_indexer);
|
|
} //getElementList
|
|
|
|
/**
|
|
* Indicates whether a particular element exists
|
|
* @param string The name of the requested element
|
|
* @return boolean True if an element with the specified name exists
|
|
*/
|
|
function hasElement($elementName) {
|
|
return isset($this->DOMIT_RSS_indexer[strtolower($elementName)]);
|
|
} //hasElement
|
|
|
|
/**
|
|
* Gets a reference to an element with the specified name
|
|
* @param string The name of the requested element
|
|
* @return mixed A reference to an element with the specified name, or the text of the element if it is a text node
|
|
*/
|
|
function &getElement($elementName) {
|
|
$elementName = strtolower($elementName);
|
|
|
|
if (isset($this->DOMIT_RSS_indexer[$elementName])) {
|
|
return $this->DOMIT_RSS_indexer[$elementName];
|
|
}
|
|
else {
|
|
xml_domit_rss_exception::raiseException(DOMIT_RSS_ELEMENT_NOT_FOUND_ERR,
|
|
'Element ' . $elementName . ' not present.');
|
|
}
|
|
} //getElement
|
|
|
|
/**
|
|
* Gets a reference to an element at the specified index
|
|
* @param int The index of the requested element
|
|
* @return mixed A reference to an element at the specified index, or the text of the element if it is a text node
|
|
*/
|
|
function &getElementAt($index) {
|
|
$this->indexNumerically();
|
|
|
|
if (isset($this->DOMIT_RSS_numericalIndexer[$index])) {
|
|
return $this->DOMIT_RSS_numericalIndexer[$index];
|
|
}
|
|
else {
|
|
xml_domit_rss_exception::raiseException(DOMIT_RSS_ELEMENT_NOT_FOUND_ERR,
|
|
'Element ' . $index . ' not present.');
|
|
}
|
|
} //getElementAt
|
|
|
|
/**
|
|
* Populates an integer-based index for elements if one isn't already present.
|
|
*/
|
|
function indexNumerically() {
|
|
if (!isset($this->DOMIT_RSS_numericalIndexer)) {
|
|
$counter = 0;
|
|
|
|
foreach ($this->DOMIT_RSS_indexer as $key => $value) {
|
|
$this->DOMIT_RSS_numericalIndexer[$counter] =& $this->DOMIT_RSS_indexer[$key];
|
|
$counter++;
|
|
}
|
|
}
|
|
} //indexNumerically
|
|
|
|
/**
|
|
* Gets the text of the specified element
|
|
* @param string The name of the requested element
|
|
* @return string The element text, or an empty string
|
|
*/
|
|
function getElementText($elementName) {
|
|
$elementName = strtolower($elementName);
|
|
return $this->_getElementText($elementName, $this->DOMIT_RSS_indexer);
|
|
} //getElementText
|
|
|
|
/**
|
|
* Gets the text at the specified index
|
|
* @param int The index of the requested element
|
|
* @return string The element text, or an empty string
|
|
*/
|
|
function getElementTextAt($index) {
|
|
$this->indexNumerically();
|
|
|
|
return $this->_getElementText($index, $this->DOMIT_RSS_numericalIndexer);
|
|
} //getElementTextAt
|
|
|
|
/**
|
|
* Gets the text at the specified index
|
|
* @param mixed The index or name of the requested element
|
|
* @param array The indexing array from which to extract data
|
|
* @return string The element text, or an empty string
|
|
*/
|
|
function _getElementText($index, &$myArray) {
|
|
if (isset($myArray[$index])) {
|
|
$element =& $myArray[$index];
|
|
$result = '';
|
|
|
|
if (is_array($element)) {
|
|
//do nothing; data for domit_rss_channels, domit_rss_items,
|
|
//and domit_rss_categories should be extracted with their own methods
|
|
}
|
|
else {
|
|
switch (strtolower(get_class($element))) {
|
|
case 'xml_domit_rss_simpleelement':
|
|
$result = $element->getElementText();
|
|
break;
|
|
|
|
case 'xml_domit_rss_collection':
|
|
$result = $element->getElementText();
|
|
break;
|
|
|
|
case 'domit_element':
|
|
$total = $element->childCount;
|
|
|
|
for ($i = 0; $i < $total; $i++) {
|
|
$currNode =& $element->childNodes[$i];
|
|
|
|
if ($currNode->nodeType == DOMIT_CDATA_SECTION_NODE) {
|
|
$result .= $currNode->nodeValue;
|
|
}
|
|
else {
|
|
$result .= $currNode->toString();
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
return $result;
|
|
}
|
|
|
|
return '';
|
|
} //_getElementText
|
|
} //xml_domit_rss_elementindexer
|
|
|
|
|
|
/**
|
|
* A base class for DOMIT! RSS and DOMIT! RSS Lite documents
|
|
*
|
|
* @package domit-rss
|
|
* @author John Heinstein <johnkarl@nbnet.nb.ca>
|
|
*/
|
|
class xml_domit_rss_base_document extends xml_domit_rss_elementindexer {
|
|
/** @var array An array of item elements (only present in some RSS formats) */
|
|
var $domit_rss_items = array();
|
|
/** @var array An array of existing channel elements */
|
|
var $domit_rss_channels = array();
|
|
/** @var array An array of existing category elements */
|
|
var $domit_rss_categories = array();
|
|
/** @var boolean True if caching is enabled */
|
|
var $cacheEnabled = true;
|
|
/** @var Object A reference to the file caching object */
|
|
var $cache;
|
|
/** @var boolean True if PEAR:Cache_Lite is to be used instead of php_text_cache */
|
|
var $useCacheLite = false;
|
|
/** @var boolean True if php_http_client_generic is to be used instead of PHP get_file_contents */
|
|
var $doUseHTTPClient = false;
|
|
/** @var string The name of the current parser - either 'DOMIT_RSS' or 'DOMIT_RSS_LITE' */
|
|
var $parser;
|
|
/** @var object A reference to a http connection or proxy, if one is required */
|
|
var $httpConnection = null;
|
|
/** @var int The timeout value for an http connection */
|
|
var $rssTimeout = 0;
|
|
|
|
/**
|
|
* Constructor
|
|
* @param string Path to the rss file
|
|
* @param string Directory in which cache files are to be stored
|
|
* @param int Expiration time (in seconds) for the cache file
|
|
* @return mixed Null if an url was not provided, true if an url was provided and parsing was successful, false otherwise
|
|
*/
|
|
function xml_domit_rss_base_document ($url = '', $cacheDir = './', $cacheTime = 3600) {
|
|
$success = null;
|
|
$this->createDocument();
|
|
|
|
if ($url != '') { //if rss data is from filesystem
|
|
if (substr($url, 0, 4) != "http") {
|
|
$rssText = $this->getTextFromFile($url);
|
|
$this->parseRSS($rssText);
|
|
}
|
|
else {
|
|
$this->createDefaultCache($cacheDir, $cacheTime);
|
|
$success = $this->loadRSS($url, $cacheDir, $cacheTime);
|
|
}
|
|
}
|
|
|
|
return $success;
|
|
} //xml_domit_rss_base_document
|
|
|
|
/**
|
|
* Specifies the default timeout value for connecting to a host
|
|
* @param int The number of seconds to timeout when attempting to connect to a server
|
|
*/
|
|
function setRSSTimeout($rssTimeout) {
|
|
$this->rssTimeout = $rssTimeout;
|
|
|
|
if (!$this->useCacheLite && !($this->cache == null)) {
|
|
$this->cache->setTimeout($rssTimeout);
|
|
}
|
|
} //setRSSTimeout
|
|
|
|
/**
|
|
* Specifies the parameters of the http conection used to obtain the xml data
|
|
* @param string The ip address or domain name of the connection
|
|
* @param string The path of the connection
|
|
* @param int The port that the connection is listening on
|
|
* @param int The timeout value for the connection
|
|
* @param string The user name, if authentication is required
|
|
* @param string The password, if authentication is required
|
|
*/
|
|
function setConnection($host, $path = '/', $port = 80, $timeout = 0, $user = null, $password = null) {
|
|
require_once(DOMIT_RSS_INCLUDE_PATH . 'php_http_client_generic.php');
|
|
|
|
$this->httpConnection = new php_http_client_generic($host, $path, $port, $timeout, $user, $password);
|
|
} //setConnection
|
|
|
|
/**
|
|
* Specifies basic authentication for an http connection
|
|
* @param string The user name
|
|
* @param string The password
|
|
*/
|
|
function setAuthorization($user, $password) {
|
|
$this->httpConnection->setAuthorization($user, $password);
|
|
} //setAuthorization
|
|
|
|
/**
|
|
* Specifies that a proxy is to be used to obtain the xml data
|
|
* @param string The ip address or domain name of the proxy
|
|
* @param string The path to the proxy
|
|
* @param int The port that the proxy is listening on
|
|
* @param int The timeout value for the connection
|
|
* @param string The user name, if authentication is required
|
|
* @param string The password, if authentication is required
|
|
*/
|
|
function setProxyConnection($host, $path = '/', $port = 80, $timeout = 0, $user = null, $password = null) {
|
|
require_once(DOMIT_RSS_INCLUDE_PATH . 'php_http_proxy.php');
|
|
|
|
$this->httpConnection = new php_http_proxy($host, $path, $port, $timeout, $user, $password);
|
|
} //setProxyConnection
|
|
|
|
/**
|
|
* Specifies a user name and password for the proxy
|
|
* @param string The user name
|
|
* @param string The password
|
|
*/
|
|
function setProxyAuthorization($user, $password) {
|
|
$this->httpConnection->setProxyAuthorization($user, $password);
|
|
} //setProxyAuthorization
|
|
|
|
/**
|
|
* Specifies whether an HTTP client should be used to establish a connection
|
|
* @param boolean True if an HTTP client is to be used to establish the connection
|
|
*/
|
|
function useHTTPClient($truthVal) {
|
|
$this->doUseHTTPClient = $truthVal;
|
|
} //useHTTPClient
|
|
|
|
/**
|
|
* Returns the name of the parser
|
|
*@return string Either 'DOMIT_RSS' or 'DOMIT_RSS_LITE'
|
|
*/
|
|
function parsedBy() {
|
|
return $this->parser;
|
|
} //parsedBy
|
|
|
|
/**
|
|
* Creates an empty DOMIT! document to contain the RSS nodes
|
|
*/
|
|
function createDocument() {
|
|
require_once(DOMIT_RSS_INCLUDE_PATH . 'xml_domit_include.php');
|
|
$this->node = new DOMIT_Document();
|
|
$this->node->resolveErrors(true);
|
|
} //createDocument
|
|
|
|
/**
|
|
* Substitutes PEAR::Cache_Lite for the default php_text_cache
|
|
* @param boolean True if Cache Lite is to be used
|
|
* @param string Absolute or relative path to the Cache Lite library
|
|
* @param string Directory for cache files
|
|
* @param int Expiration time for a cache file
|
|
*/
|
|
function useCacheLite($doUseCacheLite, $pathToLibrary = './Lite.php', $cacheDir = './', $cacheTime = 3600) {
|
|
$this->useCacheLite = $doUseCacheLite;
|
|
|
|
if ($doUseCacheLite) {
|
|
if (!file_exists($pathToLibrary)) {
|
|
$this->useCacheLite(false);
|
|
}
|
|
else {
|
|
require_once($pathToLibrary);
|
|
|
|
$cacheOptions = array('cacheDir' => $cacheDir, 'lifeTime' => $cacheTime);
|
|
$this->cache = new Cache_Lite($cacheOptions);
|
|
}
|
|
}
|
|
else {
|
|
$this->createDefaultCache($cacheDir, $cacheTime);
|
|
}
|
|
} //useCacheLite
|
|
|
|
/**
|
|
* Instantiates a default cache (php_text_cache)
|
|
* @param string Directory for cache files
|
|
* @param int Expiration time for a cache file
|
|
*/
|
|
function createDefaultCache($cacheDir = './', $cacheTime = 3600) {
|
|
require_once(DOMIT_RSS_INCLUDE_PATH . 'php_text_cache.php');
|
|
$this->cache = new php_text_cache($cacheDir, $cacheTime, $this->rssTimeout);
|
|
} //initDefaultCache
|
|
|
|
/**
|
|
* Disables caching mechanism
|
|
*/
|
|
function disableCache() {
|
|
$this->cacheEnabled = false;
|
|
} //initDefaultCache
|
|
|
|
/**
|
|
* Loads and parses the RSS at the specified url
|
|
* @param string The url of the RSS feed
|
|
* @return boolean True if parsing is successful
|
|
*/
|
|
function loadRSS($url) {
|
|
if (substr($url, 0, 4) != "http") {
|
|
$rssText = $this->getTextFromFile($url);
|
|
return $this->parseRSS($rssText);
|
|
}
|
|
else {
|
|
if ($this->cacheEnabled && !isset($this->cache)) {
|
|
$this->createDefaultCache();
|
|
$this->cache->httpConnection =& $this->httpConnection;
|
|
}
|
|
|
|
$success = $this->loadRSSData($url);
|
|
|
|
if ($success) {
|
|
$this->_init();
|
|
}
|
|
|
|
return $success;
|
|
}
|
|
} //loadRSS
|
|
|
|
/**
|
|
* Parses the RSS text provided
|
|
* @param string The RSS text
|
|
* @return boolean True if parsing is successful
|
|
*/
|
|
function parseRSS($rssText) {
|
|
if ($this->cacheEnabled && !isset($this->cache)) $this->createDefaultCache();
|
|
$success = $this->parseRSSData($rssText);
|
|
|
|
if ($success) {
|
|
$this->_init();
|
|
}
|
|
|
|
return $success;
|
|
} //parseRSS
|
|
|
|
/**
|
|
* Retrieves the RSS data from the url/cache file and parses
|
|
* @param string The url for the RSS data
|
|
* @return boolean True if parsing is successful
|
|
*/
|
|
function loadRSSData($url) {
|
|
$rssText = $this->getDataFromCache($url);
|
|
return $this->parseRSSData($rssText);
|
|
} //loadRSSData
|
|
|
|
/**
|
|
* Retrieves the RSS data from the url/cache file
|
|
* @param string The url for the RSS data
|
|
* @return string The RSS data
|
|
*/
|
|
function getDataFromCache($url) {
|
|
if ($this->cacheEnabled) {
|
|
if ($this->useCacheLite) {
|
|
if ($rssText = $this->cache->get($url)) {
|
|
return $rssText;
|
|
}
|
|
else {
|
|
$rssText = $this->getTextFromFile($url);
|
|
if ($rssText != '') $this->cache->save($rssText, $url);
|
|
return $rssText;
|
|
}
|
|
}
|
|
else {
|
|
$this->cache->useHTTPClient($this->doUseHTTPClient);
|
|
return $this->cache->getData($url);
|
|
}
|
|
}
|
|
else {
|
|
return $this->getTextFromFile($url);
|
|
}
|
|
} //getDataFromCache
|
|
|
|
/**
|
|
* Parses the RSS data provided
|
|
* @param string The the RSS data
|
|
* @return boolean True if parsing is successful
|
|
*/
|
|
function parseRSSData($rssText) {
|
|
if ($rssText != '') {
|
|
return $this->fromString($rssText);
|
|
}
|
|
else {
|
|
return false;
|
|
}
|
|
} //parseRSSData
|
|
|
|
/**
|
|
* Reads in RSS text from a file and parses it
|
|
* @param string The file path
|
|
* @return boolean True if parsing is successful
|
|
*/
|
|
function &fromFile($filename) {
|
|
$success = $this->node->loadXML($filename, false);
|
|
return $success;
|
|
} //fromFile
|
|
|
|
/**
|
|
* Reads in RSS text from a string and parses it
|
|
* @param string The RSS text
|
|
* @return boolean True if parsing is successful
|
|
*/
|
|
function &fromString($rssText) {
|
|
$success = $this->node->parseXML($rssText, false);
|
|
return $success;
|
|
} //fromString
|
|
|
|
/**
|
|
* Establishes a connection, given an url
|
|
* @param string The url of the data
|
|
*/
|
|
function establishConnection($url) {
|
|
require_once(DOMIT_RSS_INCLUDE_PATH . 'php_http_client_generic.php');
|
|
|
|
$host = php_http_connection::formatHost($url);
|
|
$host = substr($host, 0, strpos($host, '/'));
|
|
|
|
$this->setConnection($host, '/', 80, $this->rssTimeout);
|
|
} //establishConnection
|
|
|
|
/**
|
|
* Get text from an url or file
|
|
* @param string The url or file path
|
|
* @return string The text contained in the url or file, or an empty string
|
|
*/
|
|
function getTextFromFile($filename) {
|
|
$fileContents = '';
|
|
|
|
if ($this->doUseHTTPClient) {
|
|
$this->establishConnection($filename);
|
|
$response =& $this->httpConnection->get($filename);
|
|
|
|
if ($response != null) {
|
|
$fileContents = $response->getResponse();
|
|
}
|
|
}
|
|
else {
|
|
if (function_exists('file_get_contents')) {
|
|
$fileContents = @file_get_contents($filename);
|
|
}
|
|
else {
|
|
require_once(DOMIT_RSS_INCLUDE_PATH . 'php_file_utilities.php');
|
|
$fileContents =& php_file_utilities::getDataFromFile($filename, 'r');
|
|
}
|
|
|
|
if ($fileContents == '') {
|
|
$this->establishConnection($filename);
|
|
$response =& $this->httpConnection->get($filename);
|
|
|
|
if ($response != null) {
|
|
$fileContents = $response->getResponse();
|
|
}
|
|
}
|
|
}
|
|
|
|
return $fileContents;
|
|
} //getTextFromFile
|
|
|
|
/**
|
|
* Gets a reference to the underlying DOM document
|
|
* @return Object A reference to the underlying DOM document
|
|
*/
|
|
function &getDocument() {
|
|
return $this->node;
|
|
} //getDocument
|
|
|
|
/**
|
|
* Gets a reference to the root DOM element
|
|
* @return Object A reference to the root DOM element
|
|
*/
|
|
function &getNode() {
|
|
return $this->node->documentElement;
|
|
} //getNode
|
|
|
|
/**
|
|
* Forces channel elements that are external to a channel to be referenced as subelements of that channel
|
|
*/
|
|
function handleChannelElementsEmbedded() {
|
|
if (count($this->domit_rss_items) > 0) {
|
|
foreach ($this->domit_rss_channels as $key => $value) {
|
|
$this->domit_rss_channels[$key]->domit_rss_items =& $this->domit_rss_items;
|
|
|
|
if (count($this->DOMIT_RSS_indexer) > 0) {
|
|
foreach ($this->DOMIT_RSS_indexer as $ikey => $ivalue) {
|
|
if ($ikey != DOMIT_RSS_ARRAY_CHANNELS) {
|
|
$this->domit_rss_channels[$key]->DOMIT_RSS_indexer[$ikey] =& $this->DOMIT_RSS_indexer[$ikey];
|
|
unset($this->DOMIT_RSS_indexer[$ikey]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} //handleChannelElementsEmbedded
|
|
|
|
/**
|
|
* Returns the version of RSS used to format the data
|
|
* @return string The version of RSS used to format the data
|
|
*/
|
|
function getRSSVersion() {
|
|
$version = $this->node->documentElement->getAttribute(DOMIT_RSS_ATTR_VERSION);
|
|
|
|
if ($version == '') {
|
|
$xmlns = $this->node->documentElement->getAttribute('xmlns');
|
|
$total = strlen($xmlns);
|
|
|
|
if (substr($xmlns, $total) == '/') {
|
|
$total--;
|
|
}
|
|
|
|
for ($i = ($total - 1); $i > -1; $i--) {
|
|
$currentChar = substr($xmlns, $i);
|
|
|
|
if ($currentChar == '/') {
|
|
break;
|
|
}
|
|
else {
|
|
$version = $currentChar . $version;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
return $version;
|
|
} //getRSSVersion
|
|
|
|
/**
|
|
* Returns the number of channels in the document
|
|
* @return int The number of channels in the document
|
|
*/
|
|
function getChannelCount() {
|
|
return count($this->domit_rss_channels);
|
|
} //getChannelCount()
|
|
|
|
/**
|
|
* Returns a reference to the channel located at the specified index
|
|
* @return Object A reference to the channel located at the specified index
|
|
*/
|
|
function &getChannel($index) {
|
|
return $this->domit_rss_channels[$index];
|
|
} //getChannel
|
|
} //xml_domit_rss_base_document
|
|
|
|
/**
|
|
* Represents a simple RSS element, without attributes and only a single child text node
|
|
*
|
|
* @package domit-rss
|
|
* @subpackage domit-rss-main
|
|
* @author John Heinstein <johnkarl@nbnet.nb.ca>
|
|
*/
|
|
class xml_domit_rss_simpleelement extends xml_domit_rss_elementindexer {
|
|
/**
|
|
* Constructor
|
|
* @param Object A DOM node containing element data
|
|
*/
|
|
function xml_domit_rss_simpleelement(&$element) {
|
|
$this->node =& $element;
|
|
} //xml_domit_rss_simpleelement
|
|
|
|
/**
|
|
* Gets the text of the element
|
|
* @return string The element text
|
|
*/
|
|
function getElementText() {
|
|
$element =& $this->node;
|
|
$result = '';
|
|
$total = $element->childCount;
|
|
|
|
for ($i = 0; $i < $total; $i++) {
|
|
$currNode =& $element->childNodes[$i];
|
|
|
|
if ($currNode->nodeType == DOMIT_CDATA_SECTION_NODE) {
|
|
$result .= $currNode->nodeValue;
|
|
}
|
|
else {
|
|
$result .= $currNode->toString();
|
|
}
|
|
}
|
|
|
|
return $result;
|
|
} //getElementText
|
|
} //xml_domit_rss_simpleelement
|
|
|
|
/**
|
|
* @global object Reference to custom error handler for DOMIT RSS Exception class
|
|
*/
|
|
$GLOBALS['DOMIT_RSS_Exception_errorHandler'] = null;
|
|
/**
|
|
* @global int Error mode; specifies whether to die on error or simply return
|
|
*/
|
|
//$GLOBALS['DOMIT_RSS_Exception_mode'] = DOMIT_RSS_ONERROR_RETURN;
|
|
// fixes bug identified here: sarahk.pcpropertymanager.com/blog/using-domit-rss/225/
|
|
$GLOBALS['DOMIT_RSS_Exception_mode'] = 1;
|
|
/**
|
|
* @global string Log file for errors
|
|
*/
|
|
$GLOBALS['DOMIT_RSS_Exception_log'] = null;
|
|
|
|
|
|
/**
|
|
* A DOMIT! RSS exception handling class
|
|
*
|
|
* @package domit-rss
|
|
* @author John Heinstein <johnkarl@nbnet.nb.ca>
|
|
*/
|
|
class xml_domit_rss_exception {
|
|
/**
|
|
* Raises the specified exception
|
|
* @param int The error number
|
|
* @param string A string explanation of the error
|
|
*/
|
|
function raiseException($errorNum, $errorString) {
|
|
if ($GLOBALS['DOMIT_RSS_Exception_errorHandler'] != null) {
|
|
call_user_func($GLOBALS['DOMIT_RSS_Exception_errorHandler'], $errorNum, $errorString);
|
|
}
|
|
else {
|
|
$errorMessageText = $errorNum . ' ' . $errorString;
|
|
$errorMessage = 'Error: ' . $errorMessageText;
|
|
|
|
if ((!isset($GLOBALS['DOMIT_RSS_ERROR_FORMATTING_HTML'])) ||
|
|
($GLOBALS['DOMIT_RSS_ERROR_FORMATTING_HTML'] == true)) {
|
|
$errorMessage = "<p><pre>" . $errorMessage . "</pre></p>";
|
|
}
|
|
|
|
//log error to file
|
|
if ((isset($GLOBALS['DOMIT_RSS_Exception_log'])) &&
|
|
($GLOBALS['DOMIT_RSS_Exception_log'] != null)) {
|
|
require_once(DOMIT_RSS_INCLUDE_PATH . 'php_file_utilities.php');
|
|
|
|
$logItem = "\n" . date('Y-m-d H:i:s') . 'DOMIT! RSS Error ' . $errorMessageText;
|
|
php_file_utilities::putDataToFile($GLOBALS['DOMIT_RSS_Exception_log'], $logItem, 'a');
|
|
}
|
|
|
|
switch ($GLOBALS['DOMIT_RSS_Exception_mode']) {
|
|
case DOMIT_RSS_ONERROR_CONTINUE:
|
|
return;
|
|
break;
|
|
|
|
case DOMIT_RSS_ONERROR_DIE:
|
|
die($errorMessage);
|
|
break;
|
|
}
|
|
}
|
|
} //raiseException
|
|
|
|
/**
|
|
* custom handler for DOM RSS errors
|
|
* @param object A reference to the custom error handler
|
|
*/
|
|
function setErrorHandler($method) {
|
|
$GLOBALS['DOMIT_RSS_Exception_errorHandler'] =& $method;
|
|
|
|
require_once(DOMIT_RSS_INCLUDE_PATH . 'php_http_exceptions.php');
|
|
$GLOBALS['HTTP_Exception_errorHandler'] =& $method;
|
|
|
|
require_once(DOMIT_RSS_INCLUDE_PATH . 'xml_domit_shared.php');
|
|
$GLOBALS['HTTP_Exception_errorHandler'] =& $method;
|
|
} //setErrorHandler
|
|
|
|
/**
|
|
* Set error mode
|
|
* @param int The DOMIT RSS error mode
|
|
*/
|
|
function setErrorMode($mode) {
|
|
$GLOBALS['DOMIT_RSS_Exception_mode'] = $mode;
|
|
|
|
require_once(DOMIT_RSS_INCLUDE_PATH . 'php_http_exceptions.php');
|
|
require_once(DOMIT_RSS_INCLUDE_PATH . 'xml_domit_shared.php');
|
|
|
|
if ($mode == DOMIT_RSS_ONERROR_CONTINUE) {
|
|
$GLOBALS['HTTP_Exception_mode'] = HTTP_ONERROR_CONTINUE;
|
|
$GLOBALS['DOMIT_DOMException_mode'] = DOMIT_ONERROR_CONTINUE;
|
|
}
|
|
else {
|
|
$GLOBALS['HTTP_Exception_mode'] = HTTP_ONERROR_DIE;
|
|
$GLOBALS['DOMIT_DOMException_mode'] = DOMIT_ONERROR_DIE;
|
|
}
|
|
} //setErrorMode
|
|
|
|
/**
|
|
* Set error mode
|
|
* @param boolean True if errors should be logged
|
|
* @param string Absolute or relative path to log file
|
|
*/
|
|
function setErrorLog($doLogErrors, $logfile) {
|
|
require_once(DOMIT_RSS_INCLUDE_PATH . 'php_http_exceptions.php');
|
|
|
|
if ($doLogErrors) {
|
|
$GLOBALS['DOMIT_RSS_Exception_log'] = $logfile;
|
|
$GLOBALS['HTTP_Exception_log'] = $logfile;
|
|
$GLOBALS['DOMIT_Exception_log'] = $logfile;
|
|
}
|
|
else {
|
|
$GLOBALS['DOMIT_RSS_Exception_log'] = null;
|
|
$GLOBALS['HTTP_Exception_log'] = null;
|
|
$GLOBALS['DOMIT_Exception_log'] = null;
|
|
}
|
|
} //setErrorLog
|
|
} //xml_domit_rss_exception
|
|
|
|
?>
|