Source of file Atom.php
Size: 9,747 Bytes - Last Modified: 2021-12-23T10:30:11+00:00
/var/www/docs.ssmods.com/process/src/thirdparty/Zend/Feed/Entry/Atom.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281 | <?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 13890 2009-01-31 10:10:30Z yoshida@zend.co.jp $ */ /** * @see Zend_Feed_Entry_Abstract */ require_once '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 { /** * Content-Type */ const CONTENT_TYPE = 'application/atom+xml'; /** * 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 '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 '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 '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: ' . self::CONTENT_TYPE)); $client->setRawData($this->saveXML()); $response = $client->request('POST'); } else { $client->setHeaders('Content-Type', self::CONTENT_TYPE); $client->setRawData($this->saveXML()); $response = $client->request('PUT'); } if ($response->getStatus() !== 200) { /** * @see Zend_Feed_Exception */ require_once '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 '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->setHeaders('Content-Type', self::CONTENT_TYPE); $client->setRawData($this->saveXML()); $response = $client->request('POST'); if ($response->getStatus() !== 201) { /** * @see Zend_Feed_Exception */ require_once '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 = new DOMDocument; $status = @$newEntry->loadXML($response->getBody()); @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('XML cannot be parsed: ' . $php_errormsg); } $newEntry = $newEntry->getElementsByTagName($this->_rootElement)->item(0); if (!$newEntry) { /** * @see Zend_Feed_Exception */ require_once '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; } } |