Procházet zdrojové kódy

Adding enclosures now treats type and length parameters as optional for Atom, but throws exceptions for RSS (reflecting specs). Fixes ZF-8892

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@22064 44c647ce-9c0f-0410-b52a-842ac1e357ba
padraic před 15 roky
rodič
revize
7ef8ab55f5

+ 4 - 14
library/Zend/Feed/Writer/Entry.php

@@ -592,20 +592,15 @@ class Zend_Feed_Writer_Entry
     }
     
     /**
-     * Adds an enclosure to the entry.
+     * Adds an enclosure to the entry. The array parameter may contain the
+     * keys 'uri', 'type' and 'length'. Only 'uri' is required for Atom, though the
+     * others must also be provided or RSS rendering (where they are required)
+     * will throw an Exception.
      *
      * @param array $enclosures
      */
     public function setEnclosure(array $enclosure)
     {
-        if (!isset($enclosure['type'])) {
-            require_once 'Zend/Feed/Exception.php';
-            throw new Zend_Feed_Exception('Enclosure "type" is not set');
-        }
-        if (!isset($enclosure['length'])) {
-            require_once 'Zend/Feed/Exception.php';
-            throw new Zend_Feed_Exception('Enclosure "length" is not set');
-        }
         if (!isset($enclosure['uri'])) {
             require_once 'Zend/Feed/Exception.php';
             throw new Zend_Feed_Exception('Enclosure "uri" is not set');
@@ -614,11 +609,6 @@ class Zend_Feed_Writer_Entry
             require_once 'Zend/Feed/Exception.php';
             throw new Zend_Feed_Exception('Enclosure "uri" is not a valid URI/IRI');
         }
-        if ((int) $enclosure['length'] <= 0) {
-            require_once 'Zend/Feed/Exception.php';
-            throw new Zend_Feed_Exception('Enclosure "length" must be an integer'
-            . ' indicating the content\'s length in bytes');
-        }
         $this->_data['enclosure'] = $enclosure;
     }
     

+ 6 - 2
library/Zend/Feed/Writer/Renderer/Entry/Atom.php

@@ -234,8 +234,12 @@ class Zend_Feed_Writer_Renderer_Entry_Atom
         }
         $enclosure = $this->_dom->createElement('link');
         $enclosure->setAttribute('rel', 'enclosure');
-        $enclosure->setAttribute('type', $data['type']);
-        $enclosure->setAttribute('length', $data['length']);
+        if (isset($data['type'])) {
+            $enclosure->setAttribute('type', $data['type']);
+        }
+        if (isset($data['length'])) {
+            $enclosure->setAttribute('length', $data['length']);
+        }
         $enclosure->setAttribute('href', $data['uri']);
         $root->appendChild($enclosure);
     }

+ 31 - 0
library/Zend/Feed/Writer/Renderer/Entry/Rss.php

@@ -218,6 +218,37 @@ class Zend_Feed_Writer_Renderer_Entry_Rss
         if ((!$data || empty($data))) {
             return;
         }
+        if (!isset($data['type'])) {
+            require_once 'Zend/Feed/Exception.php';
+            $exception = new Zend_Feed_Exception('Enclosure "type" is not set');
+            if (!$this->_ignoreExceptions) {
+                throw $exception;
+            } else {
+                $this->_exceptions[] = $exception;
+                return;
+            }
+        }
+        if (!isset($data['length'])) {
+            require_once 'Zend/Feed/Exception.php';
+            $exception = new Zend_Feed_Exception('Enclosure "length" is not set');
+            if (!$this->_ignoreExceptions) {
+                throw $exception;
+            } else {
+                $this->_exceptions[] = $exception;
+                return;
+            }
+        }
+        if (isset($data['length']) && (int) $data['length'] <= 0) {
+            require_once 'Zend/Feed/Exception.php';
+            $exception = new Zend_Feed_Exception('Enclosure "length" must be an integer'
+            . ' indicating the content\'s length in bytes');
+            if (!$this->_ignoreExceptions) {
+                throw $exception;
+            } else {
+                $this->_exceptions[] = $exception;
+                return;
+            }
+        }
         $enclosure = $this->_dom->createElement('enclosure');
         $enclosure->setAttribute('type', $data['type']);
         $enclosure->setAttribute('length', $data['length']);

+ 0 - 50
tests/Zend/Feed/Writer/EntryTest.php

@@ -188,18 +188,6 @@ class Zend_Feed_Writer_EntryTest extends PHPUnit_Framework_TestCase
     /**
      * @expectedException Zend_Feed_Exception
      */
-    public function testAddsEnclosureThrowsExceptionOnMissingType()
-    {
-        $entry = new Zend_Feed_Writer_Entry;
-        $entry->setEnclosure(array(
-            'uri' => 'http://example.com/audio.mp3',
-            'length' => '1337'
-        ));
-    }
-    
-    /**
-     * @expectedException Zend_Feed_Exception
-     */
     public function testAddsEnclosureThrowsExceptionOnMissingUri()
     {
         $entry = new Zend_Feed_Writer_Entry;
@@ -212,44 +200,6 @@ class Zend_Feed_Writer_EntryTest extends PHPUnit_Framework_TestCase
     /**
      * @expectedException Zend_Feed_Exception
      */
-    public function testAddsEnclosureThrowsExceptionOnMissingLength()
-    {
-        $entry = new Zend_Feed_Writer_Entry;
-        $entry->setEnclosure(array(
-            'type' => 'audio/mpeg',
-            'uri' => 'http://example.com/audio.mp3'
-        ));
-    }
-    
-    /**
-     * @expectedException Zend_Feed_Exception
-     */
-    public function testAddsEnclosureThrowsExceptionOnNonNumericLength()
-    {
-        $entry = new Zend_Feed_Writer_Entry;
-        $entry->setEnclosure(array(
-            'type' => 'audio/mpeg',
-            'uri' => 'http://example.com/audio.mp3',
-            'length' => 'abc'
-        ));
-    }
-    
-    /**
-     * @expectedException Zend_Feed_Exception
-     */
-    public function testAddsEnclosureThrowsExceptionOnNegativeLength()
-    {
-        $entry = new Zend_Feed_Writer_Entry;
-        $entry->setEnclosure(array(
-            'type' => 'audio/mpeg',
-            'uri' => 'http://example.com/audio.mp3',
-            'length' => -23
-        ));
-    }
-    
-    /**
-     * @expectedException Zend_Feed_Exception
-     */
     public function testAddsEnclosureThrowsExceptionWhenUriIsInvalid()
     {
         $entry = new Zend_Feed_Writer_Entry;

+ 54 - 0
tests/Zend/Feed/Writer/Renderer/Entry/RssTest.php

@@ -226,6 +226,60 @@ class Zend_Feed_Writer_Renderer_Entry_RssTest extends PHPUnit_Framework_TestCase
         $this->assertEquals('http://example.com/audio.mp3', $enc->url);
     }
 
+    /**
+     * @expectedException Zend_Feed_Exception
+     */
+    public function testAddsEnclosureThrowsExceptionOnMissingType()
+    {
+        $renderer = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter);
+        $this->_validEntry->setEnclosure(array(
+            'uri' => 'http://example.com/audio.mp3',
+            'length' => '1337'
+        ));
+        $renderer->render();
+    }
+
+    /**
+     * @expectedException Zend_Feed_Exception
+     */
+    public function testAddsEnclosureThrowsExceptionOnMissingLength()
+    {
+        $renderer = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter);
+        $this->_validEntry->setEnclosure(array(
+            'type' => 'audio/mpeg',
+            'uri' => 'http://example.com/audio.mp3'
+        ));
+        $renderer->render();
+    }
+    
+    /**
+     * @expectedException Zend_Feed_Exception
+     */
+    public function testAddsEnclosureThrowsExceptionOnNonNumericLength()
+    {
+        $renderer = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter);
+        $this->_validEntry->setEnclosure(array(
+            'type' => 'audio/mpeg',
+            'uri' => 'http://example.com/audio.mp3',
+            'length' => 'abc'
+        ));
+        $renderer->render();
+    }
+    
+    /**
+     * @expectedException Zend_Feed_Exception
+     */
+    public function testAddsEnclosureThrowsExceptionOnNegativeLength()
+    {
+        $renderer = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter);
+        $this->_validEntry->setEnclosure(array(
+            'type' => 'audio/mpeg',
+            'uri' => 'http://example.com/audio.mp3',
+            'length' => -23
+        ));
+        $renderer->render();
+    }
+
     public function testEntryIdHasBeenSet()
     {
         $this->_validEntry->setId('urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6');