I found an even simpler way to achieve the same. You will notice that PaginationHelper extends AppHelper. So, if you copy any functions from the PaginatorHelper into the AppHelper calls and call it from the PaginationHelper, it will behave the same and without any errors.
Using
$numbers_config = array( "before" => null, "after" => null, "separator" => "", "tag" => "li" ); echo $this->Paginator->customNumbers($numbers_config);
the code
// /app/View/AppHelper.php App::uses('Helper', 'View'); class AppHelper extends Helper { public function customNumbers($options = array()) { if ($options === true) { $options = array( 'before' => ' | ', 'after' => ' | ', 'first' => 'first', 'last' => 'last' ); } $defaults = array( 'tag' => 'span', 'before' => null, 'after' => null, 'model' => $this->defaultModel(), 'class' => null, 'modulus' => '8', 'separator' => ' | ', 'first' => null, 'last' => null, 'ellipsis' => '...', 'currentClass' => 'current', 'currentTag' => null ); $options += $defaults; $params = (array)$this->params($options['model']) + array('page' => 1); unset($options['model']); if ($params['pageCount'] <= 1) { return false; } extract($options); unset($options['tag'], $options['before'], $options['after'], $options['model'], $options['modulus'], $options['separator'], $options['first'], $options['last'], $options['ellipsis'], $options['class'], $options['currentClass'], $options['currentTag'] ); $out = ''; if ($modulus && $params['pageCount'] > $modulus) { $half = intval($modulus / 2); $end = $params['page'] + $half; if ($end > $params['pageCount']) { $end = $params['pageCount']; } $start = $params['page'] - ($modulus - ($end - $params['page'])); if ($start <= 1) { $start = 1; $end = $params['page'] + ($modulus - $params['page']) + 1; } if ($first && $start > 1) { $offset = ($start <= (int)$first) ? $start - 1 : $first; if ($offset < $start - 1) { $out .= $this->first($offset, compact('tag', 'separator', 'ellipsis', 'class')); } else { $out .= $this->first($offset, compact('tag', 'separator', 'class', 'ellipsis') + array('after' => $separator)); } } $out .= $before; for ($i = $start; $i < $params['page']; $i++) { $out .= $this->Html->tag($tag, $this->link($i, array('page' => $i), $options), compact('class')) . $separator; } if ($class) { $currentClass .= ' ' . $class; } if ($currentTag) { $out .= $this->Html->tag($tag, $this->Html->tag($currentTag, $params['page']), array('class' => $currentClass)); } else { $out .= $this->Html->tag($tag, "<a href='#'>".$params['page']."</a>", array('class' => $currentClass)); } if ($i != $params['pageCount']) { $out .= $separator; } $start = $params['page'] + 1; for ($i = $start; $i < $end; $i++) { $out .= $this->Html->tag($tag, $this->link($i, array('page' => $i), $options), compact('class')) . $separator; } if ($end != $params['page']) { $out .= $this->Html->tag($tag, $this->link($i, array('page' => $end), $options), compact('class')); } $out .= $after; if ($last && $end < $params['pageCount']) { $offset = ($params['pageCount'] < $end + (int)$last) ? $params['pageCount'] - $end : $last; if ($offset <= $last && $params['pageCount'] - $end > $offset) { $out .= $this->last($offset, compact('tag', 'separator', 'ellipsis', 'class')); } else { $out .= $this->last($offset, compact('tag', 'separator', 'class', 'ellipsis') + array('before' => $separator)); } } } else { $out .= $before; for ($i = 1; $i <= $params['pageCount']; $i++) { if ($i == $params['page']) { if ($class) { $currentClass .= ' ' . $class; } if ($currentTag) { $out .= $this->Html->tag($tag, $this->Html->tag($currentTag, $i), array('class' => $currentClass)); } else { $out .= $this->Html->tag($tag, $i, array('class' => $currentClass)); } } else { $out .= $this->Html->tag($tag, $this->link($i, array('page' => $i), $options), compact('class')); } if ($i != $params['pageCount']) { $out .= $separator; } } $out .= $after; } return $out; } }