Пагинация: настройка вывода ссылок

Товарищи!

У меня есть скрипт пагинации, но я не соображу как его настроить, чтобы у ссылок на страницы был определённый вид. Нужно, чтобы было примерно так:

1 2 3 4 5 6… 17
1 2 3 4 5 6 7… 17
1 2 3 4 5 6 7 8… 17
1 2 3 4 5 6 7 8 9… 17
1… 4 5 6 7 8 9 10… 17
1… 9 10 11 12 13 14 15 16 17
1… 10 11 12 13 14 15 16 17
1… 11 12 13 14 15 16 17
1… 12 13 14 15 16 17

А вот сам скрипт:

public function pages() : string
{
    if ($this->pagesTotal > 1) {
        $html = '';
        for ($i = 1; $i <= $this->pagesTotal; $i++) {
            if ($this->page > 1 && $i == $this->page - 2) {
                $html .= '<li><a href="' . $this->url . '/' . $i . '"></a>...</li>';
                continue;
            }
            if ($i > $this->page + 2) {
                $html .= '<li><a href="' . $i . '"></a>...<li>';
                break;
            }
            if ($i == $this->page) {
                $html .= ' <li class="current">' . $i . '</li>';
            } else {
                $html .= '<li><a href="' . $this->url . '/' . $i . '">' . $i . '</a></li>';
            }
        }
        return $html;
    }
}

Помогите пожалуйста чайнику…


Ответы (1 шт):

Автор решения: crazyRabbit

В вашем варианте я не совсем уловил логику появления и скрытия элементов, но допущу, что вам может помочь такой код:

function makePager($iStart, $iCurr, $iEnd)
{
    $iLeft = $iRight = 3;
    if($iEnd < ($iLeft + $iRight + 1)){
        return array(1, $iEnd); 
    } elseif ($iCurr > $iLeft && $iCurr < ($iEnd - $iRight)){
        return array(($iCurr - $iLeft), ($iCurr + $iRight));
    } elseif ($iCurr <= $iLeft) {
        $iSlice = 1 + $iLeft - $iCurr;
        return array(1, ($iCurr + ($iRight + $iSlice)));
    } else {
        $iSlice = $iRight - ($iEnd - $iCurr);
        return array(($iCurr - ($iLeft + $iSlice)), $iEnd);
    }
}

function pager($from, $current, $to)
{
    $slice = makePager($from, $current, $to);
    $answer = "";
    
    if($slice[0] != $from){
        $answer .= $from." ... ";
    }
    
    for($i = $slice[0]; $i <= $slice[1]; $i++){
        $answer .= $i." ";
    }
    
    if($slice[1] != $to){
        $answer .= "... ".$to;
    }
    
    return $answer;
}

print_r(pager(1, 12, 24)); // 1 ... 9 10 11 12 13 14 15 ... 24
→ Ссылка