import v1.0.0-RC4 | 2009-05-20
This commit is contained in:
259
libs/Zend/Feed/Abstract.php
Normal file
259
libs/Zend/Feed/Abstract.php
Normal file
@ -0,0 +1,259 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to license@zend.com so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Feed
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id: Abstract.php 12507 2008-11-10 16:29:09Z matthew $
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* @see Zend_Feed_Element
|
||||
*/
|
||||
require_once 'Zend/Feed/Element.php';
|
||||
|
||||
|
||||
/**
|
||||
* The Zend_Feed_Abstract class is an abstract class representing feeds.
|
||||
*
|
||||
* Zend_Feed_Abstract implements two core PHP 5 interfaces: ArrayAccess and
|
||||
* Iterator. In both cases the collection being treated as an array is
|
||||
* considered to be the entry collection, such that iterating over the
|
||||
* feed takes you through each of the feed.s entries.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Feed
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
abstract class Zend_Feed_Abstract extends Zend_Feed_Element implements Iterator
|
||||
{
|
||||
/**
|
||||
* Current index on the collection of feed entries for the
|
||||
* Iterator implementation.
|
||||
*
|
||||
* @var integer
|
||||
*/
|
||||
protected $_entryIndex = 0;
|
||||
|
||||
/**
|
||||
* Cache of feed entries.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $_entries;
|
||||
|
||||
/**
|
||||
* Feed constructor
|
||||
*
|
||||
* The Zend_Feed_Abstract constructor takes the URI of a feed or a
|
||||
* feed represented as a string and loads it as XML.
|
||||
*
|
||||
* @param string $uri The full URI of the feed to load, or NULL if not retrieved via HTTP or as an array.
|
||||
* @param string $string The feed as a string, or NULL if retrieved via HTTP or as an array.
|
||||
* @param Zend_Feed_Builder_Interface $builder The feed as a builder instance or NULL if retrieved as a string or via HTTP.
|
||||
* @return void
|
||||
* @throws Zend_Feed_Exception If loading the feed failed.
|
||||
*/
|
||||
public function __construct($uri = null, $string = null, Zend_Feed_Builder_Interface $builder = null)
|
||||
{
|
||||
if ($uri !== null) {
|
||||
// Retrieve the feed via HTTP
|
||||
$client = Zend_Feed::getHttpClient();
|
||||
$client->setUri($uri);
|
||||
$response = $client->request('GET');
|
||||
if ($response->getStatus() !== 200) {
|
||||
/**
|
||||
* @see Zend_Feed_Exception
|
||||
*/
|
||||
require_once 'Zend/Feed/Exception.php';
|
||||
throw new Zend_Feed_Exception('Feed failed to load, got response code ' . $response->getStatus());
|
||||
}
|
||||
$this->_element = $response->getBody();
|
||||
$this->__wakeup();
|
||||
} elseif ($string !== null) {
|
||||
// Retrieve the feed from $string
|
||||
$this->_element = $string;
|
||||
$this->__wakeup();
|
||||
} else {
|
||||
// Generate the feed from the array
|
||||
$header = $builder->getHeader();
|
||||
$this->_element = new DOMDocument('1.0', $header['charset']);
|
||||
$root = $this->_mapFeedHeaders($header);
|
||||
$this->_mapFeedEntries($root, $builder->getEntries());
|
||||
$this->_element = $root;
|
||||
$this->_buildEntryCache();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Load the feed as an XML DOMDocument object
|
||||
*
|
||||
* @return void
|
||||
* @throws Zend_Feed_Exception
|
||||
*/
|
||||
public function __wakeup()
|
||||
{
|
||||
@ini_set('track_errors', 1);
|
||||
$doc = new DOMDocument;
|
||||
$status = @$doc->loadXML($this->_element);
|
||||
@ini_restore('track_errors');
|
||||
|
||||
if (!$status) {
|
||||
// prevent the class to generate an undefined variable notice (ZF-2590)
|
||||
if (!isset($php_errormsg)) {
|
||||
if (function_exists('xdebug_is_enabled')) {
|
||||
$php_errormsg = '(error message not available, when XDebug is running)';
|
||||
} else {
|
||||
$php_errormsg = '(error message not available)';
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @see Zend_Feed_Exception
|
||||
*/
|
||||
require_once 'Zend/Feed/Exception.php';
|
||||
throw new Zend_Feed_Exception("DOMDocument cannot parse XML: $php_errormsg");
|
||||
}
|
||||
|
||||
$this->_element = $doc;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Prepare for serialiation
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function __sleep()
|
||||
{
|
||||
$this->_element = $this->saveXML();
|
||||
|
||||
return array('_element');
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Cache the individual feed elements so they don't need to be
|
||||
* searched for on every operation.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function _buildEntryCache()
|
||||
{
|
||||
$this->_entries = array();
|
||||
foreach ($this->_element->childNodes as $child) {
|
||||
if ($child->localName == $this->_entryElementName) {
|
||||
$this->_entries[] = $child;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the number of entries in this feed object.
|
||||
*
|
||||
* @return integer Entry count.
|
||||
*/
|
||||
public function count()
|
||||
{
|
||||
return count($this->_entries);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Required by the Iterator interface.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function rewind()
|
||||
{
|
||||
$this->_entryIndex = 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Required by the Iterator interface.
|
||||
*
|
||||
* @return mixed The current row, or null if no rows.
|
||||
*/
|
||||
public function current()
|
||||
{
|
||||
return new $this->_entryClassName(
|
||||
null,
|
||||
$this->_entries[$this->_entryIndex]);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Required by the Iterator interface.
|
||||
*
|
||||
* @return mixed The current row number (starts at 0), or NULL if no rows
|
||||
*/
|
||||
public function key()
|
||||
{
|
||||
return $this->_entryIndex;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Required by the Iterator interface.
|
||||
*
|
||||
* @return mixed The next row, or null if no more rows.
|
||||
*/
|
||||
public function next()
|
||||
{
|
||||
++$this->_entryIndex;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Required by the Iterator interface.
|
||||
*
|
||||
* @return boolean Whether the iteration is valid
|
||||
*/
|
||||
public function valid()
|
||||
{
|
||||
return 0 <= $this->_entryIndex && $this->_entryIndex < $this->count();
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate the header of the feed when working in write mode
|
||||
*
|
||||
* @param array $array the data to use
|
||||
* @return DOMElement root node
|
||||
*/
|
||||
abstract protected function _mapFeedHeaders($array);
|
||||
|
||||
/**
|
||||
* Generate the entries of the feed when working in write mode
|
||||
*
|
||||
* @param DOMElement $root the root node to use
|
||||
* @param array $array the data to use
|
||||
* @return DOMElement root node
|
||||
*/
|
||||
abstract protected function _mapFeedEntries(DOMElement $root, $array);
|
||||
|
||||
/**
|
||||
* Send feed to a http client with the correct header
|
||||
*
|
||||
* @throws Zend_Feed_Exception if headers have already been sent
|
||||
* @return void
|
||||
*/
|
||||
abstract public function send();
|
||||
}
|
Reference in New Issue
Block a user