Skip to content

Commit

Permalink
Added before and after query callbacks
Browse files Browse the repository at this point in the history
  • Loading branch information
AshleyDawson committed Jan 25, 2018
1 parent e1b24a6 commit b3907dd
Show file tree
Hide file tree
Showing 3 changed files with 112 additions and 1 deletion.
59 changes: 58 additions & 1 deletion lib/AshleyDawson/SimplePagination/Paginator.php
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,16 @@ class Paginator implements PaginatorInterface
*/
private $sliceCallback;

/**
* @var \Closure
*/
private $beforeQueryCallback;

/**
* @var \Closure
*/
private $afterQueryCallback;

/**
* @var int
*/
Expand Down Expand Up @@ -86,10 +96,23 @@ public function paginate($currentPageNumber = 1)
sprintf('Current page number must have a value of 1 or more, %s given', $currentPageNumber));
}

$beforeQueryCallback = $this->beforeQueryCallback instanceof \Closure
? $this->beforeQueryCallback
: function () {}
;

$afterQueryCallback = $this->afterQueryCallback instanceof \Closure
? $this->afterQueryCallback
: function () {}
;

$pagination = new Pagination();

$itemTotalCallback = $this->itemTotalCallback;

$beforeQueryCallback($this, $pagination);
$totalNumberOfItems = (int)$itemTotalCallback($pagination);
$afterQueryCallback($this, $pagination);

$numberOfPages = (int)ceil($totalNumberOfItems / $this->itemsPerPage);
$pagesInRange = $this->pagesInRange;
Expand All @@ -115,11 +138,13 @@ public function paginate($currentPageNumber = 1)

$sliceCallback = $this->sliceCallback;

$beforeQueryCallback($this, $pagination);
if (-1 === $this->itemsPerPage) {
$items = $sliceCallback(0, 99999999, $pagination);
$items = $sliceCallback(0, 999999999, $pagination);
} else {
$items = $sliceCallback($offset, $this->itemsPerPage, $pagination);
}
$afterQueryCallback($this, $pagination);

$previousPageNumber = null;
if (($currentPageNumber - 1) > 0) {
Expand Down Expand Up @@ -174,6 +199,38 @@ public function getItemTotalCallback()
return $this->itemTotalCallback;
}

/**
* @return \Closure
*/
public function getBeforeQueryCallback()
{
return $this->beforeQueryCallback;
}

/**
* @param \Closure $beforeQueryCallback
*/
public function setBeforeQueryCallback($beforeQueryCallback)
{
$this->beforeQueryCallback = $beforeQueryCallback;
}

/**
* @return \Closure
*/
public function getAfterQueryCallback()
{
return $this->afterQueryCallback;
}

/**
* @param \Closure $afterQueryCallback
*/
public function setAfterQueryCallback($afterQueryCallback)
{
$this->afterQueryCallback = $afterQueryCallback;
}

/**
* {@inheritdoc}
*/
Expand Down
20 changes: 20 additions & 0 deletions lib/AshleyDawson/SimplePagination/PaginatorInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,26 @@ public function getItemTotalCallback();
*/
public function setItemTotalCallback(\Closure $itemTotalCallback);

/**
* @return \Closure
*/
public function getBeforeQueryCallback();

/**
* @param \Closure $beforeQueryCallback
*/
public function setBeforeQueryCallback($beforeQueryCallback);

/**
* @return \Closure
*/
public function getAfterQueryCallback();

/**
* @param \Closure $afterQueryCallback
*/
public function setAfterQueryCallback($afterQueryCallback);

/**
* Get itemsPerPage
*
Expand Down
34 changes: 34 additions & 0 deletions tests/AshleyDawson/SimplePagination/Tests/PaginatorTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,40 @@ public function testPaginateFailZeroPageNumber()
$this->paginator->paginate(0);
}

public function testBeforeAndAfterQueryCallbacks()
{
$items = range(0, 27);

$paginator = new Paginator(array(
'itemTotalCallback' => function () use ($items) {
return count($items);
},
'sliceCallback' => function ($offset, $length) use ($items) {
return array_slice($items, $offset, $length);
},
'itemsPerPage' => 10,
'pagesInRange' => 5,
));

$beforeQueryFired = false;
$paginator->setBeforeQueryCallback(function () use (&$beforeQueryFired) {
$beforeQueryFired = true;
});

$afterQueryFired = false;
$paginator->setAfterQueryCallback(function () use (&$afterQueryFired) {
$afterQueryFired = true;
});

$this->assertFalse($beforeQueryFired);
$this->assertFalse($afterQueryFired);

$paginator->paginate(1);

$this->assertTrue($beforeQueryFired);
$this->assertTrue($afterQueryFired);
}

public function testPaginateLowVolumeConstructorConfig()
{
$items = range(0, 27);
Expand Down

0 comments on commit b3907dd

Please sign in to comment.