%PDF- %PDF-
| Direktori : /home1/lightco1/www/plugins/vmpayment/klarna/klarna/api/pclasses/ |
| Current File : //home1/lightco1/www/plugins/vmpayment/klarna/klarna/api/pclasses/xmlstorage.class.php |
<?php
defined ('_JEXEC') or die();
/**
* XMLStorage
*
* PHP Version 5.3
*
* @category Payment
* @package KlarnaAPI
* @author MS Dev <ms.modules@klarna.com>
* @copyright 2012 Klarna AB (http://klarna.com)
* @license http://opensource.org/licenses/BSD-2-Clause BSD-2
* @link http://integration.klarna.com/
*/
/**
* Include the {@link PCStorage} interface.
*/
require_once 'storage.intf.php';
/**
* XML storage class for KlarnaPClass
*
* This class is an XML implementation of the PCStorage interface.
*
* @category Payment
* @package KlarnaAPI
* @author MS Dev <ms.modules@klarna.com>
* @copyright 2012 Klarna AB (http://klarna.com)
* @license http://opensource.org/licenses/BSD-2-Clause BSD-2
* @link http://integration.klarna.com/
*/
class XMLStorage extends PCStorage
{
/**
* The internal XML document.
*
* @var DOMDocument
*/
protected $dom;
/**
* XML version for the DOM document.
*
* @var string
*/
protected $version = '1.0';
/**
* Encoding for the DOM document.
*
* @var string
*/
protected $encoding = 'ISO-8859-1';
/**
* Class constructor
*/
public function __construct()
{
$this->dom = new DOMDocument($this->version, $this->encoding);
$this->dom->formatOutput = true;
$this->dom->preserveWhiteSpace = false;
}
/**
* return the name of the storage type
*
* @return string
*/
public function getName()
{
return "xml";
}
/**
* Checks if the file is writeable, readable or if the directory is.
*
* @param string $xmlFile URI to XML file.
*
* @throws KlarnaException
* @return void
*/
protected function checkURI($xmlFile)
{
//If file doesn't exist, check the directory.
if (!file_exists($xmlFile)) {
$xmlFile = dirname($xmlFile);
}
if (!is_writable($xmlFile)) {
throw new Klarna_FileNotWritableException($xmlFile);
}
if (!is_readable($xmlFile)) {
throw new Klarna_FileNotReadableException($xmlFile);
}
}
/**
* Load pclasses from file
*
* @param string $uri uri to file to load
*
* @throws KlarnaException
* @return void
*/
public function load($uri)
{
$this->checkURI($uri);
if (!file_exists($uri)) {
//Do not fail, if file doesn't exist.
return;
}
if (!@$this->dom->load($uri)) {
throw new Klarna_XMLParseException($uri);
}
$xpath = new DOMXpath($this->dom);
foreach ($xpath->query('/klarna/estore') as $estore) {
$eid = $estore->getAttribute('id');
foreach ($xpath->query('pclass', $estore) as $node) {
$pclass = new KlarnaPClass();
$pclass->setId(
$node->getAttribute('pid')
);
$pclass->setType(
$node->getAttribute('type')
);
$pclass->setEid($eid);
$pclass->setDescription(
$xpath->query('description', $node)->item(0)->textContent
);
$pclass->setMonths(
$xpath->query('months', $node)->item(0)->textContent
);
$pclass->setStartFee(
$xpath->query('startfee', $node)->item(0)->textContent
);
$pclass->setInvoiceFee(
$xpath->query('invoicefee', $node)->item(0)->textContent
);
$pclass->setInterestRate(
$xpath->query('interestrate', $node)->item(0)->textContent
);
$pclass->setMinAmount(
$xpath->query('minamount', $node)->item(0)->textContent
);
$pclass->setCountry(
$xpath->query('country', $node)->item(0)->textContent
);
$pclass->setExpire(
$xpath->query('expire', $node)->item(0)->textContent
);
$this->addPClass($pclass);
}
}
}
/**
* Creates DOMElement for all fields for specified PClass.
*
* @param KlarnaPClass $pclass pclass object
*
* @return array Array of DOMElements.
*/
protected function createFields($pclass)
{
$fields = array();
//This is to prevent HTMLEntities to be converted to the real character.
$fields[] = $this->dom->createElement('description');
end($fields)->appendChild(
$this->dom->createTextNode($pclass->getDescription())
);
$fields[] = $this->dom->createElement(
'months', $pclass->getMonths()
);
$fields[] = $this->dom->createElement(
'startfee', $pclass->getStartFee()
);
$fields[] = $this->dom->createElement(
'invoicefee', $pclass->getInvoiceFee()
);
$fields[] = $this->dom->createElement(
'interestrate', $pclass->getInterestRate()
);
$fields[] = $this->dom->createElement(
'minamount', $pclass->getMinAmount()
);
$fields[] = $this->dom->createElement(
'country', $pclass->getCountry()
);
$fields[] = $this->dom->createElement(
'expire', $pclass->getExpire()
);
return $fields;
}
/**
* Save pclasses to file
*
* @param string $uri uri to file to save
*
* @throws KlarnaException
* @return void
*/
public function save($uri)
{
$this->checkURI($uri);
//Reset DOMDocument.
if (!$this->dom->loadXML(
"<?xml version='$this->version' encoding='$this->encoding'?"
."><klarna/>"
)
) {
throw new Klarna_XMLParseException($uri);
}
ksort($this->pclasses, SORT_NUMERIC);
$xpath = new DOMXpath($this->dom);
foreach ($this->pclasses as $eid => $pclasses) {
$estore = $xpath->query('/klarna/estore[@id="'.$eid.'"]');
if ($estore === false || $estore->length === 0) {
//No estore with matching eid, create it.
$estore = $this->dom->createElement('estore');
$estore->setAttribute('id', $eid);
$this->dom->documentElement->appendChild($estore);
} else {
$estore = $estore->item(0);
}
foreach ($pclasses as $pclass) {
if ($eid != $pclass->getEid()) {
//This should never occur, failsafe.
continue;
}
$pnode = $this->dom->createElement('pclass');
foreach ($this->createFields($pclass) as $field) {
$pnode->appendChild($field);
}
$pnode->setAttribute('pid', $pclass->getId());
$pnode->setAttribute('type', $pclass->getType());
$estore->appendChild($pnode);
}
}
if (!$this->dom->save($uri)) {
throw new KlarnaException('Failed to save XML document!');
}
}
/**
* This uses unlink (delete) to clear the pclasses!
*
* @param string $uri uri to file to clear
*
* @throws KlarnaException
* @return void
*/
public function clear($uri)
{
$this->checkURI($uri);
unset($this->pclasses);
if (file_exists($uri)) {
unlink($uri);
}
}
}