Páginas

16 de junho de 2010

sfPager para arrays de elementos

Como já devem saber, podemos utilizar o sfDoctrinePager para paginar resultados de uma consulta à base de dados.

No entanto, por vezes necessitamos de paginar resultados contidos num array e não num objecto do Doctrine.

Hoje vou mostrar como isso é possível.

Basta criar uma classe lib/MyArrayPager.class.php:
class MyArrayPager extends sfPager
{
  protected $resultsArray = null;

  public function __construct($class = null, $maxPerPage = 10)
  {
    parent::__construct($class, $maxPerPage);
  }

  public function init()
  {
    $this->setNbResults(count($this->resultsArray));

    if (($this->getPage() == 0 || $this->getMaxPerPage() == 0))
    {
     $this->setLastPage(0);
    }
    else
    {
     $this->setLastPage(ceil($this->getNbResults() / $this->getMaxPerPage()));
    }
  }

  public function setResultArray($array)
  {
    $this->resultsArray = $array;
  }

  public function getResultArray()
  {
    return $this->resultsArray;
  }

  public function retrieveObject($offset) {
    return $this->resultsArray[$offset];
  }

  public function getResults()
  {
      return array_slice($this->resultsArray, ($this->getPage() - 1) * $this->getMaxPerPage(), $this->maxPerPage);
  }

}
Agora, na acção em que queremos invocar o pager:
$this->pager = new MyArrayPager(null, 10); // (class, numero maximo por pagina)
$this->pager->setResultArray($this->results);
$this->pager->setPage($request->getParameter('page_num', 1));
$this->pager->init();
Depois basta-nos tratar a vista da mesma forma que o fazemos com o sfDoctrinePager.

Snippet por scott meves.

Nenhum comentário:

Postar um comentário