Chris@0: _loadExtensions(); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Set a single author Chris@0: * Chris@0: * The following option keys are supported: Chris@0: * 'name' => (string) The name Chris@0: * 'email' => (string) An optional email Chris@0: * 'uri' => (string) An optional and valid URI Chris@0: * Chris@0: * @param array $author Chris@0: * @throws Exception\InvalidArgumentException If any value of $author not follow the format. Chris@0: * @return AbstractFeed Chris@0: */ Chris@0: public function addAuthor(array $author) Chris@0: { Chris@0: // Check array values Chris@12: if (! array_key_exists('name', $author) Chris@0: || empty($author['name']) Chris@12: || ! is_string($author['name']) Chris@0: ) { Chris@0: throw new Exception\InvalidArgumentException( Chris@12: 'Invalid parameter: author array must include a "name" key with a non-empty string value' Chris@12: ); Chris@0: } Chris@0: Chris@0: if (isset($author['email'])) { Chris@12: if (empty($author['email']) || ! is_string($author['email'])) { Chris@0: throw new Exception\InvalidArgumentException( Chris@12: 'Invalid parameter: "email" array value must be a non-empty string' Chris@12: ); Chris@0: } Chris@0: } Chris@0: if (isset($author['uri'])) { Chris@12: if (empty($author['uri']) || ! is_string($author['uri']) || Chris@12: ! Uri::factory($author['uri'])->isValid() Chris@0: ) { Chris@0: throw new Exception\InvalidArgumentException( Chris@12: 'Invalid parameter: "uri" array value must be a non-empty string and valid URI/IRI' Chris@12: ); Chris@0: } Chris@0: } Chris@0: Chris@0: $this->data['authors'][] = $author; Chris@0: Chris@0: return $this; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Set an array with feed authors Chris@0: * Chris@0: * @see addAuthor Chris@0: * @param array $authors Chris@0: * @return AbstractFeed Chris@0: */ Chris@0: public function addAuthors(array $authors) Chris@0: { Chris@0: foreach ($authors as $author) { Chris@0: $this->addAuthor($author); Chris@0: } Chris@0: Chris@0: return $this; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Set the copyright entry Chris@0: * Chris@0: * @param string $copyright Chris@0: * @throws Exception\InvalidArgumentException Chris@0: * @return AbstractFeed Chris@0: */ Chris@0: public function setCopyright($copyright) Chris@0: { Chris@12: if (empty($copyright) || ! is_string($copyright)) { Chris@0: throw new Exception\InvalidArgumentException('Invalid parameter: parameter must be a non-empty string'); Chris@0: } Chris@0: $this->data['copyright'] = $copyright; Chris@0: Chris@0: return $this; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Set the feed creation date Chris@0: * Chris@17: * @param null|int|DateTimeInterface Chris@0: * @throws Exception\InvalidArgumentException Chris@0: * @return AbstractFeed Chris@0: */ Chris@0: public function setDateCreated($date = null) Chris@0: { Chris@0: if ($date === null) { Chris@0: $date = new DateTime(); Chris@17: } Chris@17: if (is_int($date)) { Chris@0: $date = new DateTime('@' . $date); Chris@17: } Chris@17: if (! $date instanceof DateTimeInterface) { Chris@0: throw new Exception\InvalidArgumentException('Invalid DateTime object or UNIX Timestamp' Chris@0: . ' passed as parameter'); Chris@0: } Chris@0: $this->data['dateCreated'] = $date; Chris@0: Chris@0: return $this; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Set the feed modification date Chris@0: * Chris@17: * @param null|int|DateTimeInterface Chris@0: * @throws Exception\InvalidArgumentException Chris@0: * @return AbstractFeed Chris@0: */ Chris@0: public function setDateModified($date = null) Chris@0: { Chris@0: if ($date === null) { Chris@0: $date = new DateTime(); Chris@17: } Chris@17: if (is_int($date)) { Chris@0: $date = new DateTime('@' . $date); Chris@17: } Chris@17: if (! $date instanceof DateTimeInterface) { Chris@0: throw new Exception\InvalidArgumentException('Invalid DateTime object or UNIX Timestamp' Chris@0: . ' passed as parameter'); Chris@0: } Chris@0: $this->data['dateModified'] = $date; Chris@0: Chris@0: return $this; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Set the feed last-build date. Ignored for Atom 1.0. Chris@0: * Chris@17: * @param null|int|DateTimeInterface Chris@0: * @throws Exception\InvalidArgumentException Chris@0: * @return AbstractFeed Chris@0: */ Chris@0: public function setLastBuildDate($date = null) Chris@0: { Chris@0: if ($date === null) { Chris@0: $date = new DateTime(); Chris@17: } Chris@17: if (is_int($date)) { Chris@0: $date = new DateTime('@' . $date); Chris@17: } Chris@17: if (! $date instanceof DateTimeInterface) { Chris@0: throw new Exception\InvalidArgumentException('Invalid DateTime object or UNIX Timestamp' Chris@0: . ' passed as parameter'); Chris@0: } Chris@0: $this->data['lastBuildDate'] = $date; Chris@0: Chris@0: return $this; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Set the feed description Chris@0: * Chris@0: * @param string $description Chris@0: * @throws Exception\InvalidArgumentException Chris@0: * @return AbstractFeed Chris@0: */ Chris@0: public function setDescription($description) Chris@0: { Chris@12: if (empty($description) || ! is_string($description)) { Chris@0: throw new Exception\InvalidArgumentException('Invalid parameter: parameter must be a non-empty string'); Chris@0: } Chris@0: $this->data['description'] = $description; Chris@0: Chris@0: return $this; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Set the feed generator entry Chris@0: * Chris@0: * @param array|string $name Chris@0: * @param null|string $version Chris@0: * @param null|string $uri Chris@0: * @throws Exception\InvalidArgumentException Chris@0: * @return AbstractFeed Chris@0: */ Chris@0: public function setGenerator($name, $version = null, $uri = null) Chris@0: { Chris@0: if (is_array($name)) { Chris@0: $data = $name; Chris@12: if (empty($data['name']) || ! is_string($data['name'])) { Chris@0: throw new Exception\InvalidArgumentException('Invalid parameter: "name" must be a non-empty string'); Chris@0: } Chris@0: $generator = ['name' => $data['name']]; Chris@0: if (isset($data['version'])) { Chris@12: if (empty($data['version']) || ! is_string($data['version'])) { Chris@12: throw new Exception\InvalidArgumentException( Chris@12: 'Invalid parameter: "version" must be a non-empty string' Chris@12: ); Chris@0: } Chris@0: $generator['version'] = $data['version']; Chris@0: } Chris@0: if (isset($data['uri'])) { Chris@12: if (empty($data['uri']) || ! is_string($data['uri']) || ! Uri::factory($data['uri'])->isValid()) { Chris@12: throw new Exception\InvalidArgumentException( Chris@12: 'Invalid parameter: "uri" must be a non-empty string and a valid URI/IRI' Chris@12: ); Chris@0: } Chris@0: $generator['uri'] = $data['uri']; Chris@0: } Chris@0: } else { Chris@12: if (empty($name) || ! is_string($name)) { Chris@0: throw new Exception\InvalidArgumentException('Invalid parameter: "name" must be a non-empty string'); Chris@0: } Chris@0: $generator = ['name' => $name]; Chris@0: if (isset($version)) { Chris@12: if (empty($version) || ! is_string($version)) { Chris@12: throw new Exception\InvalidArgumentException( Chris@12: 'Invalid parameter: "version" must be a non-empty string' Chris@12: ); Chris@0: } Chris@0: $generator['version'] = $version; Chris@0: } Chris@0: if (isset($uri)) { Chris@12: if (empty($uri) || ! is_string($uri) || ! Uri::factory($uri)->isValid()) { Chris@12: throw new Exception\InvalidArgumentException( Chris@12: 'Invalid parameter: "uri" must be a non-empty string and a valid URI/IRI' Chris@12: ); Chris@0: } Chris@0: $generator['uri'] = $uri; Chris@0: } Chris@0: } Chris@0: $this->data['generator'] = $generator; Chris@0: Chris@0: return $this; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Set the feed ID - URI or URN (via PCRE pattern) supported Chris@0: * Chris@0: * @param string $id Chris@0: * @throws Exception\InvalidArgumentException Chris@0: * @return AbstractFeed Chris@0: */ Chris@0: public function setId($id) Chris@0: { Chris@12: // @codingStandardsIgnoreStart Chris@12: if ((empty($id) || ! is_string($id) || ! Uri::factory($id)->isValid()) Chris@12: && ! preg_match("#^urn:[a-zA-Z0-9][a-zA-Z0-9\-]{1,31}:([a-zA-Z0-9\(\)\+\,\.\:\=\@\;\$\_\!\*\-]|%[0-9a-fA-F]{2})*#", $id) Chris@12: && ! $this->_validateTagUri($id) Chris@0: ) { Chris@12: // @codingStandardsIgnoreEnd Chris@12: throw new Exception\InvalidArgumentException( Chris@12: 'Invalid parameter: parameter must be a non-empty string and valid URI/IRI' Chris@12: ); Chris@0: } Chris@0: $this->data['id'] = $id; Chris@0: Chris@0: return $this; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Validate a URI using the tag scheme (RFC 4151) Chris@0: * Chris@0: * @param string $id Chris@0: * @return bool Chris@0: */ Chris@12: // @codingStandardsIgnoreStart Chris@0: protected function _validateTagUri($id) Chris@0: { Chris@12: // @codingStandardsIgnoreEnd Chris@12: if (preg_match( Chris@12: '/^tag:(?P.*),(?P\d{4}-?\d{0,2}-?\d{0,2}):(?P.*)(.*:)*$/', Chris@12: $id, Chris@12: $matches Chris@12: )) { Chris@0: $dvalid = false; Chris@0: $date = $matches['date']; Chris@0: $d6 = strtotime($date); Chris@0: if ((strlen($date) == 4) && $date <= date('Y')) { Chris@0: $dvalid = true; Chris@0: } elseif ((strlen($date) == 7) && ($d6 < strtotime("now"))) { Chris@0: $dvalid = true; Chris@0: } elseif ((strlen($date) == 10) && ($d6 < strtotime("now"))) { Chris@0: $dvalid = true; Chris@0: } Chris@0: $validator = new Validator\EmailAddress; Chris@0: if ($validator->isValid($matches['name'])) { Chris@0: $nvalid = true; Chris@0: } else { Chris@0: $nvalid = $validator->isValid('info@' . $matches['name']); Chris@0: } Chris@0: return $dvalid && $nvalid; Chris@0: } Chris@0: return false; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Set a feed image (URI at minimum). Parameter is a single array with the Chris@0: * required key 'uri'. When rendering as RSS, the required keys are 'uri', Chris@0: * 'title' and 'link'. RSS also specifies three optional parameters 'width', Chris@0: * 'height' and 'description'. Only 'uri' is required and used for Atom rendering. Chris@0: * Chris@0: * @param array $data Chris@0: * @throws Exception\InvalidArgumentException Chris@0: * @return AbstractFeed Chris@0: */ Chris@0: public function setImage(array $data) Chris@0: { Chris@12: if (empty($data['uri']) || ! is_string($data['uri']) Chris@12: || ! Uri::factory($data['uri'])->isValid() Chris@0: ) { Chris@0: throw new Exception\InvalidArgumentException('Invalid parameter: parameter \'uri\'' Chris@0: . ' must be a non-empty string and valid URI/IRI'); Chris@0: } Chris@0: $this->data['image'] = $data; Chris@0: Chris@0: return $this; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Set the feed language Chris@0: * Chris@0: * @param string $language Chris@0: * @throws Exception\InvalidArgumentException Chris@0: * @return AbstractFeed Chris@0: */ Chris@0: public function setLanguage($language) Chris@0: { Chris@12: if (empty($language) || ! is_string($language)) { Chris@0: throw new Exception\InvalidArgumentException('Invalid parameter: parameter must be a non-empty string'); Chris@0: } Chris@0: $this->data['language'] = $language; Chris@0: Chris@0: return $this; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Set a link to the HTML source Chris@0: * Chris@0: * @param string $link Chris@0: * @throws Exception\InvalidArgumentException Chris@0: * @return AbstractFeed Chris@0: */ Chris@0: public function setLink($link) Chris@0: { Chris@12: if (empty($link) || ! is_string($link) || ! Uri::factory($link)->isValid()) { Chris@12: throw new Exception\InvalidArgumentException( Chris@12: 'Invalid parameter: parameter must be a non-empty string and valid URI/IRI' Chris@12: ); Chris@0: } Chris@0: $this->data['link'] = $link; Chris@0: Chris@0: return $this; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Set a link to an XML feed for any feed type/version Chris@0: * Chris@0: * @param string $link Chris@0: * @param string $type Chris@0: * @throws Exception\InvalidArgumentException Chris@0: * @return AbstractFeed Chris@0: */ Chris@0: public function setFeedLink($link, $type) Chris@0: { Chris@12: if (empty($link) || ! is_string($link) || ! Uri::factory($link)->isValid()) { Chris@12: throw new Exception\InvalidArgumentException( Chris@12: 'Invalid parameter: "link"" must be a non-empty string and valid URI/IRI' Chris@12: ); Chris@0: } Chris@12: if (! in_array(strtolower($type), ['rss', 'rdf', 'atom'])) { Chris@12: throw new Exception\InvalidArgumentException( Chris@12: 'Invalid parameter: "type"; You must declare the type of feed the link points to, i.e. RSS, RDF or Atom' Chris@12: ); Chris@0: } Chris@0: $this->data['feedLinks'][strtolower($type)] = $link; Chris@0: Chris@0: return $this; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Set the feed title Chris@0: * Chris@0: * @param string $title Chris@0: * @throws Exception\InvalidArgumentException Chris@0: * @return AbstractFeed Chris@0: */ Chris@0: public function setTitle($title) Chris@0: { Chris@16: if ((empty($title) && ! is_numeric($title)) || ! is_string($title)) { Chris@0: throw new Exception\InvalidArgumentException('Invalid parameter: parameter must be a non-empty string'); Chris@0: } Chris@0: $this->data['title'] = $title; Chris@0: Chris@0: return $this; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Set the feed character encoding Chris@0: * Chris@0: * @param string $encoding Chris@0: * @throws Exception\InvalidArgumentException Chris@0: * @return AbstractFeed Chris@0: */ Chris@0: public function setEncoding($encoding) Chris@0: { Chris@12: if (empty($encoding) || ! is_string($encoding)) { Chris@0: throw new Exception\InvalidArgumentException('Invalid parameter: parameter must be a non-empty string'); Chris@0: } Chris@0: $this->data['encoding'] = $encoding; Chris@0: Chris@0: return $this; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Set the feed's base URL Chris@0: * Chris@0: * @param string $url Chris@0: * @throws Exception\InvalidArgumentException Chris@0: * @return AbstractFeed Chris@0: */ Chris@0: public function setBaseUrl($url) Chris@0: { Chris@12: if (empty($url) || ! is_string($url) || ! Uri::factory($url)->isValid()) { Chris@0: throw new Exception\InvalidArgumentException('Invalid parameter: "url" array value' Chris@0: . ' must be a non-empty string and valid URI/IRI'); Chris@0: } Chris@0: $this->data['baseUrl'] = $url; Chris@0: Chris@0: return $this; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Add a Pubsubhubbub hub endpoint URL Chris@0: * Chris@0: * @param string $url Chris@0: * @throws Exception\InvalidArgumentException Chris@0: * @return AbstractFeed Chris@0: */ Chris@0: public function addHub($url) Chris@0: { Chris@12: if (empty($url) || ! is_string($url) || ! Uri::factory($url)->isValid()) { Chris@0: throw new Exception\InvalidArgumentException('Invalid parameter: "url" array value' Chris@0: . ' must be a non-empty string and valid URI/IRI'); Chris@0: } Chris@12: if (! isset($this->data['hubs'])) { Chris@0: $this->data['hubs'] = []; Chris@0: } Chris@0: $this->data['hubs'][] = $url; Chris@0: Chris@0: return $this; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Add Pubsubhubbub hub endpoint URLs Chris@0: * Chris@0: * @param array $urls Chris@0: * @return AbstractFeed Chris@0: */ Chris@0: public function addHubs(array $urls) Chris@0: { Chris@0: foreach ($urls as $url) { Chris@0: $this->addHub($url); Chris@0: } Chris@0: Chris@0: return $this; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Add a feed category Chris@0: * Chris@0: * @param array $category Chris@0: * @throws Exception\InvalidArgumentException Chris@0: * @return AbstractFeed Chris@0: */ Chris@0: public function addCategory(array $category) Chris@0: { Chris@12: if (! isset($category['term'])) { Chris@0: throw new Exception\InvalidArgumentException('Each category must be an array and ' Chris@0: . 'contain at least a "term" element containing the machine ' Chris@0: . ' readable category name'); Chris@0: } Chris@0: if (isset($category['scheme'])) { Chris@0: if (empty($category['scheme']) Chris@12: || ! is_string($category['scheme']) Chris@12: || ! Uri::factory($category['scheme'])->isValid() Chris@0: ) { Chris@0: throw new Exception\InvalidArgumentException('The Atom scheme or RSS domain of' Chris@0: . ' a category must be a valid URI'); Chris@0: } Chris@0: } Chris@12: if (! isset($this->data['categories'])) { Chris@0: $this->data['categories'] = []; Chris@0: } Chris@0: $this->data['categories'][] = $category; Chris@0: Chris@0: return $this; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Set an array of feed categories Chris@0: * Chris@0: * @param array $categories Chris@0: * @return AbstractFeed Chris@0: */ Chris@0: public function addCategories(array $categories) Chris@0: { Chris@0: foreach ($categories as $category) { Chris@0: $this->addCategory($category); Chris@0: } Chris@0: Chris@0: return $this; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Get a single author Chris@0: * Chris@0: * @param int $index Chris@0: * @return string|null Chris@0: */ Chris@0: public function getAuthor($index = 0) Chris@0: { Chris@0: if (isset($this->data['authors'][$index])) { Chris@0: return $this->data['authors'][$index]; Chris@0: } Chris@0: Chris@0: return; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Get an array with feed authors Chris@0: * Chris@17: * @return array|null Chris@0: */ Chris@0: public function getAuthors() Chris@0: { Chris@12: if (! array_key_exists('authors', $this->data)) { Chris@0: return; Chris@0: } Chris@0: return $this->data['authors']; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Get the copyright entry Chris@0: * Chris@0: * @return string|null Chris@0: */ Chris@0: public function getCopyright() Chris@0: { Chris@12: if (! array_key_exists('copyright', $this->data)) { Chris@0: return; Chris@0: } Chris@0: return $this->data['copyright']; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Get the feed creation date Chris@0: * Chris@0: * @return string|null Chris@0: */ Chris@0: public function getDateCreated() Chris@0: { Chris@12: if (! array_key_exists('dateCreated', $this->data)) { Chris@0: return; Chris@0: } Chris@0: return $this->data['dateCreated']; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Get the feed modification date Chris@0: * Chris@0: * @return string|null Chris@0: */ Chris@0: public function getDateModified() Chris@0: { Chris@12: if (! array_key_exists('dateModified', $this->data)) { Chris@0: return; Chris@0: } Chris@0: return $this->data['dateModified']; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Get the feed last-build date Chris@0: * Chris@0: * @return string|null Chris@0: */ Chris@0: public function getLastBuildDate() Chris@0: { Chris@12: if (! array_key_exists('lastBuildDate', $this->data)) { Chris@0: return; Chris@0: } Chris@0: return $this->data['lastBuildDate']; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Get the feed description Chris@0: * Chris@0: * @return string|null Chris@0: */ Chris@0: public function getDescription() Chris@0: { Chris@12: if (! array_key_exists('description', $this->data)) { Chris@0: return; Chris@0: } Chris@0: return $this->data['description']; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Get the feed generator entry Chris@0: * Chris@0: * @return string|null Chris@0: */ Chris@0: public function getGenerator() Chris@0: { Chris@12: if (! array_key_exists('generator', $this->data)) { Chris@0: return; Chris@0: } Chris@0: return $this->data['generator']; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Get the feed ID Chris@0: * Chris@0: * @return string|null Chris@0: */ Chris@0: public function getId() Chris@0: { Chris@12: if (! array_key_exists('id', $this->data)) { Chris@0: return; Chris@0: } Chris@0: return $this->data['id']; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Get the feed image URI Chris@0: * Chris@0: * @return array Chris@0: */ Chris@0: public function getImage() Chris@0: { Chris@12: if (! array_key_exists('image', $this->data)) { Chris@0: return; Chris@0: } Chris@0: return $this->data['image']; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Get the feed language Chris@0: * Chris@0: * @return string|null Chris@0: */ Chris@0: public function getLanguage() Chris@0: { Chris@12: if (! array_key_exists('language', $this->data)) { Chris@0: return; Chris@0: } Chris@0: return $this->data['language']; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Get a link to the HTML source Chris@0: * Chris@0: * @return string|null Chris@0: */ Chris@0: public function getLink() Chris@0: { Chris@12: if (! array_key_exists('link', $this->data)) { Chris@0: return; Chris@0: } Chris@0: return $this->data['link']; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Get a link to the XML feed Chris@0: * Chris@0: * @return string|null Chris@0: */ Chris@0: public function getFeedLinks() Chris@0: { Chris@12: if (! array_key_exists('feedLinks', $this->data)) { Chris@0: return; Chris@0: } Chris@0: return $this->data['feedLinks']; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Get the feed title Chris@0: * Chris@0: * @return string|null Chris@0: */ Chris@0: public function getTitle() Chris@0: { Chris@12: if (! array_key_exists('title', $this->data)) { Chris@0: return; Chris@0: } Chris@0: return $this->data['title']; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Get the feed character encoding Chris@0: * Chris@0: * @return string|null Chris@0: */ Chris@0: public function getEncoding() Chris@0: { Chris@12: if (! array_key_exists('encoding', $this->data)) { Chris@0: return 'UTF-8'; Chris@0: } Chris@0: return $this->data['encoding']; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Get the feed's base url Chris@0: * Chris@0: * @return string|null Chris@0: */ Chris@0: public function getBaseUrl() Chris@0: { Chris@12: if (! array_key_exists('baseUrl', $this->data)) { Chris@0: return; Chris@0: } Chris@0: return $this->data['baseUrl']; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Get the URLs used as Pubsubhubbub hubs endpoints Chris@0: * Chris@0: * @return string|null Chris@0: */ Chris@0: public function getHubs() Chris@0: { Chris@12: if (! array_key_exists('hubs', $this->data)) { Chris@0: return; Chris@0: } Chris@0: return $this->data['hubs']; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Get the feed categories Chris@0: * Chris@0: * @return string|null Chris@0: */ Chris@0: public function getCategories() Chris@0: { Chris@12: if (! array_key_exists('categories', $this->data)) { Chris@0: return; Chris@0: } Chris@0: return $this->data['categories']; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Resets the instance and deletes all data Chris@0: * Chris@0: * @return void Chris@0: */ Chris@0: public function reset() Chris@0: { Chris@0: $this->data = []; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Set the current feed type being exported to "rss" or "atom". This allows Chris@0: * other objects to gracefully choose whether to execute or not, depending Chris@0: * on their appropriateness for the current type, e.g. renderers. Chris@0: * Chris@0: * @param string $type Chris@0: * @return AbstractFeed Chris@0: */ Chris@0: public function setType($type) Chris@0: { Chris@0: $this->type = $type; Chris@0: return $this; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Retrieve the current or last feed type exported. Chris@0: * Chris@0: * @return string Value will be "rss" or "atom" Chris@0: */ Chris@0: public function getType() Chris@0: { Chris@0: return $this->type; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Unset a specific data point Chris@0: * Chris@0: * @param string $name Chris@0: * @return AbstractFeed Chris@0: */ Chris@0: public function remove($name) Chris@0: { Chris@0: if (isset($this->data[$name])) { Chris@0: unset($this->data[$name]); Chris@0: } Chris@0: return $this; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Method overloading: call given method on first extension implementing it Chris@0: * Chris@0: * @param string $method Chris@0: * @param array $args Chris@0: * @return mixed Chris@0: * @throws Exception\BadMethodCallException if no extensions implements the method Chris@0: */ Chris@0: public function __call($method, $args) Chris@0: { Chris@0: foreach ($this->extensions as $extension) { Chris@0: try { Chris@0: return call_user_func_array([$extension, $method], $args); Chris@0: } catch (Exception\BadMethodCallException $e) { Chris@0: } Chris@0: } Chris@0: throw new Exception\BadMethodCallException( Chris@0: 'Method: ' . $method . ' does not exist and could not be located on a registered Extension' Chris@0: ); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Load extensions from Zend\Feed\Writer\Writer Chris@0: * Chris@0: * @throws Exception\RuntimeException Chris@0: * @return void Chris@0: */ Chris@12: // @codingStandardsIgnoreStart Chris@0: protected function _loadExtensions() Chris@0: { Chris@12: // @codingStandardsIgnoreEnd Chris@0: $all = Writer::getExtensions(); Chris@0: $manager = Writer::getExtensionManager(); Chris@0: $exts = $all['feed']; Chris@0: foreach ($exts as $ext) { Chris@12: if (! $manager->has($ext)) { Chris@12: throw new Exception\RuntimeException( Chris@12: sprintf('Unable to load extension "%s"; could not resolve to class', $ext) Chris@12: ); Chris@0: } Chris@0: $this->extensions[$ext] = $manager->get($ext); Chris@0: $this->extensions[$ext]->setEncoding($this->getEncoding()); Chris@0: } Chris@0: } Chris@0: }