You can use a LimitIterator to make it starts where you want ;-)

Julien.P

2008/11/7 Jason Austin <[EMAIL PROTECTED]>

> Thanks for the code.
>
> After further investigation, it appears that the issue is not with
> Zend_Db_Table_Rowset, but with the SPL SeekableIterator class, and how PHP
> handles iterators and foreach loops.  The foreach loop executes a rewind()
> before beginning, therefore resetting our pointer to 0.
> It would seem to make sense for SeekableIterator to be able to move the
> pointer, then the foreach loops start where the pointer is telling it to.
>  Zend_Db_Table_Rowset could handle this on its own, but it seems that would
> be the entire point of implementing SeekableIterator as opposed to Iterator.
>  IE:
>
> // in Zend_Db_Table_Rowset_Abstract
>
> protected $_seek = false;
>
> public function seek($position)
> {
>   // do all the stuff seek does
>   $this->_seek = true;
> }
>
> public function rewind()
> {
>   if (!$this->_seek) {
>      $this->_pointer = 0;
>   }
>   $this->_seek = false;
>   return $this;
> }
>
> That code isn't great, but doing something like this could get around PHP's
> rewind at the beginning of foreach loops, but it seems kinda hack-ish to me.
>
> Thoughts?
>
> Cameron wrote:
>
>> I built something like this as a paginator for when you're on your item
>> view. What I did was build a simple class that implements the SPL Iterator
>> and Countable classes, just like the internal Zend_Paginator, but just uses
>> an array as its internal guts. Then I simply grabbed all the id fields from
>> my table and passed it as an array through to my paginator class'
>> constructor, and then called the setCurrentItem method to correctly position
>> the pointer in array. I have no idea if something like this helps you at
>> all, but it seemed a pretty clean way of solving my particular problem,
>> which was getting a "next" and "previous" button on my record display.
>> Here's the class anyway, if it helps.
>>
>> class ItemPaginator implements Countable, Iterator
>> {
>>    protected $collection;
>>    protected $count;
>>    protected $pointer_position;
>>      public function __construct( $collection ) {
>>      $this->collection = $collection;
>>      $this->count = sizeof($this->collection);
>>    }
>>      public function count() {
>>        return $this->count;
>>    }
>>      public function key() {
>>      return $this->pointer_position;
>>    }
>>
>>    public function current() {
>>      return $this->collection[$this->pointer_position];
>>    }
>>
>>    public function next() {            $this->pointer_position++;
>>    }
>>
>>    public function rewind() {
>>      $this->pointer_position = 0;
>>    }
>>      public function valid() {
>>      return strlen( $this->collection ) > $this->pointer_position;
>>    }        public function getNextItem() {
>>        if ($this->pointer_position < $this->count) {
>>            return $this->collection[$this->pointer_position + 1];
>>        }
>>        return false;
>>    }
>>      public function getPrevItem() {
>>        if ($this->pointer_position > 0 ) {
>>            return $this->collection[$this->pointer_position - 1];
>>        }
>>        return false;
>>    }
>>      public function getFirstItem() {
>>        if ($this->pointer_position > 0 ) {
>>            return $this->collection[0];
>>        }
>>        return false;
>>    }
>>      public function getLastItem() {
>>        if ($this->pointer_position < $this->count ) {
>>            return $this->collection[$this->count - 1]; // -1 for the array
>> offset
>>        }
>>        return false;
>>    }
>>      public function setCurrentItem($item) {
>>        $key = array_search($item, $this->collection);
>>        if (FALSE !== $key) {
>>            $this->pointer_position = $key;
>>            return true;
>>        }
>>        return false;
>>    }
>> }
>>
>>
>> Sorry if this is really terrible code that I should be implementing
>> completely differently, the SPL is all a bit new to me :)
>>
>>
>>
>> On Fri, Nov 7, 2008 at 1:17 AM, Jason Austin <[EMAIL PROTECTED]<mailto:
>> [EMAIL PROTECTED]>> wrote:
>>
>>    I have a need to paginate some simple results, which I need the
>>    count of the entire rowset, and then rows from a particular
>>    offset.  I don't really want to execute 2 queries, so I was
>>    thinking of using the seek() method of my result set to put the
>>    pointer to the required offset, however when I loop through the
>>    results it starts over at the beginning of the result set:
>>
>>    <?php
>>
>>    $rows = $model->fetchAll($where, $order);
>>
>>    $rows->seek($page * $resultsPerPage);
>>
>>    echo $rows->current()->id  // echoes correct "seek()" offset ID
>>
>>    foreach ($rows as $r) {  // starts over at the beginning of the rowset
>>      // add to result set
>>    }
>>
>>    ?>
>>
>>    Is this the expected behavior or am I missing something totally
>>    obvious?  This is with version 1.6.1. <http://1.6.1.>  Should I
>>    just do 2 queries (a query to get the required rows, then a count
>>    query without qualifier)?
>>
>>    Thanks!
>>    Jason
>>
>>    --    Jason Austin
>>    Senior Solutions Implementation Engineer
>>    NC State University - Office of Information Technology
>>    http://webapps.ncsu.edu
>>    919.513-4372
>>
>>
>>
> --
> Jason Austin
> Senior Solutions Implementation Engineer
> NC State University - Office of Information Technology
> http://webapps.ncsu.edu
> 919.513-4372
>
>

Reply via email to