Просмотр исходного кода

Added support for Atom 1.0 icons to Zend_Feed_Reader/Writer

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@23090 44c647ce-9c0f-0410-b52a-842ac1e357ba
padraic 15 лет назад
Родитель
Сommit
fc405c07d7

+ 24 - 0
library/Zend/Feed/Reader/Extension/Atom/Feed.php

@@ -315,6 +315,30 @@ class Zend_Feed_Reader_Extension_Atom_Feed
 
         return $this->_data['image'];
     }
+    
+    /**
+     * Get the feed image
+     *
+     * @return array|null
+     */
+    public function getIcon()
+    {
+        if (array_key_exists('icon', $this->_data)) {
+            return $this->_data['icon'];
+        }
+
+        $imageUrl = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/atom:icon)');
+
+        if (!$imageUrl) {
+            $image = null;
+        } else {
+            $image = array('uri'=>$imageUrl);
+        }
+
+        $this->_data['icon'] = $image;
+
+        return $this->_data['icon'];
+    }
 
     /**
      * Get the base URI of the feed (if set).

+ 31 - 0
library/Zend/Feed/Writer/Feed/FeedAbstract.php

@@ -361,6 +361,24 @@ class Zend_Feed_Writer_Feed_FeedAbstract
         }
         $this->_data['image'] = $data;  
     }
+    
+    /**
+     * Set a feed icon (URI at minimum). Parameter is a single array with the
+     * required key 'uri'. Only 'uri' is required and used for Atom rendering.
+     * RSS does not support an Icon tag except via Atom 1.0 as an extension.
+     *
+     * @param array $data
+     */
+    public function setIcon(array $data)
+    {
+        if (empty($data['uri']) || !is_string($data['uri'])
+        || !Zend_Uri::check($data['uri'])) {
+            require_once 'Zend/Feed/Exception.php';
+            throw new Zend_Feed_Exception('Invalid parameter: parameter \'uri\''
+            . ' must be a non-empty string and valid URI/IRI');
+        }
+        $this->_data['icon'] = $data;  
+    }
 
     /**
      * Set the feed language
@@ -653,6 +671,19 @@ class Zend_Feed_Writer_Feed_FeedAbstract
         }
         return $this->_data['image'];
     }
+    
+    /**
+     * Get the feed icon URI
+     *
+     * @return array
+     */
+    public function getIcon()
+    {
+        if (!array_key_exists('icon', $this->_data)) {
+            return null;
+        }
+        return $this->_data['icon'];
+    }
 
     /**
      * Get the feed language

+ 1 - 0
library/Zend/Feed/Writer/Renderer/Feed/Atom.php

@@ -82,6 +82,7 @@ class Zend_Feed_Writer_Renderer_Feed_Atom
         $this->_setTitle($this->_dom, $root);
         $this->_setDescription($this->_dom, $root);
         $this->_setImage($this->_dom, $root);
+        $this->_setIcon($this->_dom, $root);
         $this->_setDateCreated($this->_dom, $root);
         $this->_setDateModified($this->_dom, $root);
         $this->_setGenerator($this->_dom, $root);

+ 19 - 0
library/Zend/Feed/Writer/Renderer/Feed/Atom/AtomAbstract.php

@@ -342,6 +342,25 @@ class Zend_Feed_Writer_Renderer_Feed_Atom_AtomAbstract
     }
     
     /**
+     * Set feed level icon (image)
+     * 
+     * @param DOMDocument $dom 
+     * @param DOMElement $root 
+     * @return void
+     */
+    protected function _setIcon(DOMDocument $dom, DOMElement $root)
+    {
+        $image = $this->getDataContainer()->getIcon();
+        if (!$image) {
+            return;
+        }
+        $img = $dom->createElement('icon');
+        $root->appendChild($img);
+        $text = $dom->createTextNode($image['uri']);
+        $img->appendChild($text);
+    }
+    
+    /**
      * Set date feed was created 
      * 
      * @param  DOMDocument $dom 

+ 38 - 0
tests/Zend/Feed/Reader/Feed/AtomTest.php

@@ -549,4 +549,42 @@ class Zend_Feed_Reader_Feed_AtomTest extends PHPUnit_Framework_TestCase
         );
         $this->assertEquals(null, $feed->getImage());
     }
+    
+    /**
+     * Get Icon (Unencoded Text)
+     */
+    public function testGetsIconFromAtom03()
+    {
+        $feed = Zend_Feed_Reader::importString(
+            file_get_contents($this->_feedSamplePath.'/icon/plain/atom03.xml')
+        );
+        $this->assertEquals(array('uri'=>'http://www.example.com/logo.gif'), $feed->getIcon());
+    }
+
+    public function testGetsIconFromAtom10()
+    {
+        $feed = Zend_Feed_Reader::importString(
+            file_get_contents($this->_feedSamplePath.'/icon/plain/atom10.xml')
+        );
+        $this->assertEquals(array('uri'=>'http://www.example.com/logo.gif'), $feed->getIcon());
+    }
+
+    /**
+     * Get Icon (Unencoded Text) When Missing
+     */
+    public function testGetsIconFromAtom03_None()
+    {
+        $feed = Zend_Feed_Reader::importString(
+            file_get_contents($this->_feedSamplePath.'/icon/plain/none/atom03.xml')
+        );
+        $this->assertEquals(null, $feed->getIcon());
+    }
+
+    public function testGetsIconFromAtom10_None()
+    {
+        $feed = Zend_Feed_Reader::importString(
+            file_get_contents($this->_feedSamplePath.'/icon/plain/none/atom10.xml')
+        );
+        $this->assertEquals(null, $feed->getIcon());
+    }
 }

+ 4 - 0
tests/Zend/Feed/Reader/Feed/_files/Atom/icon/plain/atom03.xml

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<feed version="0.3" xmlns="http://purl.org/atom/ns#">
+    <icon>http://www.example.com/logo.gif</icon>
+</feed>

+ 4 - 0
tests/Zend/Feed/Reader/Feed/_files/Atom/icon/plain/atom10.xml

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<feed xmlns="http://www.w3.org/2005/Atom">
+    <icon>http://www.example.com/logo.gif</icon>
+</feed>

+ 3 - 0
tests/Zend/Feed/Reader/Feed/_files/Atom/icon/plain/none/atom03.xml

@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<feed version="0.3" xmlns="http://purl.org/atom/ns#">
+</feed>

+ 3 - 0
tests/Zend/Feed/Reader/Feed/_files/Atom/icon/plain/none/atom10.xml

@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="utf-8"?>
+<feed xmlns="http://www.w3.org/2005/Atom">
+</feed>

+ 44 - 0
tests/Zend/Feed/Writer/FeedTest.php

@@ -848,6 +848,50 @@ class Zend_Feed_Writer_FeedTest extends PHPUnit_Framework_TestCase
             'description' => 'Image description'
         ), $writer->getImage());
     }
+    
+    // Icon Tests
+
+    public function testSetsIconUri()
+    {
+        $writer = new Zend_Feed_Writer_Feed;
+        $writer->setIcon(array(
+            'uri' => 'http://www.example.com/logo.gif'
+        ));
+        $this->assertEquals(array(
+            'uri' => 'http://www.example.com/logo.gif'
+        ), $writer->getIcon());
+    }
+
+    /**
+     * @expectedException Zend_Feed_Exception
+     */
+    public function testSetsIconUriThrowsExceptionOnEmptyUri()
+    {
+        $writer = new Zend_Feed_Writer_Feed;
+        $writer->setIcon(array(
+            'uri' => ''
+        ));
+    }
+
+    /**
+     * @expectedException Zend_Feed_Exception
+     */
+    public function testSetsIconUriThrowsExceptionOnMissingUri()
+    {
+        $writer = new Zend_Feed_Writer_Feed;
+        $writer->setIcon(array());
+    }
+
+    /**
+     * @expectedException Zend_Feed_Exception
+     */
+    public function testSetsIconUriThrowsExceptionOnInvalidUri()
+    {
+        $writer = new Zend_Feed_Writer_Feed;
+        $writer->setIcon(array(
+            'uri' => 'http://'
+        ));
+    }
 
     public function testGetCategoriesReturnsNullIfNotSet()
     {

+ 14 - 0
tests/Zend/Feed/Writer/Renderer/Feed/AtomTest.php

@@ -416,5 +416,19 @@ class Zend_Feed_Writer_Renderer_Feed_AtomTest extends PHPUnit_Framework_TestCase
         );
         $this->assertEquals($expected, $feed->getImage());
     }
+    
+    public function testIconCanBeSet()
+    {
+        $this->_validWriter->setIcon(
+            array('uri'=>'http://www.example.com/logo.gif')
+        );
+        $atomFeed = new Zend_Feed_Writer_Renderer_Feed_Atom($this->_validWriter);
+        $atomFeed->render();
+        $feed = Zend_Feed_Reader::importString($atomFeed->saveXml());
+        $expected = array(
+            'uri' => 'http://www.example.com/logo.gif'
+        );
+        $this->assertEquals($expected, $feed->getIcon());
+    }
 
 }