Преглед изворни кода

fixed ZF-8084: Zend_Paginator_Adapter_Iterator::getItems returns a new Serializable LimitIterator named Zend_Paginator_SerializableLimitIterator

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@18670 44c647ce-9c0f-0410-b52a-842ac1e357ba
mabe пре 16 година
родитељ
комит
dc65b29d5f

+ 8 - 1
library/Zend/Paginator/Adapter/Iterator.php

@@ -25,6 +25,11 @@
 require_once 'Zend/Paginator/Adapter/Interface.php';
 
 /**
+ * @see Zend_Paginator_SerializableLimitIterator
+ */
+require_once 'Zend/Paginator/SerializableLimitIterator.php';
+
+/**
  * @category   Zend
  * @package    Zend_Paginator
  * @copyright  Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
@@ -80,7 +85,9 @@ class Zend_Paginator_Adapter_Iterator implements Zend_Paginator_Adapter_Interfac
             return array();
         }
 
-        return new LimitIterator($this->_iterator, $offset, $itemCountPerPage);
+        // @link http://bugs.php.net/bug.php?id=49906 | ZF-8084
+        // return new LimitIterator($this->_iterator, $offset, $itemCountPerPage);
+        return new Zend_Paginator_SerializableLimitIterator($this->_iterator, $offset, $itemCountPerPage);
     }
 
     /**

+ 83 - 0
library/Zend/Paginator/SerializableLimitIterator.php

@@ -0,0 +1,83 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category   Zend
+ * @package    Zend_Paginator
+ * @copyright  Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license    http://framework.zend.com/license/new-bsd     New BSD License
+ * @version    $Id: Interface.php 17687 2009-08-20 12:55:34Z thomas $
+ */
+
+/**
+ * @category   Zend
+ * @package    Zend_Paginator
+ * @copyright  Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license    http://framework.zend.com/license/new-bsd     New BSD License
+ */
+class Zend_Paginator_SerializableLimitIterator extends LimitIterator implements Serializable
+{
+
+    /**
+     * Offset to first element
+     *
+     * @var int
+     */
+    private $_offset;
+
+    /**
+     * Maximum number of elements to show or -1 for all
+     *
+     * @var int
+     */
+    private $_count;
+
+    /**
+     * Construct a Zend_Paginator_SerializableLimitIterator
+     *
+     * @param Iterator $it Iterator to limit (must be serializable by un-/serialize)
+     * @param int $offset Offset to first element
+     * @param int $count Maximum number of elements to show or -1 for all
+     * @see LimitIterator::__construct
+     */
+    public function __construct (Iterator $it, $offset=0, $count=-1)
+    {
+        parent::__construct($it, $offset, $count);
+        $this->_offset = $offset;
+        $this->_count = $count;
+    }
+
+    /**
+     * @return string representation of the instance
+     */
+    public function serialize()
+    {
+        return serialize(array(
+            'it'     => $this->getInnerIterator(),
+            'offset' => $this->_offset,
+            'count'  => $this->_count,
+            'pos'    => $this->getPosition(),
+        ));
+    }
+
+    /**
+     * @paran string $data representation of the instance
+     */
+    public function unserialize($data)
+    {
+        $dataArr = unserialize($data);
+        $this->__construct($dataArr['it'], $dataArr['offset'], $dataArr['count']);
+        $this->seek($dataArr['pos']+$dataArr['offset']);
+    }
+
+}

+ 20 - 9
tests/Zend/Paginator/Adapter/IteratorTest.php

@@ -44,7 +44,7 @@ class Zend_Paginator_Adapter_IteratorTest extends PHPUnit_Framework_TestCase
      * @var Zend_Paginator_Adapter_Iterator
      */
     private $_adapter;
-    
+
     /**
      * Prepares the environment before running a test.
      */
@@ -62,40 +62,40 @@ class Zend_Paginator_Adapter_IteratorTest extends PHPUnit_Framework_TestCase
         $this->_adapter = null;
         parent::tearDown();
     }
-    
+
     public function testGetsItemsAtOffsetZero()
     {
         $actual = $this->_adapter->getItems(0, 10);
         $this->assertType('LimitIterator', $actual);
-        
+
         $i = 1;
         foreach ($actual as $item) {
             $this->assertEquals($i, $item);
             $i++;
         }
     }
-    
+
     public function testGetsItemsAtOffsetTen()
     {
         $actual = $this->_adapter->getItems(10, 10);
         $this->assertType('LimitIterator', $actual);
-        
+
         $i = 11;
         foreach ($actual as $item) {
             $this->assertEquals($i, $item);
             $i++;
         }
     }
-    
+
     public function testReturnsCorrectCount()
     {
         $this->assertEquals(101, $this->_adapter->count());
     }
-    
+
     public function testThrowsExceptionIfNotCountable()
     {
         $iterator = new LimitIterator(new ArrayIterator(range(1, 101)));
-        
+
         try {
             new Zend_Paginator_Adapter_Iterator($iterator);
         } catch (Exception $e) {
@@ -103,7 +103,7 @@ class Zend_Paginator_Adapter_IteratorTest extends PHPUnit_Framework_TestCase
             $this->assertEquals('Iterator must implement Countable', $e->getMessage());
         }
     }
-    
+
     /**
      * @group ZF-4151
      */
@@ -117,4 +117,15 @@ class Zend_Paginator_Adapter_IteratorTest extends PHPUnit_Framework_TestCase
             $this->fail('Empty iterator caused in an OutOfBoundsException');
         }
     }
+
+    /**
+     * @group ZF-8084
+     */
+    public function testGetItemsSerializable() {
+        $items = $this->_adapter->getItems(0, 1);
+        $innerIterator = $items->getInnerIterator();
+        $items = unserialize(serialize($items));
+        $this->assertTrue( ($items->getInnerIterator() == $innerIterator), 'getItems has to be serializable to use caching');
+    }
+
 }