File indexing completed on 2024-06-16 05:30:03

0001 <?php
0002 /**
0003  * Zend Framework
0004  *
0005  * LICENSE
0006  *
0007  * This source file is subject to the new BSD license that is bundled
0008  * with this package in the file LICENSE.txt.
0009  * It is also available through the world-wide-web at this URL:
0010  * http://framework.zend.com/license/new-bsd
0011  * If you did not receive a copy of the license and are unable to
0012  * obtain it through the world-wide-web, please send an email
0013  * to license@zend.com so we can send you a copy immediately.
0014  *
0015  * @category   Zend
0016  * @package    Zend_Feed_Writer
0017  * @copyright  Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
0018  * @license    http://framework.zend.com/license/new-bsd     New BSD License
0019  * @version    $Id$
0020  */
0021 
0022 /**
0023  * @see Zend_Date
0024  */
0025 // require_once 'Zend/Date.php';
0026 
0027 /**
0028  * @see Zend_Date
0029  */
0030 // require_once 'Zend/Uri.php';
0031 
0032 // require_once 'Zend/Feed/Writer/Source.php';
0033 
0034 /**
0035  * @category   Zend
0036  * @package    Zend_Feed_Writer
0037  * @copyright  Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
0038  * @license    http://framework.zend.com/license/new-bsd     New BSD License
0039  */
0040 class Zend_Feed_Writer_Entry
0041 {
0042 
0043     /**
0044      * Internal array containing all data associated with this entry or item.
0045      *
0046      * @var array
0047      */
0048     protected $_data = array();
0049 
0050     /**
0051      * Registered extensions
0052      *
0053      * @var array
0054      */
0055     protected $_extensions = array();
0056 
0057     /**
0058      * Holds the value "atom" or "rss" depending on the feed type set when
0059      * when last exported.
0060      *
0061      * @var string
0062      */
0063     protected $_type = null;
0064 
0065     /**
0066      * Constructor: Primarily triggers the registration of core extensions and
0067      * loads those appropriate to this data container.
0068      *
0069      * @return void
0070      */
0071     public function __construct()
0072     {
0073         Zend_Feed_Writer::registerCoreExtensions();
0074         $this->_loadExtensions();
0075     }
0076 
0077     /**
0078      * Set a single author
0079      *
0080      * @param  int $index
0081      * @return string|null
0082      */
0083     public function addAuthor($name, $email = null, $uri = null)
0084     {
0085         $author = array();
0086         if (is_array($name)) {
0087             if (!array_key_exists('name', $name)
0088                 || empty($name['name'])
0089                 || !is_string($name['name'])
0090             ) {
0091                 // require_once 'Zend/Feed/Exception.php';
0092                 throw new Zend_Feed_Exception('Invalid parameter: author array must include a "name" key with a non-empty string value');
0093             }
0094             $author['name'] = $name['name'];
0095             if (isset($name['email'])) {
0096                 if (empty($name['email']) || !is_string($name['email'])) {
0097                     // require_once 'Zend/Feed/Exception.php';
0098                     throw new Zend_Feed_Exception('Invalid parameter: "email" array value must be a non-empty string');
0099                 }
0100                 $author['email'] = $name['email'];
0101             }
0102             if (isset($name['uri'])) {
0103                 if (empty($name['uri'])
0104                     || !is_string($name['uri'])
0105                     || !Zend_Uri::check($name['uri'])
0106                 ) {
0107                     // require_once 'Zend/Feed/Exception.php';
0108                     throw new Zend_Feed_Exception('Invalid parameter: "uri" array value must be a non-empty string and valid URI/IRI');
0109                 }
0110                 $author['uri'] = $name['uri'];
0111             }
0112         /**
0113          * @deprecated
0114          * Array notation (above) is preferred and will be the sole supported input from ZF 2.0
0115          */
0116         } else {
0117             if (empty($name) || !is_string($name)) {
0118                 // require_once 'Zend/Feed/Exception.php';
0119                 throw new Zend_Feed_Exception('Invalid parameter: "name" must be a non-empty string value');
0120             }
0121             $author['name'] = $name;
0122             if (isset($email)) {
0123                 if (empty($email) || !is_string($email)) {
0124                     // require_once 'Zend/Feed/Exception.php';
0125                     throw new Zend_Feed_Exception('Invalid parameter: "email" value must be a non-empty string');
0126                 }
0127                 $author['email'] = $email;
0128             }
0129             if (isset($uri)) {
0130                 if (empty($uri) || !is_string($uri) || !Zend_Uri::check($uri)) {
0131                     // require_once 'Zend/Feed/Exception.php';
0132                     throw new Zend_Feed_Exception('Invalid parameter: "uri" value must be a non-empty string and valid URI/IRI');
0133                 }
0134                 $author['uri'] = $uri;
0135             }
0136         }
0137         $this->_data['authors'][] = $author;
0138     }
0139 
0140     /**
0141      * Set an array with feed authors
0142      *
0143      * @return array
0144      */
0145     public function addAuthors(array $authors)
0146     {
0147         foreach($authors as $author) {
0148             $this->addAuthor($author);
0149         }
0150     }
0151 
0152     /**
0153      * Set the feed character encoding
0154      *
0155      * @return string|null
0156      */
0157     public function setEncoding($encoding)
0158     {
0159         if (empty($encoding) || !is_string($encoding)) {
0160             // require_once 'Zend/Feed/Exception.php';
0161             throw new Zend_Feed_Exception('Invalid parameter: parameter must be a non-empty string');
0162         }
0163         $this->_data['encoding'] = $encoding;
0164     }
0165 
0166     /**
0167      * Get the feed character encoding
0168      *
0169      * @return string|null
0170      */
0171     public function getEncoding()
0172     {
0173         if (!array_key_exists('encoding', $this->_data)) {
0174             return 'UTF-8';
0175         }
0176         return $this->_data['encoding'];
0177     }
0178 
0179     /**
0180      * Set the copyright entry
0181      *
0182      * @return string|null
0183      */
0184     public function setCopyright($copyright)
0185     {
0186         if (empty($copyright) || !is_string($copyright)) {
0187             // require_once 'Zend/Feed/Exception.php';
0188             throw new Zend_Feed_Exception('Invalid parameter: parameter must be a non-empty string');
0189         }
0190         $this->_data['copyright'] = $copyright;
0191     }
0192 
0193     /**
0194      * Set the entry's content
0195      *
0196      * @return string|null
0197      */
0198     public function setContent($content)
0199     {
0200         if (empty($content) || !is_string($content)) {
0201             // require_once 'Zend/Feed/Exception.php';
0202             throw new Zend_Feed_Exception('Invalid parameter: parameter must be a non-empty string');
0203         }
0204         $this->_data['content'] = $content;
0205     }
0206 
0207     /**
0208      * Set the feed creation date
0209      *
0210      * @return string|null
0211      */
0212     public function setDateCreated($date = null)
0213     {
0214         $zdate = null;
0215         if ($date === null) {
0216             $zdate = new Zend_Date;
0217         } elseif ($date instanceof Zend_Date) {
0218             $zdate = $date;
0219         } elseif (ctype_digit((string)$date)) {
0220             $zdate = new Zend_Date($date, Zend_Date::TIMESTAMP);
0221         } else {
0222             // require_once 'Zend/Feed/Exception.php';
0223             throw new Zend_Feed_Exception('Invalid Zend_Date object or UNIX Timestamp passed as parameter');
0224         }
0225         $this->_data['dateCreated'] = $zdate;
0226     }
0227 
0228     /**
0229      * Set the feed modification date
0230      *
0231      * @return string|null
0232      */
0233     public function setDateModified($date = null)
0234     {
0235         $zdate = null;
0236         if ($date === null) {
0237             $zdate = new Zend_Date;
0238         } elseif ($date instanceof Zend_Date) {
0239             $zdate = $date;
0240         } elseif (ctype_digit((string)$date)) {
0241             $zdate = new Zend_Date($date, Zend_Date::TIMESTAMP);
0242         } else {
0243             // require_once 'Zend/Feed/Exception.php';
0244             throw new Zend_Feed_Exception('Invalid Zend_Date object or UNIX Timestamp passed as parameter');
0245         }
0246         $this->_data['dateModified'] = $zdate;
0247     }
0248 
0249     /**
0250      * Set the feed description
0251      *
0252      * @return string|null
0253      */
0254     public function setDescription($description)
0255     {
0256         if (empty($description) || !is_string($description)) {
0257             // require_once 'Zend/Feed/Exception.php';
0258             throw new Zend_Feed_Exception('Invalid parameter: parameter must be a non-empty string');
0259         }
0260         $this->_data['description'] = $description;
0261     }
0262 
0263     /**
0264      * Set the feed ID
0265      *
0266      * @return string|null
0267      */
0268     public function setId($id)
0269     {
0270         if (empty($id) || !is_string($id)) {
0271             // require_once 'Zend/Feed/Exception.php';
0272             throw new Zend_Feed_Exception('Invalid parameter: parameter must be a non-empty string');
0273         }
0274         $this->_data['id'] = $id;
0275     }
0276 
0277     /**
0278      * Set a link to the HTML source of this entry
0279      *
0280      * @return string|null
0281      */
0282     public function setLink($link)
0283     {
0284         if (empty($link) || !is_string($link) || !Zend_Uri::check($link)) {
0285             // require_once 'Zend/Feed/Exception.php';
0286             throw new Zend_Feed_Exception('Invalid parameter: parameter must be a non-empty string and valid URI/IRI');
0287         }
0288         $this->_data['link'] = $link;
0289     }
0290 
0291     /**
0292      * Set the number of comments associated with this entry
0293      *
0294      * @return string|null
0295      */
0296     public function setCommentCount($count)
0297     {
0298         if ( !is_numeric($count) || (int) $count < 0) {
0299             // require_once 'Zend/Feed/Exception.php';
0300             throw new Zend_Feed_Exception('Invalid parameter: "count" must be a non-empty integer number');
0301         }
0302         $this->_data['commentCount'] = (int) $count;
0303     }
0304 
0305     /**
0306      * Set a link to a HTML page containing comments associated with this entry
0307      *
0308      * @return string|null
0309      */
0310     public function setCommentLink($link)
0311     {
0312         if (empty($link) || !is_string($link) || !Zend_Uri::check($link)) {
0313             // require_once 'Zend/Feed/Exception.php';
0314             throw new Zend_Feed_Exception('Invalid parameter: "link" must be a non-empty string and valid URI/IRI');
0315         }
0316         $this->_data['commentLink'] = $link;
0317     }
0318 
0319     /**
0320      * Set a link to an XML feed for any comments associated with this entry
0321      *
0322      * @return string|null
0323      */
0324     public function setCommentFeedLink(array $link)
0325     {
0326         if (!isset($link['uri']) || !is_string($link['uri']) || !Zend_Uri::check($link['uri'])) {
0327             // require_once 'Zend/Feed/Exception.php';
0328             throw new Zend_Feed_Exception('Invalid parameter: "link" must be a non-empty string and valid URI/IRI');
0329         }
0330         if (!isset($link['type']) || !in_array($link['type'], array('atom', 'rss', 'rdf'))) {
0331             // require_once 'Zend/Feed/Exception.php';
0332             throw new Zend_Feed_Exception('Invalid parameter: "type" must be one'
0333             . ' of "atom", "rss" or "rdf"');
0334         }
0335         if (!isset($this->_data['commentFeedLinks'])) {
0336             $this->_data['commentFeedLinks'] = array();
0337         }
0338         $this->_data['commentFeedLinks'][] = $link;
0339     }
0340 
0341     /**
0342      * Set a links to an XML feed for any comments associated with this entry.
0343      * Each link is an array with keys "uri" and "type", where type is one of:
0344      * "atom", "rss" or "rdf".
0345      *
0346      * @return string|null
0347      */
0348     public function setCommentFeedLinks(array $links)
0349     {
0350         foreach ($links as $link) {
0351             $this->setCommentFeedLink($link);
0352         }
0353     }
0354 
0355     /**
0356      * Set the feed title
0357      *
0358      * @return string|null
0359      */
0360     public function setTitle($title)
0361     {
0362         if (empty($title) || !is_string($title)) {
0363             // require_once 'Zend/Feed/Exception.php';
0364             throw new Zend_Feed_Exception('Invalid parameter: parameter must be a non-empty string');
0365         }
0366         $this->_data['title'] = $title;
0367     }
0368 
0369     /**
0370      * Get an array with feed authors
0371      *
0372      * @return array
0373      */
0374     public function getAuthors()
0375     {
0376         if (!array_key_exists('authors', $this->_data)) {
0377             return null;
0378         }
0379         return $this->_data['authors'];
0380     }
0381 
0382     /**
0383      * Get the entry content
0384      *
0385      * @return string
0386      */
0387     public function getContent()
0388     {
0389         if (!array_key_exists('content', $this->_data)) {
0390             return null;
0391         }
0392         return $this->_data['content'];
0393     }
0394 
0395     /**
0396      * Get the entry copyright information
0397      *
0398      * @return string
0399      */
0400     public function getCopyright()
0401     {
0402         if (!array_key_exists('copyright', $this->_data)) {
0403             return null;
0404         }
0405         return $this->_data['copyright'];
0406     }
0407 
0408     /**
0409      * Get the entry creation date
0410      *
0411      * @return string
0412      */
0413     public function getDateCreated()
0414     {
0415         if (!array_key_exists('dateCreated', $this->_data)) {
0416             return null;
0417         }
0418         return $this->_data['dateCreated'];
0419     }
0420 
0421     /**
0422      * Get the entry modification date
0423      *
0424      * @return string
0425      */
0426     public function getDateModified()
0427     {
0428         if (!array_key_exists('dateModified', $this->_data)) {
0429             return null;
0430         }
0431         return $this->_data['dateModified'];
0432     }
0433 
0434     /**
0435      * Get the entry description
0436      *
0437      * @return string
0438      */
0439     public function getDescription()
0440     {
0441         if (!array_key_exists('description', $this->_data)) {
0442             return null;
0443         }
0444         return $this->_data['description'];
0445     }
0446 
0447     /**
0448      * Get the entry ID
0449      *
0450      * @return string
0451      */
0452     public function getId()
0453     {
0454         if (!array_key_exists('id', $this->_data)) {
0455             return null;
0456         }
0457         return $this->_data['id'];
0458     }
0459 
0460     /**
0461      * Get a link to the HTML source
0462      *
0463      * @return string|null
0464      */
0465     public function getLink()
0466     {
0467         if (!array_key_exists('link', $this->_data)) {
0468             return null;
0469         }
0470         return $this->_data['link'];
0471     }
0472 
0473 
0474     /**
0475      * Get all links
0476      *
0477      * @return array
0478      */
0479     public function getLinks()
0480     {
0481         if (!array_key_exists('links', $this->_data)) {
0482             return null;
0483         }
0484         return $this->_data['links'];
0485     }
0486 
0487     /**
0488      * Get the entry title
0489      *
0490      * @return string
0491      */
0492     public function getTitle()
0493     {
0494         if (!array_key_exists('title', $this->_data)) {
0495             return null;
0496         }
0497         return $this->_data['title'];
0498     }
0499 
0500     /**
0501      * Get the number of comments/replies for current entry
0502      *
0503      * @return integer
0504      */
0505     public function getCommentCount()
0506     {
0507         if (!array_key_exists('commentCount', $this->_data)) {
0508             return null;
0509         }
0510         return $this->_data['commentCount'];
0511     }
0512 
0513     /**
0514      * Returns a URI pointing to the HTML page where comments can be made on this entry
0515      *
0516      * @return string
0517      */
0518     public function getCommentLink()
0519     {
0520         if (!array_key_exists('commentLink', $this->_data)) {
0521             return null;
0522         }
0523         return $this->_data['commentLink'];
0524     }
0525 
0526     /**
0527      * Returns an array of URIs pointing to a feed of all comments for this entry
0528      * where the array keys indicate the feed type (atom, rss or rdf).
0529      *
0530      * @return string
0531      */
0532     public function getCommentFeedLinks()
0533     {
0534         if (!array_key_exists('commentFeedLinks', $this->_data)) {
0535             return null;
0536         }
0537         return $this->_data['commentFeedLinks'];
0538     }
0539 
0540     /**
0541      * Add a entry category
0542      *
0543      * @param string $category
0544      */
0545     public function addCategory(array $category)
0546     {
0547         if (!isset($category['term'])) {
0548             // require_once 'Zend/Feed/Exception.php';
0549             throw new Zend_Feed_Exception('Each category must be an array and '
0550             . 'contain at least a "term" element containing the machine '
0551             . ' readable category name');
0552         }
0553         if (isset($category['scheme'])) {
0554             if (empty($category['scheme'])
0555                 || !is_string($category['scheme'])
0556                 || !Zend_Uri::check($category['scheme'])
0557             ) {
0558                 // require_once 'Zend/Feed/Exception.php';
0559                 throw new Zend_Feed_Exception('The Atom scheme or RSS domain of'
0560                 . ' a category must be a valid URI');
0561             }
0562         }
0563         if (!isset($this->_data['categories'])) {
0564             $this->_data['categories'] = array();
0565         }
0566         $this->_data['categories'][] = $category;
0567     }
0568 
0569     /**
0570      * Set an array of entry categories
0571      *
0572      * @param array $categories
0573      */
0574     public function addCategories(array $categories)
0575     {
0576         foreach ($categories as $category) {
0577             $this->addCategory($category);
0578         }
0579     }
0580 
0581     /**
0582      * Get the entry categories
0583      *
0584      * @return string|null
0585      */
0586     public function getCategories()
0587     {
0588         if (!array_key_exists('categories', $this->_data)) {
0589             return null;
0590         }
0591         return $this->_data['categories'];
0592     }
0593 
0594     /**
0595      * Adds an enclosure to the entry. The array parameter may contain the
0596      * keys 'uri', 'type' and 'length'. Only 'uri' is required for Atom, though the
0597      * others must also be provided or RSS rendering (where they are required)
0598      * will throw an Exception.
0599      *
0600      * @param array $enclosures
0601      */
0602     public function setEnclosure(array $enclosure)
0603     {
0604         if (!isset($enclosure['uri'])) {
0605             // require_once 'Zend/Feed/Exception.php';
0606             throw new Zend_Feed_Exception('Enclosure "uri" is not set');
0607         }
0608         if (!Zend_Uri::check($enclosure['uri'])) {
0609             // require_once 'Zend/Feed/Exception.php';
0610             throw new Zend_Feed_Exception('Enclosure "uri" is not a valid URI/IRI');
0611         }
0612         $this->_data['enclosure'] = $enclosure;
0613     }
0614 
0615     /**
0616      * Retrieve an array of all enclosures to be added to entry.
0617      *
0618      * @return array
0619      */
0620     public function getEnclosure()
0621     {
0622         if (!array_key_exists('enclosure', $this->_data)) {
0623             return null;
0624         }
0625         return $this->_data['enclosure'];
0626     }
0627 
0628     /**
0629      * Unset a specific data point
0630      *
0631      * @param string $name
0632      */
0633     public function remove($name)
0634     {
0635         if (isset($this->_data[$name])) {
0636             unset($this->_data[$name]);
0637         }
0638     }
0639 
0640     /**
0641      * Get registered extensions
0642      *
0643      * @return array
0644      */
0645     public function getExtensions()
0646     {
0647         return $this->_extensions;
0648     }
0649 
0650     /**
0651      * Return an Extension object with the matching name (postfixed with _Entry)
0652      *
0653      * @param string $name
0654      * @return object
0655      */
0656     public function getExtension($name)
0657     {
0658         if (array_key_exists($name . '_Entry', $this->_extensions)) {
0659             return $this->_extensions[$name . '_Entry'];
0660         }
0661         return null;
0662     }
0663 
0664     /**
0665      * Set the current feed type being exported to "rss" or "atom". This allows
0666      * other objects to gracefully choose whether to execute or not, depending
0667      * on their appropriateness for the current type, e.g. renderers.
0668      *
0669      * @param string $type
0670      */
0671     public function setType($type)
0672     {
0673         $this->_type = $type;
0674     }
0675 
0676     /**
0677      * Retrieve the current or last feed type exported.
0678      *
0679      * @return string Value will be "rss" or "atom"
0680      */
0681     public function getType()
0682     {
0683         return $this->_type;
0684     }
0685 
0686     /**
0687      * Method overloading: call given method on first extension implementing it
0688      *
0689      * @param  string $method
0690      * @param  array $args
0691      * @return mixed
0692      * @throws Zend_Feed_Exception if no extensions implements the method
0693      */
0694     public function __call($method, $args)
0695     {
0696         foreach ($this->_extensions as $extension) {
0697             try {
0698                 return call_user_func_array(array($extension, $method), $args);
0699             } catch (Zend_Feed_Writer_Exception_InvalidMethodException $e) {
0700             }
0701         }
0702         // require_once 'Zend/Feed/Exception.php';
0703         throw new Zend_Feed_Exception('Method: ' . $method
0704             . ' does not exist and could not be located on a registered Extension');
0705     }
0706 
0707     /**
0708      * Creates a new Zend_Feed_Writer_Source data container for use. This is NOT
0709      * added to the current feed automatically, but is necessary to create a
0710      * container with some initial values preset based on the current feed data.
0711      *
0712      * @return Zend_Feed_Writer_Source
0713      */
0714     public function createSource()
0715     {
0716         $source = new Zend_Feed_Writer_Source;
0717         if ($this->getEncoding()) {
0718             $source->setEncoding($this->getEncoding());
0719         }
0720         $source->setType($this->getType());
0721         return $source;
0722     }
0723 
0724     /**
0725      * Appends a Zend_Feed_Writer_Entry object representing a new entry/item
0726      * the feed data container's internal group of entries.
0727      *
0728      * @param Zend_Feed_Writer_Source $source
0729      */
0730     public function setSource(Zend_Feed_Writer_Source $source)
0731     {
0732         $this->_data['source'] = $source;
0733     }
0734 
0735     /**
0736      * @return Zend_Feed_Writer_Source
0737      */
0738     public function getSource()
0739     {
0740         if (isset($this->_data['source'])) {
0741             return $this->_data['source'];
0742         }
0743         return null;
0744     }
0745 
0746     /**
0747      * Load extensions from Zend_Feed_Writer
0748      *
0749      * @return void
0750      */
0751     protected function _loadExtensions()
0752     {
0753         $all = Zend_Feed_Writer::getExtensions();
0754         $exts = $all['entry'];
0755         foreach ($exts as $ext) {
0756             $className = Zend_Feed_Writer::getPluginLoader()->getClassName($ext);
0757             $this->_extensions[$ext] = new $className();
0758             $this->_extensions[$ext]->setEncoding($this->getEncoding());
0759         }
0760     }
0761 }