<?php
/**
* XML CURRENCY READER CLASS
*
* this class is intended to provide general support to read the xml with currencies
* from a national bank site
*
* @author Cristian Năvălici {@link http://www.lemonsoftware.eu} lemonsoftware [at] gmail [.] com
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
* @version 1.0 26 Oct 2008
*
*/
abstract class XML_currency_reader {
/**
* the extended classes must implement these methods
*/
abstract protected function parse_rate_contents($content, $currency = 'EUR');
abstract protected function parse_domdoc();
/**
* xml file on the BNR site
*/
protected $xmlpath;
/**
* if not enable we use curl functions; otherwise file_get_contents
*/
protected $allow_url_fopen;
/**
* saves the xml content from get_xml_content()
*/
protected $xml_content;
/**
* saves the DOMDocument from DOMconnector()
*/
protected $domdoc;
// ----------------------------------------------------------------------------
/**
* CONSTRUCTOR
*
*
* @param none
* @return void
*/
public function __construct() {
$this->allow_url_fopen = ini_get('allow_url_fopen');
}
// ----------------------------------------------------------------------------
/**
* PARSE XML
*
* this calls other methods in order to get the content, make a DOMDocument from it
* and parse it
*
* @param none
* @return array of arrays (parse_domdoc return value) | FALSE
*/
public function parse_xml() {
// gets the xml content
$this->get_xml_content();
// check if the connection was available
if ( $this->xml_content ) {
// creates a DOMDocument
$this->DOMconnector();
// parse the DOMDocument
return $this->parse_domdoc();
} else return FALSE;
}
// ----------------------------------------------------------------------------
/**
* GET THE XML CONTENT
*
* retrieve the remote file content using any of the methods available
* saves it into a class var
*
* @param none
* @return void
*/
protected function get_xml_content() {
try {
if ( $this->allow_url_fopen ) {
// file_get_contents approach
$xml_content = file_get_contents($this->xmlpath);
} else {
// CURL approach
// make sure curl is installed
if ( function_exists('curl_init') ) {
// initialize a new curl resource
$ch = curl_init();
// set the url to fetch
curl_setopt($ch, CURLOPT_URL, $this->xmlpath);
// don't give me the headers just the content
curl_setopt($ch, CURLOPT_HEADER, 0);
// return the value instead of printing the response to browser
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$xml_content = curl_exec($ch);
// remember to always close the session and free all resources
curl_close($ch);
} else {
throw new Exception('Curl library is not installed; modify allow_url_fopen to 1 in php.ini');
}
}
$this->xml_content = $xml_content;
} catch (Exception $e) {
echo 'BNR_reader->get_xml_content: ' .$e->getMessage(); exit();
}
}
// ----------------------------------------------------------------------------
/**
* CONNECTS TO DOM DOCUMENT
*
* creates a DOMDocument using the class var content (filled up with get_xml_content())
*
* @param none
* @return void
*/
protected function DOMconnector() {
try {
if ( !$this->xml_content ) {
throw new Exception('No content. Empty page or get_xml_content must be run before.');
}
$dom = new DOMDocument();
// this should stay before load() to format output otherwise it doesn't
$dom->preserveWhiteSpace = false;
$dom->loadXML($this->xml_content);
$dom->formatOutput = TRUE;
$this->domdoc = $dom;
} catch (Exception $e) {
echo 'BNR_reader->DOMconnector: ' .$e->getMessage();
}
}
} // class
?>
|