| Viewing file:  Atom.php (8.36 KB)      -rwxr-xr-x Select action/file-type:
 
  (+) |  (+) |  (+) | Code (+) | Session (+) |  (+) | SDB (+) |  (+) |  (+) |  (+) |  (+) |  (+) | 
 
<?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: Atom.php 8064 2008-02-16 10:58:39Z thomas $
 */
 
 /**
 * @see Zend_Feed_Entry_Abstract
 */
 require_once 'external/Zend/Feed/Entry/Abstract.php';
 
 /**
 * Concrete class for working with Atom 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
 */
 class Zend_Feed_Entry_Atom extends Zend_Feed_Entry_Abstract {
 /**
 * Root XML element for Atom entries.
 *
 * @var string
 */
 protected $_rootElement = 'entry';
 
 /**
 * Root namespace for Atom entries.
 *
 * @var string
 */
 protected $_rootNamespace = 'atom';
 
 /**
 * Delete an atom entry.
 *
 * Delete tries to delete this entry from its feed. If the entry
 * does not contain a link rel="edit", we throw an error (either
 * the entry does not yet exist or this is not an editable
 * feed). If we have a link rel="edit", we do the empty-body
 * HTTP DELETE to that URI and check for a response of 2xx.
 * Usually the response would be 204 No Content, but the Atom
 * Publishing Protocol permits it to be 200 OK.
 *
 * @return void
 * @throws Zend_Feed_Exception
 */
 public function delete() {
 // Look for link rel="edit" in the entry object.
 $deleteUri = $this->link('edit');
 if (! $deleteUri) {
 /**
 * @see Zend_Feed_Exception
 */
 require_once 'external/Zend/Feed/Exception.php';
 throw new Zend_Feed_Exception('Cannot delete entry; no link rel="edit" is present.');
 }
 
 // DELETE
 $client = Zend_Feed::getHttpClient();
 do {
 $client->setUri($deleteUri);
 if (Zend_Feed::getHttpMethodOverride()) {
 $client->setHeader('X-HTTP-Method-Override', 'DELETE');
 $response = $client->request('POST');
 } else {
 $response = $client->request('DELETE');
 }
 $httpStatus = $response->getStatus();
 switch ((int)$httpStatus / 100) {
 // Success
 case 2:
 return true;
 // Redirect
 case 3:
 $deleteUri = $response->getHeader('Location');
 continue;
 // Error
 default:
 /**
 * @see Zend_Feed_Exception
 */
 require_once 'external/Zend/Feed/Exception.php';
 throw new Zend_Feed_Exception("Expected response code 2xx, got $httpStatus");
 }
 } while (true);
 }
 
 /**
 * Save a new or updated Atom entry.
 *
 * Save is used to either create new entries or to save changes to
 * existing ones. If we have a link rel="edit", we are changing
 * an existing entry. In this case we re-serialize the entry and
 * PUT it to the edit URI, checking for a 200 OK result.
 *
 * For posting new entries, you must specify the $postUri
 * parameter to save() to tell the object where to post itself.
 * We use $postUri and POST the serialized entry there, checking
 * for a 201 Created response. If the insert is successful, we
 * then parse the response from the POST to get any values that
 * the server has generated: an id, an updated time, and its new
 * link rel="edit".
 *
 * @param  string $postUri Location to POST for creating new entries.
 * @return void
 * @throws Zend_Feed_Exception
 */
 public function save($postUri = null) {
 if ($this->id()) {
 // If id is set, look for link rel="edit" in the
 // entry object and PUT.
 $editUri = $this->link('edit');
 if (! $editUri) {
 /**
 * @see Zend_Feed_Exception
 */
 require_once 'external/Zend/Feed/Exception.php';
 throw new Zend_Feed_Exception('Cannot edit entry; no link rel="edit" is present.');
 }
 
 $client = Zend_Feed::getHttpClient();
 $client->setUri($editUri);
 if (Zend_Feed::getHttpMethodOverride()) {
 $client->setHeaders(array('X-HTTP-Method-Override: PUT',
 'Content-Type: application/atom+xml'));
 $client->setRawData($this->saveXML());
 $response = $client->request('POST');
 } else {
 $client->setHeaders('Content-Type', 'application/atom+xml');
 $client->setRawData($this->saveXML());
 $response = $client->request('PUT');
 }
 if ($response->getStatus() !== 200) {
 /**
 * @see Zend_Feed_Exception
 */
 require_once 'external/Zend/Feed/Exception.php';
 throw new Zend_Feed_Exception('Expected response code 200, got ' . $response->getStatus());
 }
 } else {
 if ($postUri === null) {
 /**
 * @see Zend_Feed_Exception
 */
 require_once 'external/Zend/Feed/Exception.php';
 throw new Zend_Feed_Exception('PostURI must be specified to save new entries.');
 }
 $client = Zend_Feed::getHttpClient();
 $client->setUri($postUri);
 $client->setRawData($this->saveXML());
 $response = $client->request('POST');
 
 if ($response->getStatus() !== 201) {
 /**
 * @see Zend_Feed_Exception
 */
 require_once 'external/Zend/Feed/Exception.php';
 throw new Zend_Feed_Exception('Expected response code 201, got ' . $response->getStatus());
 }
 }
 
 // Update internal properties using $client->responseBody;
 @ini_set('track_errors', 1);
 $newEntry = @DOMDocument::loadXML($response->getBody());
 @ini_restore('track_errors');
 
 if (! $newEntry) {
 // 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 'external/Zend/Feed/Exception.php';
 throw new Zend_Feed_Exception('XML cannot be parsed: ' . $php_errormsg);
 }
 
 $newEntry = $newEntry->getElementsByTagName($this->_rootElement)->item(0);
 if (! $newEntry) {
 /**
 * @see Zend_Feed_Exception
 */
 require_once 'external/Zend/Feed/Exception.php';
 throw new Zend_Feed_Exception('No root <feed> element found in server response:' . "\n\n" . $client->responseBody);
 }
 
 if ($this->_element->parentNode) {
 $oldElement = $this->_element;
 $this->_element = $oldElement->ownerDocument->importNode($newEntry, true);
 $oldElement->parentNode->replaceChild($this->_element, $oldElement);
 } else {
 $this->_element = $newEntry;
 }
 }
 
 /**
 * Easy access to <link> tags keyed by "rel" attributes.
 *
 * If $elt->link() is called with no arguments, we will attempt to
 * return the value of the <link> tag(s) like all other
 * method-syntax attribute access. If an argument is passed to
 * link(), however, then we will return the "href" value of the
 * first <link> tag that has a "rel" attribute matching $rel:
 *
 * $elt->link(): returns the value of the link tag.
 * $elt->link('self'): returns the href from the first <link rel="self"> in the entry.
 *
 * @param  string $rel The "rel" attribute to look for.
 * @return mixed
 */
 public function link($rel = null) {
 if ($rel === null) {
 return parent::__call('link', null);
 }
 
 // index link tags by their "rel" attribute.
 $links = parent::__get('link');
 if (! is_array($links)) {
 if ($links instanceof Zend_Feed_Element) {
 $links = array($links);
 } else {
 return $links;
 }
 }
 
 foreach ($links as $link) {
 if (empty($link['rel'])) {
 continue;
 }
 if ($rel == $link['rel']) {
 return $link['href'];
 }
 }
 
 return null;
 }
 
 }
 
 |