فهرست منبع

ZF-3745: Update Zend_Mail_Part to be more subclass-friendly

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@24759 44c647ce-9c0f-0410-b52a-842ac1e357ba
adamlundrigan 13 سال پیش
والد
کامیت
b9031d1656
2فایلهای تغییر یافته به همراه102 افزوده شده و 2 حذف شده
  1. 50 1
      library/Zend/Mail/Part.php
  2. 52 1
      tests/Zend/Mail/MessageTest.php

+ 50 - 1
library/Zend/Mail/Part.php

@@ -86,6 +86,12 @@ class Zend_Mail_Part implements RecursiveIterator, Zend_Mail_Part_Interface
      * @var int
      */
     protected $_messageNum = 0;
+    
+    /**
+     * Class to use when creating message parts
+     * @var string 
+     */
+    protected $_partClass;
 
     /**
      * Public constructor
@@ -122,6 +128,10 @@ class Zend_Mail_Part implements RecursiveIterator, Zend_Mail_Part_Interface
             $this->_mail       = $params['handler'];
             $this->_messageNum = $params['id'];
         }
+        
+        if (isset($params['partclass'])) {
+            $this->setPartClass($params['partclass']);
+        }
 
         if (isset($params['raw'])) {
             Zend_Mime_Decode::splitMessage($params['raw'], $this->_headers, $this->_content);
@@ -140,6 +150,44 @@ class Zend_Mail_Part implements RecursiveIterator, Zend_Mail_Part_Interface
             }
         }
     }
+    
+    /**
+     * Set name pf class used to encapsulate message parts
+     * @param string $class
+     * @return Zend_Mail_Part
+     */
+    public function setPartClass($class)
+    {
+        if ( !class_exists($class) ) {
+            /**
+             * @see Zend_Mail_Exception
+             */
+            require_once 'Zend/Mail/Exception.php';
+            throw new Zend_Mail_Exception("Class '{$class}' does not exist");
+        }
+        if ( !is_subclass_of($class, 'Zend_Mail_Part_Interface') ) {
+            /**
+             * @see Zend_Mail_Exception
+             */
+            require_once 'Zend/Mail/Exception.php';
+            throw new Zend_Mail_Exception("Class '{$class}' must implement Zend_Mail_Part_Interface");
+        }
+        
+        $this->_partClass = $class;
+        return $this;
+    }
+    
+    /**
+     * Retrieve the class name used to encapsulate message parts
+     * @return string 
+     */
+    public function getPartClass()
+    {
+        if ( !$this->_partClass ) {
+            $this->_partClass = __CLASS__;
+        }
+        return $this->_partClass;
+    }
 
     /**
      * Check if part is a multipart message
@@ -223,9 +271,10 @@ class Zend_Mail_Part implements RecursiveIterator, Zend_Mail_Part_Interface
         if ($parts === null) {
             return;
         }
+        $partClass = $this->getPartClass();
         $counter = 1;
         foreach ($parts as $part) {
-            $this->_parts[$counter++] = new self(array('headers' => $part['header'], 'content' => $part['body']));
+            $this->_parts[$counter++] = new $partClass(array('headers' => $part['header'], 'content' => $part['body']));
         }
     }
 

+ 52 - 1
tests/Zend/Mail/MessageTest.php

@@ -461,6 +461,53 @@ class Zend_Mail_MessageTest extends PHPUnit_Framework_TestCase
         $this->assertArrayHasKey('constructor', $flags);
         $this->assertEquals('constructor', $flags['constructor']);
     }
+    
+    /**
+     * @group ZF-3745
+     */
+    public function testBackwardsCompatibilityMaintainedWhenPartClassNotSpecified()
+    {
+        $message = new Zend_Mail_Message(array('file' => $this->_file));
+        $this->assertGreaterThan(0, count($message));
+        foreach ( $message as $part ) {
+            $this->assertEquals('Zend_Mail_Part', get_class($part));
+        }
+    }
+    
+    /**
+     * @group ZF-3745
+     */
+    public function testMessageAcceptsPartClassOverrideViaConstructor()
+    {
+        $message = new Zend_Mail_Message(array(
+            'file'      => $this->_file,
+            'partclass' => 'ZF3745_Mail_Part'
+        ));
+        $this->assertEquals('ZF3745_Mail_Part', $message->getPartClass());
+        
+        // Ensure message parts use the specified part class
+        $this->assertGreaterThan(0, count($message));
+        foreach ( $message as $part ) {
+            $this->assertEquals('ZF3745_Mail_Part', get_class($part));
+        }
+    }
+    
+    /**
+     * @group ZF-3745
+     */
+    public function testMessageAcceptsPartClassOverrideViaSetter()
+    {
+        $message = new Zend_Mail_Message(array('file' => $this->_file));
+        $message->setPartClass('ZF3745_Mail_Part');
+        $this->assertEquals('ZF3745_Mail_Part', $message->getPartClass());
+        
+        // Ensure message parts use the specified part class
+        $this->assertGreaterThan(0, count($message));
+        foreach ( $message as $part ) {
+            $this->assertEquals('ZF3745_Mail_Part', get_class($part));
+        }
+    }
+    
 }
 
 /**
@@ -472,4 +519,8 @@ class ZF11514_Mail_Message extends Zend_Mail_Message
     protected $_flags = array(
         'default'=>'yes!'
     );
-}
+}
+
+class ZF3745_Mail_Part extends Zend_Mail_Part
+{
+}