فهرست منبع

Added getExtension() to feed level, and refactored internally to use this method in preference to protected vars holding Core Extensions

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@16963 44c647ce-9c0f-0410-b52a-842ac1e357ba
padraic 16 سال پیش
والد
کامیت
e1fff383f4

+ 12 - 20
library/Zend/Feed/Reader/Feed/Atom.php

@@ -39,13 +39,6 @@ class Zend_Feed_Reader_Feed_Atom extends Zend_Feed_Reader_FeedAbstract
 {
 
     /**
-     * Atom feed
-     *
-     * @var Zend_Feed_Reader_Feed_Atom
-     */
-    protected $_atom = null;
-
-    /**
      * Constructor
      *
      * @param  Zend_Feed_Abstract $feed
@@ -56,8 +49,7 @@ class Zend_Feed_Reader_Feed_Atom extends Zend_Feed_Reader_FeedAbstract
     {
         parent::__construct($dom, $type);
         $atomClass = Zend_Feed_Reader::getPluginLoader()->getClassName('Atom_Feed');
-        $this->_atom = new $atomClass($dom, $this->_data['type'], $this->_xpath);
-        $this->_atom->setXpathPrefix('/atom:feed');
+        $this->_extensions['Atom_Feed'] = new $atomClass($dom, $this->_data['type'], $this->_xpath);
         foreach ($this->_extensions as $extension) {
             $extension->setXpathPrefix('/atom:feed');
         }
@@ -91,7 +83,7 @@ class Zend_Feed_Reader_Feed_Atom extends Zend_Feed_Reader_FeedAbstract
             return $this->_data['authors'];
         }
 
-        $people = $this->_atom->getAuthors();
+        $people = $this->getExtension('Atom')->getAuthors();
 
         $this->_data['authors'] = $people;
 
@@ -109,7 +101,7 @@ class Zend_Feed_Reader_Feed_Atom extends Zend_Feed_Reader_FeedAbstract
             return $this->_data['copyright'];
         }
 
-        $copyright = $this->_atom->getCopyright();
+        $copyright = $this->getExtension('Atom')->getCopyright();
 
         if (!$copyright) {
             $copyright = null;
@@ -131,7 +123,7 @@ class Zend_Feed_Reader_Feed_Atom extends Zend_Feed_Reader_FeedAbstract
             return $this->_data['datecreated'];
         }
 
-        $dateCreated = $this->_atom->getDateCreated();
+        $dateCreated = $this->getExtension('Atom')->getDateCreated();
 
         if (!$dateCreated) {
             $dateCreated = null;
@@ -153,7 +145,7 @@ class Zend_Feed_Reader_Feed_Atom extends Zend_Feed_Reader_FeedAbstract
             return $this->_data['datemodified'];
         }
 
-        $dateModified = $this->_atom->getDateModified();
+        $dateModified = $this->getExtension('Atom')->getDateModified();
 
         if (!$dateModified) {
             $dateModified = null;
@@ -175,7 +167,7 @@ class Zend_Feed_Reader_Feed_Atom extends Zend_Feed_Reader_FeedAbstract
             return $this->_data['description'];
         }
 
-        $description = $this->_atom->getDescription();
+        $description = $this->getExtension('Atom')->getDescription();
 
         if (!$description) {
             $description = null;
@@ -197,7 +189,7 @@ class Zend_Feed_Reader_Feed_Atom extends Zend_Feed_Reader_FeedAbstract
             return $this->_data['generator'];
         }
 
-        $generator = $this->_atom->getGenerator();
+        $generator = $this->getExtension('Atom')->getGenerator();
 
         $this->_data['generator'] = $generator;
 
@@ -215,7 +207,7 @@ class Zend_Feed_Reader_Feed_Atom extends Zend_Feed_Reader_FeedAbstract
             return $this->_data['id'];
         }
 
-        $id = $this->_atom->getId();
+        $id = $this->getExtension('Atom')->getId();
 
         $this->_data['id'] = $id;
 
@@ -233,7 +225,7 @@ class Zend_Feed_Reader_Feed_Atom extends Zend_Feed_Reader_FeedAbstract
             return $this->_data['language'];
         }
 
-        $language = $this->_atom->getLanguage();
+        $language = $this->getExtension('Atom')->getLanguage();
 
         if (!$language) {
             $language = $this->_xpath->evaluate('string(//@xml:lang[1])');
@@ -259,7 +251,7 @@ class Zend_Feed_Reader_Feed_Atom extends Zend_Feed_Reader_FeedAbstract
             return $this->_data['link'];
         }
 
-        $link = $this->_atom->getLink();
+        $link = $this->getExtension('Atom')->getLink();
 
         $this->_data['link'] = $link;
 
@@ -277,7 +269,7 @@ class Zend_Feed_Reader_Feed_Atom extends Zend_Feed_Reader_FeedAbstract
             return $this->_data['feedlink'];
         }
 
-        $link = $this->_atom->getFeedLink();
+        $link = $this->getExtension('Atom')->getFeedLink();
 
         $this->_data['feedlink'] = $link;
 
@@ -295,7 +287,7 @@ class Zend_Feed_Reader_Feed_Atom extends Zend_Feed_Reader_FeedAbstract
             return $this->_data['title'];
         }
 
-        $title = $this->_atom->getTitle();
+        $title = $this->getExtension('Atom')->getTitle();
 
         $this->_data['title'] = $title;
 

+ 24 - 39
library/Zend/Feed/Reader/Feed/Rss.php

@@ -47,19 +47,6 @@ require_once 'Zend/Date.php';
  */
 class Zend_Feed_Reader_Feed_Rss extends Zend_Feed_Reader_FeedAbstract
 {
-    /**
-     * Atom feed
-     *
-     * @var Zend_Feed_Reader_Feed_Atom
-     */
-    protected $_atom = null;
-
-    /**
-     * DC feed
-     *
-     * @var Zend_Feed_Reader_Extension_DublinCore_Feed
-     */
-    protected $_dc = null;
 
     /**
      * Constructor
@@ -73,17 +60,15 @@ class Zend_Feed_Reader_Feed_Rss extends Zend_Feed_Reader_FeedAbstract
         parent::__construct($dom, $type);
 
         $dublinCoreClass = Zend_Feed_Reader::getPluginLoader()->getClassName('DublinCore_Feed');
-        $this->_dc = new $dublinCoreClass($dom, $this->_data['type'], $this->_xpath);
+        $this->_extensions['DublinCore_Feed'] = new $dublinCoreClass($dom, $this->_data['type'], $this->_xpath);
         $atomClass = Zend_Feed_Reader::getPluginLoader()->getClassName('Atom_Feed');
-        $this->_atom = new $atomClass($dom, $this->_data['type'], $this->_xpath);
+        $this->_extensions['Atom_Feed'] = new $atomClass($dom, $this->_data['type'], $this->_xpath);
 
         if ($this->getType() !== Zend_Feed_Reader::TYPE_RSS_10 && $this->getType() !== Zend_Feed_Reader::TYPE_RSS_090) {
             $xpathPrefix = '/rss/channel';
         } else {
             $xpathPrefix = '/rdf:RDF/rss:channel';
         }
-        $this->_dc->setXpathPrefix($xpathPrefix);
-        $this->_atom->setXpathPrefix($xpathPrefix);
         foreach ($this->_extensions as $extension) {
             $extension->setXpathPrefix($xpathPrefix);
         }
@@ -120,7 +105,7 @@ class Zend_Feed_Reader_Feed_Rss extends Zend_Feed_Reader_FeedAbstract
         $authors = array();
 
         if (empty($authors)) {
-            $authors = $this->_dc->getAuthors();
+            $authors = $this->getExtension('DublinCore')->getAuthors();
         }
 
         if (empty($authors)) {
@@ -136,7 +121,7 @@ class Zend_Feed_Reader_Feed_Rss extends Zend_Feed_Reader_FeedAbstract
         }
 
         if (empty($authors)) {
-            $authors = $this->_atom->getAuthors();
+            $authors = $this->getExtension('Atom')->getAuthors();
         }
 
         if (empty($authors)) {
@@ -168,12 +153,12 @@ class Zend_Feed_Reader_Feed_Rss extends Zend_Feed_Reader_FeedAbstract
             $copyright = $this->_xpath->evaluate('string(/rss/channel/copyright)');
         }
 
-        if (!$copyright && !is_null($this->_dc)) {
-            $copyright = $this->_dc->getCopyright();
+        if (!$copyright && !is_null($this->getExtension('DublinCore'))) {
+            $copyright = $this->getExtension('DublinCore')->getCopyright();
         }
 
         if (empty($copyright)) {
-            $copyright = $this->_atom->getCopyright();
+            $copyright = $this->getExtension('Atom')->getCopyright();
         }
 
         if (!$copyright) {
@@ -238,11 +223,11 @@ class Zend_Feed_Reader_Feed_Rss extends Zend_Feed_Reader_FeedAbstract
         }
 
         if (!$date) {
-            $date = $this->_dc->getDate();
+            $date = $this->getExtension('DublinCore')->getDate();
         }
 
         if (!$date) {
-            $date = $this->_atom->getDateModified();
+            $date = $this->getExtension('Atom')->getDateModified();
         }
 
         if (!$date) {
@@ -274,12 +259,12 @@ class Zend_Feed_Reader_Feed_Rss extends Zend_Feed_Reader_FeedAbstract
             $description = $this->_xpath->evaluate('string(/rdf:RDF/rss:channel/rss:description)');
         }
 
-        if (!$description && !is_null($this->_dc)) {
-            $description = $this->_dc->getDescription();
+        if (!$description && !is_null($this->getExtension('DublinCore'))) {
+            $description = $this->getExtension('DublinCore')->getDescription();
         }
 
         if (empty($description)) {
-            $description = $this->_atom->getDescription();
+            $description = $this->getExtension('Atom')->getDescription();
         }
 
         if (!$description) {
@@ -309,12 +294,12 @@ class Zend_Feed_Reader_Feed_Rss extends Zend_Feed_Reader_FeedAbstract
             $id = $this->_xpath->evaluate('string(/rss/channel/guid)');
         }
 
-        if (!$id && !is_null($this->_dc)) {
-            $id = $this->_dc->getId();
+        if (!$id && !is_null($this->getExtension('DublinCore'))) {
+            $id = $this->getExtension('DublinCore')->getId();
         }
 
         if (empty($id)) {
-            $id = $this->_atom->getId();
+            $id = $this->getExtension('Atom')->getId();
         }
 
         if (!$id) {
@@ -350,12 +335,12 @@ class Zend_Feed_Reader_Feed_Rss extends Zend_Feed_Reader_FeedAbstract
             $language = $this->_xpath->evaluate('string(/rss/channel/language)');
         }
 
-        if (!$language && !is_null($this->_dc)) {
-            $language = $this->_dc->getLanguage();
+        if (!$language && !is_null($this->getExtension('DublinCore'))) {
+            $language = $this->getExtension('DublinCore')->getLanguage();
         }
 
         if (empty($language)) {
-            $language = $this->_atom->getLanguage();
+            $language = $this->getExtension('Atom')->getLanguage();
         }
 
         if (!$language) {
@@ -392,7 +377,7 @@ class Zend_Feed_Reader_Feed_Rss extends Zend_Feed_Reader_FeedAbstract
         }
 
         if (empty($link)) {
-            $link = $this->_atom->getLink();
+            $link = $this->getExtension('Atom')->getLink();
         }
 
         if (!$link) {
@@ -417,7 +402,7 @@ class Zend_Feed_Reader_Feed_Rss extends Zend_Feed_Reader_FeedAbstract
 
         $link = null;
 
-        $link = $this->_atom->getFeedLink();
+        $link = $this->getExtension('Atom')->getFeedLink();
 
         if (!$link) {
             $link = null;
@@ -459,7 +444,7 @@ class Zend_Feed_Reader_Feed_Rss extends Zend_Feed_Reader_FeedAbstract
         }
 
         if (empty($generator)) {
-            $generator = $this->_atom->getGenerator();
+            $generator = $this->getExtension('Atom')->getGenerator();
         }
 
         if (!$generator) {
@@ -491,12 +476,12 @@ class Zend_Feed_Reader_Feed_Rss extends Zend_Feed_Reader_FeedAbstract
             $title = $this->_xpath->evaluate('string(/rdf:RDF/rss:channel/rss:title)');
         }
 
-        if (!$title && !is_null($this->_dc)) {
-            $title = $this->_dc->getTitle();
+        if (!$title && !is_null($this->getExtension('DublinCore'))) {
+            $title = $this->getExtension('DublinCore')->getTitle();
         }
 
         if (!$title) {
-            $title = $this->_atom->getTitle();
+            $title = $this->getExtension('Atom')->getTitle();
         }
 
         if (!$title) {

+ 9 - 1
library/Zend/Feed/Reader/FeedAbstract.php

@@ -261,6 +261,14 @@ abstract class Zend_Feed_Reader_FeedAbstract implements Zend_Feed_Reader_FeedInt
         . 'does not exist and could not be located on a registered Extension');
     }
 
+    public function getExtension($name)
+    {
+        if (array_key_exists($name . '_Feed', $this->_extensions)) {
+            return $this->_extensions[$name . '_Feed'];
+        }
+        return null;
+    }
+
     protected function _loadExtensions()
     {
         $all = Zend_Feed_Reader::getExtensions();
@@ -270,7 +278,7 @@ abstract class Zend_Feed_Reader_FeedAbstract implements Zend_Feed_Reader_FeedInt
                 continue;
             }
             $className = Zend_Feed_Reader::getPluginLoader()->getClassName($extension);
-            $this->_extensions[$className] = new $className(
+            $this->_extensions[$extension] = new $className(
                 $this->getDomDocument(), $this->_data['type'], $this->_xpath
             );
         }

+ 16 - 0
tests/Zend/Feed/Reader/Feed/CommonTest.php

@@ -60,5 +60,21 @@ class Zend_Feed_Reader_Feed_CommonTest extends PHPUnit_Framework_TestCase
         $this->assertEquals($feed->saveXml(), file_get_contents($this->_feedSamplePath.'/atom_rewrittenbydom.xml'));
     }
 
+    public function testGetsNamedExtension()
+    {
+        $feed = Zend_Feed_Reader::importString(
+            file_get_contents($this->_feedSamplePath.'/atom.xml')
+        );
+        $this->assertTrue($feed->getExtension('Atom') instanceof Zend_Feed_Reader_Extension_Atom_Feed);
+    }
+
+    public function testReturnsNullIfExtensionDoesNotExist()
+    {
+        $feed = Zend_Feed_Reader::importString(
+            file_get_contents($this->_feedSamplePath.'/atom.xml')
+        );
+        $this->assertEquals(null, $feed->getExtension('Foo'));
+    }
+
 
 }