diff options
Diffstat (limited to '3rdparty/ZendFeed/Writer/FeedFactory.php')
-rw-r--r-- | 3rdparty/ZendFeed/Writer/FeedFactory.php | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/3rdparty/ZendFeed/Writer/FeedFactory.php b/3rdparty/ZendFeed/Writer/FeedFactory.php new file mode 100644 index 000000000..15e7a3468 --- /dev/null +++ b/3rdparty/ZendFeed/Writer/FeedFactory.php @@ -0,0 +1,127 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2014 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Feed\Writer; + +use Traversable; + +abstract class FeedFactory +{ + /** + * Create and return a Feed based on data provided. + * + * @param array|Traversable $data + * @throws Exception\InvalidArgumentException + * @return Feed + */ + public static function factory($data) + { + if (!is_array($data) && !$data instanceof Traversable) { + throw new Exception\InvalidArgumentException(sprintf( + '%s expects an array or Traversable argument; received "%s"', + __METHOD__, + (is_object($data) ? get_class($data) : gettype($data)) + )); + } + + $feed = new Feed(); + + foreach ($data as $key => $value) { + // Setters + $key = static::convertKey($key); + $method = 'set' . $key; + if (method_exists($feed, $method)) { + switch ($method) { + case 'setfeedlink': + if (!is_array($value)) { + // Need an array + break; + } + if (!array_key_exists('link', $value) || !array_key_exists('type', $value)) { + // Need both keys to set this correctly + break; + } + $feed->setFeedLink($value['link'], $value['type']); + break; + default: + $feed->$method($value); + break; + } + continue; + } + + // Entries + if ('entries' == $key) { + static::createEntries($value, $feed); + continue; + } + } + + return $feed; + } + + /** + * Normalize a key + * + * @param string $key + * @return string + */ + protected static function convertKey($key) + { + $key = str_replace('_', '', strtolower($key)); + return $key; + } + + /** + * Create and attach entries to a feed + * + * @param array|Traversable $entries + * @param Feed $feed + * @throws Exception\InvalidArgumentException + * @return void + */ + protected static function createEntries($entries, Feed $feed) + { + if (!is_array($entries) && !$entries instanceof Traversable) { + throw new Exception\InvalidArgumentException(sprintf( + '%s::factory expects the "entries" value to be an array or Traversable; received "%s"', + get_called_class(), + (is_object($entries) ? get_class($entries) : gettype($entries)) + )); + } + + foreach ($entries as $data) { + if (!is_array($data) && !$data instanceof Traversable && !$data instanceof Entry) { + throw new Exception\InvalidArgumentException(sprintf( + '%s expects an array, Traversable, or Zend\Feed\Writer\Entry argument; received "%s"', + __METHOD__, + (is_object($data) ? get_class($data) : gettype($data)) + )); + } + + // Use case 1: Entry item + if ($data instanceof Entry) { + $feed->addEntry($data); + continue; + } + + // Use case 2: iterate item and populate entry + $entry = $feed->createEntry(); + foreach ($data as $key => $value) { + $key = static::convertKey($key); + $method = 'set' . $key; + if (!method_exists($entry, $method)) { + continue; + } + $entry->$method($value); + } + $feed->addEntry($entry); + } + } +} |