From Tinct Goat, 9 Years ago, written in Plain Text.
This paste is a reply to Untitled from Cobalt Hummingbird - view diff
Embed
  1. <?php
  2. /**
  3.  * Zend Framework (http://framework.zend.com/)
  4.  *
  5.  * @link      http://github.com/zendframework/zf2 for the canonical source repository
  6.  * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
  7.  * @license   http://framework.zend.com/license/new-bsd New BSD License
  8.  */
  9.  
  10. namespace Zend\View\Renderer;
  11.  
  12. use Zend\View\Exception;
  13. use Zend\View\Model\FeedModel;
  14. use Zend\View\Model\ModelInterface as Model;
  15. use Zend\View\Resolver\ResolverInterface as Resolver;
  16.  
  17. /**
  18.  * Class for Zend\View\Strategy\FeedStrategy compatible template engine implementations
  19.  */
  20. class FeedRenderer implements RendererInterface
  21. {
  22.     /**
  23.      * @var Resolver
  24.      */
  25.     protected $resolver;
  26.  
  27.     /**
  28.      * @var string 'rss' or 'atom'; defaults to 'rss'
  29.      */
  30.     protected $feedType = 'rss';
  31.  
  32.     /**
  33.      * Return the template engine object, if any
  34.      *
  35.      * If using a third-party template engine, such as Smarty, patTemplate,
  36.      * phplib, etc, return the template engine object. Useful for calling
  37.      * methods on these objects, such as for setting filters, modifiers, etc.
  38.      *
  39.      * @return mixed
  40.      */
  41.     public function getEngine()
  42.     {
  43.         return $this;
  44.     }
  45.  
  46.     /**
  47.      * Set the resolver used to map a template name to a resource the renderer may consume.
  48.      *
  49.      * @todo   Determine use case for resolvers for feeds
  50.      * @param  Resolver $resolver
  51.      * @return FeedRenderer
  52.      */
  53.     public function setResolver(Resolver $resolver)
  54.     {
  55.         $this->resolver = $resolver;
  56.         return $this;
  57.     }
  58.  
  59.     /**
  60.      * Renders values as JSON
  61.      *
  62.      * @todo   Determine what use case exists for accepting only $nameOrModel
  63.      * @param  string|Model $nameOrModel The script/resource process, or a view model
  64.      * @param  null|array|\ArrayAccess $values Values to use during rendering
  65.      * @throws Exception\InvalidArgumentException
  66.      * @return string The script output.
  67.      */
  68.     public function render($nameOrModel, $values = null)
  69.     {
  70.         if ($nameOrModel instanceof Model) {
  71.             // Use case 1: View Model provided
  72.             // Non-FeedModel: cast to FeedModel
  73.             if (!$nameOrModel instanceof FeedModel) {
  74.                 $vars    = $nameOrModel->getVariables();
  75.                 $options = $nameOrModel->getOptions();
  76.                 $type    = $this->getFeedType();
  77.                 if (isset($options['feed_type'])) {
  78.                     $type = $options['feed_type'];
  79.                 } else {
  80.                     $this->setFeedType($type);
  81.                 }
  82.                 $nameOrModel = new FeedModel($vars, array('feed_type' => $type));
  83.             }
  84.         } elseif (is_string($nameOrModel)) {
  85.             // Use case 2: string $nameOrModel + array|Traversable|Feed $values
  86.             $nameOrModel = new FeedModel($values, (array) $nameOrModel);
  87.         } else {
  88.             // Use case 3: failure
  89.             throw new Exception\InvalidArgumentException(sprintf(
  90.                 '%s expects a ViewModel or a string feed type as the first argument; received "%s"',
  91.                 __METHOD__,
  92.                 (is_object($nameOrModel) ? get_class($nameOrModel) : gettype($nameOrModel))
  93.             ));
  94.         }
  95.  
  96.         // Get feed and type
  97.         $feed = $nameOrModel->getFeed();
  98.         $type = $nameOrModel->getFeedType();
  99.         if (!$type) {
  100.             $type = $this->getFeedType();
  101.         } else {
  102.             $this->setFeedType($type);
  103.         }
  104.  
  105.         // Render feed
  106.         return $feed->export($type);
  107.     }
  108.  
  109.     /**
  110.      * Set feed type ('rss' or 'atom')
  111.      *
  112.      * @param  string $feedType
  113.      * @throws Exception\InvalidArgumentException
  114.      * @return FeedRenderer
  115.      */
  116.     public function setFeedType($feedType)
  117.     {
  118.         $feedType = strtolower($feedType);
  119.         if (!in_array($feedType, array('rss', 'atom'))) {
  120.             throw new Exception\InvalidArgumentException(sprintf(
  121.                 '%s expects a string of either "rss" or "atom"',
  122.                 __METHOD__
  123.             ));
  124.         }
  125.  
  126.         $this->feedType = $feedType;
  127.         return $this;
  128.     }
  129.  
  130.     /**
  131.      * Get feed type
  132.      *
  133.      * @return string
  134.      */
  135.     public function getFeedType()
  136.     {
  137.         return $this->feedType;
  138.     }
  139. }
  140.