Sfoglia il codice sorgente

Added support for extracting category data from all RSS and RDF feeds.
The method getCategories() returns an object of type ArrayObject with three fields per result: term, scheme and label.
This actually reflect the Atom 1.0 terminology, so RSS maps the "domain" attr to "scheme", and its nodeValue (the category name) to both "term" and "label" - this will allow both RSS and Atom to support the exact same output result setup via the new Zend_Feed_Reader_Container_* classes.
The Container classes are a common method of presenting attribute bundles - in addition to being an ArrayObject, it implements a getValues() method for simple access to the CORE values, i.e. for categories, their name or "label" in Atom parlance.


git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@19151 44c647ce-9c0f-0410-b52a-842ac1e357ba

padraic 16 anni fa
parent
commit
bdbf83b747
20 ha cambiato i file con 289 aggiunte e 59 eliminazioni
  1. 3 3
      library/Zend/Feed/Reader/Entry/Rss.php
  2. 35 0
      library/Zend/Feed/Reader/Extension/DublinCore/Entry.php
  3. 140 1
      tests/Zend/Feed/Reader/Entry/RssTest.php
  4. 3 3
      tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc10/rss090.xml
  5. 9 0
      tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc10/rss091.xml
  6. 9 0
      tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc10/rss092.xml
  7. 9 0
      tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc10/rss093.xml
  8. 9 0
      tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc10/rss094.xml
  9. 12 0
      tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc10/rss10.xml
  10. 12 0
      tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc11/rss090.xml
  11. 9 0
      tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc11/rss091.xml
  12. 9 0
      tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc11/rss092.xml
  13. 9 0
      tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc11/rss093.xml
  14. 9 0
      tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc11/rss094.xml
  15. 12 0
      tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc11/rss10.xml
  16. 0 10
      tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/rss091.xml
  17. 0 10
      tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/rss092.xml
  18. 0 10
      tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/rss093.xml
  19. 0 10
      tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/rss094.xml
  20. 0 12
      tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/rss10.xml

+ 3 - 3
library/Zend/Feed/Reader/Entry/Rss.php

@@ -479,9 +479,7 @@ class Zend_Feed_Reader_Entry_Rss extends Zend_Feed_Reader_EntryAbstract implemen
             $list = $this->_xpath->query($this->_xpathQueryRdf.'//rss:category');
         }
 
-        if (!$list->length) {
-            $categoryCollection = new Zend_Feed_Reader_Collection_Category;
-        } else {
+        if ($list->length) {
             $categoryCollection = new Zend_Feed_Reader_Collection_Category;
             foreach ($list as $category) {
                 $categoryCollection[] = array(
@@ -490,6 +488,8 @@ class Zend_Feed_Reader_Entry_Rss extends Zend_Feed_Reader_EntryAbstract implemen
                     'label' => $category->nodeValue,
                 );
             }
+        } else {
+            $categoryCollection = $this->getExtension('DublinCore')->getCategories();
         }
 
         $this->_data['categories'] = $categoryCollection;

+ 35 - 0
library/Zend/Feed/Reader/Extension/DublinCore/Entry.php

@@ -103,6 +103,41 @@ class Zend_Feed_Reader_Extension_DublinCore_Entry
 
         return $this->_data['authors'];
     }
+    
+    /**
+     * Get categories (subjects under DC)
+     *
+     * @return Zend_Feed_Reader_Collection_Category
+     */
+    public function getCategories()
+    {
+        if (array_key_exists('categories', $this->_data)) {
+            return $this->_data['categories'];
+        }
+        
+        $list = $this->_xpath->evaluate($this->getXpathPrefix() . '//dc11:subject');
+
+        if (!$list->length) {
+            $list = $this->_xpath->evaluate($this->getXpathPrefix() . '//dc10:subject');
+        }
+        
+        if ($list->length) {
+            $categoryCollection = new Zend_Feed_Reader_Collection_Category;
+            foreach ($list as $category) {
+                $categoryCollection[] = array(
+                    'term' => $category->nodeValue,
+                    'scheme' => null,
+                    'label' => $category->nodeValue,
+                );
+            }
+        } else {
+            $categoryCollection = new Zend_Feed_Reader_Collection_Category;
+        }
+        
+        $this->_data['categories'] = $categoryCollection;
+        return $this->_data['categories'];  
+    }
+    
 
     /**
      * Get the entry content

+ 140 - 1
tests/Zend/Feed/Reader/Entry/RssTest.php

@@ -38,6 +38,7 @@ class Zend_Feed_Reader_Entry_RssTest extends PHPUnit_Framework_TestCase
     protected $_feedSamplePath = null;
     
     protected $_expectedCats = array();
+    protected $_expectedCatsRdf = array();
 
     public function setup()
     {
@@ -70,6 +71,18 @@ class Zend_Feed_Reader_Entry_RssTest extends PHPUnit_Framework_TestCase
                 'label' => 'topic2'
             )
         );
+        $this->_expectedCatsRdf = array(
+            array(
+                'term' => 'topic1',
+                'scheme' => null,
+                'label' => 'topic1'
+            ),
+            array(
+                'term' => 'topic2',
+                'scheme' => null,
+                'label' => 'topic2'
+            )
+        );
     }
     
     public function teardown()
@@ -2698,8 +2711,10 @@ class Zend_Feed_Reader_Entry_RssTest extends PHPUnit_Framework_TestCase
     
     /**
      * Get category data
-     * @group ZFR001
      */
+    
+    // RSS 2.0
+    
     public function testGetsCategoriesFromRss20()
     {
         $feed = Zend_Feed_Reader::importString(
@@ -2709,4 +2724,128 @@ class Zend_Feed_Reader_Entry_RssTest extends PHPUnit_Framework_TestCase
         $this->assertEquals($this->_expectedCats, (array) $entry->getCategories());
         $this->assertEquals(array('topic1','topic2'), array_values($entry->getCategories()->getValues()));
     }
+    
+    // DC 1.0
+    
+    public function testGetsCategoriesFromRss090_Dc10()
+    {
+        $feed = Zend_Feed_Reader::importString(
+            file_get_contents($this->_feedSamplePath.'/category/plain/dc10/rss090.xml')
+        );
+        $entry = $feed->current();
+        $this->assertEquals($this->_expectedCatsRdf, (array) $entry->getCategories());
+        $this->assertEquals(array('topic1','topic2'), array_values($entry->getCategories()->getValues()));
+    }
+    
+    public function testGetsCategoriesFromRss091_Dc10()
+    {
+        $feed = Zend_Feed_Reader::importString(
+            file_get_contents($this->_feedSamplePath.'/category/plain/dc10/rss091.xml')
+        );
+        $entry = $feed->current();
+        $this->assertEquals($this->_expectedCatsRdf, (array) $entry->getCategories());
+        $this->assertEquals(array('topic1','topic2'), array_values($entry->getCategories()->getValues()));
+    }
+    
+    public function testGetsCategoriesFromRss092_Dc10()
+    {
+        $feed = Zend_Feed_Reader::importString(
+            file_get_contents($this->_feedSamplePath.'/category/plain/dc10/rss092.xml')
+        );
+        $entry = $feed->current();
+        $this->assertEquals($this->_expectedCatsRdf, (array) $entry->getCategories());
+        $this->assertEquals(array('topic1','topic2'), array_values($entry->getCategories()->getValues()));
+    }
+    
+    public function testGetsCategoriesFromRss093_Dc10()
+    {
+        $feed = Zend_Feed_Reader::importString(
+            file_get_contents($this->_feedSamplePath.'/category/plain/dc10/rss093.xml')
+        );
+        $entry = $feed->current();
+        $this->assertEquals($this->_expectedCatsRdf, (array) $entry->getCategories());
+        $this->assertEquals(array('topic1','topic2'), array_values($entry->getCategories()->getValues()));
+    }
+    
+    public function testGetsCategoriesFromRss094_Dc10()
+    {
+        $feed = Zend_Feed_Reader::importString(
+            file_get_contents($this->_feedSamplePath.'/category/plain/dc10/rss094.xml')
+        );
+        $entry = $feed->current();
+        $this->assertEquals($this->_expectedCatsRdf, (array) $entry->getCategories());
+        $this->assertEquals(array('topic1','topic2'), array_values($entry->getCategories()->getValues()));
+    }
+    
+    public function testGetsCategoriesFromRss10_Dc10()
+    {
+        $feed = Zend_Feed_Reader::importString(
+            file_get_contents($this->_feedSamplePath.'/category/plain/dc10/rss10.xml')
+        );
+        $entry = $feed->current();
+        $this->assertEquals($this->_expectedCatsRdf, (array) $entry->getCategories());
+        $this->assertEquals(array('topic1','topic2'), array_values($entry->getCategories()->getValues()));
+    }
+    
+    // DC 1.1
+    
+    public function testGetsCategoriesFromRss090_Dc11()
+    {
+        $feed = Zend_Feed_Reader::importString(
+            file_get_contents($this->_feedSamplePath.'/category/plain/dc11/rss090.xml')
+        );
+        $entry = $feed->current();
+        $this->assertEquals($this->_expectedCatsRdf, (array) $entry->getCategories());
+        $this->assertEquals(array('topic1','topic2'), array_values($entry->getCategories()->getValues()));
+    }
+    
+    public function testGetsCategoriesFromRss091_Dc11()
+    {
+        $feed = Zend_Feed_Reader::importString(
+            file_get_contents($this->_feedSamplePath.'/category/plain/dc11/rss091.xml')
+        );
+        $entry = $feed->current();
+        $this->assertEquals($this->_expectedCatsRdf, (array) $entry->getCategories());
+        $this->assertEquals(array('topic1','topic2'), array_values($entry->getCategories()->getValues()));
+    }
+    
+    public function testGetsCategoriesFromRss092_Dc11()
+    {
+        $feed = Zend_Feed_Reader::importString(
+            file_get_contents($this->_feedSamplePath.'/category/plain/dc11/rss092.xml')
+        );
+        $entry = $feed->current();
+        $this->assertEquals($this->_expectedCatsRdf, (array) $entry->getCategories());
+        $this->assertEquals(array('topic1','topic2'), array_values($entry->getCategories()->getValues()));
+    }
+    
+    public function testGetsCategoriesFromRss093_Dc11()
+    {
+        $feed = Zend_Feed_Reader::importString(
+            file_get_contents($this->_feedSamplePath.'/category/plain/dc11/rss093.xml')
+        );
+        $entry = $feed->current();
+        $this->assertEquals($this->_expectedCatsRdf, (array) $entry->getCategories());
+        $this->assertEquals(array('topic1','topic2'), array_values($entry->getCategories()->getValues()));
+    }
+    
+    public function testGetsCategoriesFromRss094_Dc11()
+    {
+        $feed = Zend_Feed_Reader::importString(
+            file_get_contents($this->_feedSamplePath.'/category/plain/dc11/rss094.xml')
+        );
+        $entry = $feed->current();
+        $this->assertEquals($this->_expectedCatsRdf, (array) $entry->getCategories());
+        $this->assertEquals(array('topic1','topic2'), array_values($entry->getCategories()->getValues()));
+    }
+    
+    public function testGetsCategoriesFromRss10_Dc11()
+    {
+        $feed = Zend_Feed_Reader::importString(
+            file_get_contents($this->_feedSamplePath.'/category/plain/dc11/rss10.xml')
+        );
+        $entry = $feed->current();
+        $this->assertEquals($this->_expectedCatsRdf, (array) $entry->getCategories());
+        $this->assertEquals(array('topic1','topic2'), array_values($entry->getCategories()->getValues()));
+    }
 }

+ 3 - 3
tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/rss090.xml → tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc10/rss090.xml

@@ -1,12 +1,12 @@
 <?xml version="1.0" encoding="utf-8" ?>
 <rdf:RDF
     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+    xmlns:dc="http://purl.org/dc/elements/1.0/"
     xmlns="http://my.netscape.com/rdf/simple/0.9/">
     <channel>
         <item>
-            <category domain="http://example.com/schema1">topic1</category>
-            <category domain="http://example.com/schema2">topic1</category>
-            <category domain="http://example.com/schema1">topic2</category>
+            <dc:subject><![CDATA[topic1]]></dc:subject>
+            <dc:subject><![CDATA[topic2]]></dc:subject>
         </item>
     </channel>
 </rdf:RDF>

+ 9 - 0
tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc10/rss091.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<rss version="0.91" xmlns:dc="http://purl.org/dc/elements/1.0/">
+    <channel>
+        <item>
+            <dc:subject><![CDATA[topic1]]></dc:subject>
+            <dc:subject><![CDATA[topic2]]></dc:subject>
+        </item>
+    </channel>
+</rss>

+ 9 - 0
tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc10/rss092.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<rss version="0.92" xmlns:dc="http://purl.org/dc/elements/1.0/">
+    <channel>
+        <item>
+            <dc:subject><![CDATA[topic1]]></dc:subject>
+            <dc:subject><![CDATA[topic2]]></dc:subject>
+        </item>
+    </channel>
+</rss>

+ 9 - 0
tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc10/rss093.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<rss version="0.93" xmlns:dc="http://purl.org/dc/elements/1.0/">
+    <channel>
+        <item>
+            <dc:subject><![CDATA[topic1]]></dc:subject>
+            <dc:subject><![CDATA[topic2]]></dc:subject>
+        </item>
+    </channel>
+</rss>

+ 9 - 0
tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc10/rss094.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<rss version="0.94" xmlns:dc="http://purl.org/dc/elements/1.0/">
+    <channel>
+        <item>
+            <dc:subject><![CDATA[topic1]]></dc:subject>
+            <dc:subject><![CDATA[topic2]]></dc:subject>
+        </item>
+    </channel>
+</rss>

+ 12 - 0
tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc10/rss10.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<rdf:RDF
+    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+    xmlns:dc="http://purl.org/dc/elements/1.0/"
+    xmlns="http://purl.org/rss/1.0/">
+    <channel>
+        <item>
+            <dc:subject><![CDATA[topic1]]></dc:subject>
+            <dc:subject><![CDATA[topic2]]></dc:subject>
+        </item>
+    </channel>
+</rdf:RDF>

+ 12 - 0
tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc11/rss090.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<rdf:RDF
+    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+    xmlns:dc="http://purl.org/dc/elements/1.1/"
+    xmlns="http://my.netscape.com/rdf/simple/0.9/">
+    <channel>
+        <item>
+            <dc:subject><![CDATA[topic1]]></dc:subject>
+            <dc:subject><![CDATA[topic2]]></dc:subject>
+        </item>
+    </channel>
+</rdf:RDF>

+ 9 - 0
tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc11/rss091.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<rss version="0.91" xmlns:dc="http://purl.org/dc/elements/1.1/">
+    <channel>
+        <item>
+            <dc:subject><![CDATA[topic1]]></dc:subject>
+            <dc:subject><![CDATA[topic2]]></dc:subject>
+        </item>
+    </channel>
+</rss>

+ 9 - 0
tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc11/rss092.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<rss version="0.92" xmlns:dc="http://purl.org/dc/elements/1.1/">
+    <channel>
+        <item>
+            <dc:subject><![CDATA[topic1]]></dc:subject>
+            <dc:subject><![CDATA[topic2]]></dc:subject>
+        </item>
+    </channel>
+</rss>

+ 9 - 0
tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc11/rss093.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<rss version="0.93" xmlns:dc="http://purl.org/dc/elements/1.1/">
+    <channel>
+        <item>
+            <dc:subject><![CDATA[topic1]]></dc:subject>
+            <dc:subject><![CDATA[topic2]]></dc:subject>
+        </item>
+    </channel>
+</rss>

+ 9 - 0
tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc11/rss094.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<rss version="0.94" xmlns:dc="http://purl.org/dc/elements/1.1/">
+    <channel>
+        <item>
+            <dc:subject><![CDATA[topic1]]></dc:subject>
+            <dc:subject><![CDATA[topic2]]></dc:subject>
+        </item>
+    </channel>
+</rss>

+ 12 - 0
tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc11/rss10.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<rdf:RDF
+    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+    xmlns:dc="http://purl.org/dc/elements/1.1/"
+    xmlns="http://purl.org/rss/1.0/">
+    <channel>
+        <item>
+            <dc:subject><![CDATA[topic1]]></dc:subject>
+            <dc:subject><![CDATA[topic2]]></dc:subject>
+        </item>
+    </channel>
+</rdf:RDF>

+ 0 - 10
tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/rss091.xml

@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<rss version="0.91">
-    <channel>
-        <item>
-            <category domain="http://example.com/schema1">topic1</category>
-            <category domain="http://example.com/schema2">topic1</category>
-            <category domain="http://example.com/schema1">topic2</category>
-        </item>
-    </channel>
-</rss>

+ 0 - 10
tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/rss092.xml

@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<rss version="0.92">
-    <channel>
-        <item>
-            <category domain="http://example.com/schema1">topic1</category>
-            <category domain="http://example.com/schema2">topic1</category>
-            <category domain="http://example.com/schema1">topic2</category>
-        </item>
-    </channel>
-</rss>

+ 0 - 10
tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/rss093.xml

@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<rss version="0.93">
-    <channel>
-        <item>
-            <category domain="http://example.com/schema1">topic1</category>
-            <category domain="http://example.com/schema2">topic1</category>
-            <category domain="http://example.com/schema1">topic2</category>
-        </item>
-    </channel>
-</rss>

+ 0 - 10
tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/rss094.xml

@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<rss version="0.94">
-    <channel>
-        <item>
-            <category domain="http://example.com/schema1">topic1</category>
-            <category domain="http://example.com/schema2">topic1</category>
-            <category domain="http://example.com/schema1">topic2</category>
-        </item>
-    </channel>
-</rss>

+ 0 - 12
tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/rss10.xml

@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<rdf:RDF
-    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-    xmlns="http://purl.org/rss/1.0/">
-    <channel>
-        <item>
-            <category domain="http://example.com/schema1">topic1</category>
-            <category domain="http://example.com/schema2">topic1</category>
-            <category domain="http://example.com/schema1">topic2</category>
-        </item>
-    </channel>
-</rdf:RDF>