Virtuemart

Virtuemart (VM1): Изменение способа страничной навигации (пагинации) по товарам

Одним из недостатков Virtuemart является неудобная стандартная страничная навигация (пагинация) по товарам.

Гораздо красивее и удобнее способ "скользящей" навигации, используемый на форумах и др. системах.

Пример

Для изменения алгоритма разбиения на страницы (пагинации) нужно заменить функцию getPagesLinks в файле administrator/components/com_virtuemart/classes/pageNavigation.class.php.

Не найдя в интернете красивого алгоритма, написал свой вариант:

function getPagesLinks($link='') {

    global $VM_LANG;

    $display_count = 9;

    $page_count = ceil($this->total / $this->limit);
    $active_page = ceil(($this->limitstart + 1) / $this->limit);


    if ($display_count >= $page_count) {

        $start_loop = 1;
        $stop_loop = $page_count;

    } else {

        $ltrt = floor(($display_count - 2) / 2);

        // start
        $start_loop = min($active_page - $ltrt, $page_count - $display_count + 1);

        if ($start_loop <= 3) {
            $start_loop = 1;
        }

        // stop
        $stop_loop = max($active_page + $ltrt, $display_count);

        if ($stop_loop >= ($page_count - 2)) {
            $stop_loop = $page_count;
        }

    }

    $html = '<ul class="pagination">';

    // prev
    if ($start_loop > 1) {

        $page = ($active_page - 2) * $this->limit;
        $prev_text = "&laquo; ".$VM_LANG->_('PN_PREVIOUS');
        // $prev_text = "&nbsp;&lt;&nbsp;";
        if( $link != '') {
            $html .= "\n<li><a href=\"".vmRoute($link.'&limit='.$this->limit.'&limitstart='.$page)."\" class=\"pagenav first\" title=\"".$VM_LANG->_('PN_PREVIOUS')."\">".$prev_text."</a></li>";
        } else {
            $html .= "\n<li><a href=\"#prev\" class=\"pagenav first\" title=\"".$VM_LANG->_('PN_PREVIOUS')."\" onclick=\"javascript: document.adminForm.limitstart.value=$page; document.adminForm.submit();return false;\">".$prev_text."</a></li>";
        }

    }

    $i = 0;
    while (true) {

        $i++;

        if ($i > $page_count) {
            break;
        }

        if (($i > 1) && ($i < $start_loop)) {
            $i = $start_loop;
        }

        if ($i > $stop_loop) {
            $i = $page_count;
        }

        if ((($i == $start_loop) && ($start_loop > 1))
        || (($i == $page_count) && ($stop_loop < $page_count))) {
            $html .= "\n<li>...</li>";
        }

        $page = ($i - 1) * $this->limit;

        if ($i == $active_page) {
            $html .= "\n<li><span class=\"pagenav active\">$i</span></li>";
        } else {
            if( $link != '') {
                $html .= "\n<li><a href=\"".vmRoute($link.'&limit='.$this->limit.'&limitstart='.$page)."\" class=\"pagenav\">$i</a></li>";
            } else {
                $html .= "\n<li><a href=\"#$i\" class=\"pagenav\" onclick=\"javascript: document.adminForm.limitstart.value=$page; document.adminForm.submit();return false;\">$i</a></li>";
            }
        }

    }

    // next
    if ($stop_loop < $page_count) {

        $page = $active_page * $this->limit;
        $next_text = $VM_LANG->_('PN_NEXT')." &raquo";
        // $next_text = "&nbsp;&gt;&nbsp;";
        if( $link != '') {
            $html .= "\n<li><a href=\"".vmRoute($link.'&limit='.$this->limit.'&limitstart='.$page)."\" class=\"pagenav last\" title=\"".$VM_LANG->_('PN_NEXT')."\"> ".$next_text."</a></li>";
        } else {
            $html .= "\n<li><a href=\"#next\" class=\"pagenav last\" title=\"".$VM_LANG->_('PN_NEXT')."\" onclick=\"javascript: document.adminForm.limitstart.value=$page; document.adminForm.submit();return false;\"> ".$next_text."</a></li>";
        }

    }

    $html .= '</ul>';

    return $html;

}