motokraft/pagination

Pagination by page using html-element

v1.0.2 2022-07-01 15:23 UTC

This package is not auto-updated.

Last update: 2024-05-15 12:57:29 UTC


README

Package version Total Downloads PHP Version Repository Size License

Установка

Библиотека устанавливается с помощью пакетного менеджера Composer

Добавьте библиотеку в файл composer.json вашего проекта:

{
    "require": {
        "motokraft/pagination": "^1.0"
    }
}

или выполните команду в терминале

$ php composer require motokraft/pagination

Включите автозагрузчик Composer в код проекта:

require __DIR__ . '/vendor/autoload.php';

Привер класса вывода пагинации

use \Motokraft\HtmlElement\HtmlElement;
use \Motokraft\Pagination\Renderer\BaseRenderer;
use \Motokraft\Pagination\Renderer\RendererInterface;
use \Motokraft\Uri\Uri;

class DemoPagination extends BaseRenderer implements RendererInterface
{
    function render(HtmlElement $element) : HtmlElement
    {
        $result = $element->appendCreateHtml('div', [
            'class' => 'category-pagination-inner'
        ]);

        // Вывод счетчика навигации
        $this->renderCounter($result);

        // Вывод контейнера навигация
        $this->renderPagination($result);

        return $result;
    }

    private function renderCounter(HtmlElement $element)
    {
        $padding = $this->getPagination();

        $div = $element->appendCreateHtml('div', [
            'class' => 'pagination-legend-inner'
        ]);

        $total = $padding->getTotal();
        $limitstart = $padding->getLimitStart();
        $limit = $padding->getLimit();
        $toResult = $total;

        if (($limitstart + $limit) < $total)
        {
            $toResult = $limitstart + $limit;
        }

        if ($total > 0)
        {
            $div->html(sprintf(
                'Showing %s to %s of %s entries',
                ($limitstart + 1), $toResult, $total
            ));
        }
        else
        {
            $div->html('No matching records found');
        }
    }

    private function renderPagination(HtmlElement $element)
    {
        $uri = clone Uri::getInstance();

        $nav = $element->appendCreateHtml('nav', [
            'class' => 'pagination-nav-inner'
        ]);

        // Кнопка 'В начало'
        $first = $this->_prepareFirstItem();
        $first = $first->render($nav, clone $uri);

        $first->addClass('nav-item-inner');
        $first->addAttrAria('label', 'First');

        // Кнопка 'Назад'
        $prev = $this->_preparePrevItem();
        $prev = $prev->render($nav, clone $uri);

        $prev->addClass('nav-item-inner');
        $prev->addAttrAria('label', 'Prev');

        foreach($this->_getPages() as $page)
        {
            // Нумерация страниц
            $page = $page->render($nav, clone $uri);
            $page->addClass('nav-item-inner');
        }

        // Кнопка 'Вперед'
        $next = $this->_prepareNextItem();
        $next = $next->render($nav, clone $uri);

        $next->addClass('nav-item-inner');
        $next->addAttrAria('label', 'Next');

        // Кнопка 'В конец'
        $last = $this->_prepareLasttItem();
        $last = $last->render($nav, clone $uri);

        $last->addClass('nav-item-inner');
        $last->addAttrAria('label', 'Last');
    }
}

Примеры инициализации

use \Motokraft\Pagination\Pagination;
use \Motokraft\HtmlElement\HtmlElement;

// Добавляем класс из примера выще
Pagination::addRenderer('demo', DemoPagination::class);

$div = new HtmlElement('div');

$pagination = new Pagination(367, 0, 10, 9);
$pagination->render($div, 'demo');

echo $div;

Полученный результат

<div data-level="0">
    <div class="category-pagination-inner" data-level="1">
        <div class="pagination-legend-inner" data-level="2">
            Showing 1 to 10 of 367 entries
        </div>
        <nav class="pagination-nav-inner" data-level="2">
            <span class="disabled page-first nav-item-inner" aria-label="First" data-level="3"></span>
            <span class="disabled page-prev nav-item-inner" aria-label="Prev" data-level="3"></span>
            <span class="active nav-item-inner" data-level="3">
                1
            </span>
            <a href="/pagination.php?page=2" class="nav-item-inner" data-level="3">
                2
            </a>
            <a href="/pagination.php?page=3" class="nav-item-inner" data-level="3">
                3
            </a>
            <a href="/pagination.php?page=4" class="nav-item-inner" data-level="3">
                4
            </a>
            <a href="/pagination.php?page=5" class="nav-item-inner" data-level="3">
                5
            </a>
            <a href="/pagination.php?page=6" class="nav-item-inner" data-level="3">
                6
            </a>
            <a href="/pagination.php?page=7" class="nav-item-inner" data-level="3">
                7
            </a>
            <a href="/pagination.php?page=8" class="nav-item-inner" data-level="3">
                8
            </a>
            <a href="/pagination.php?page=9" class="nav-item-inner" data-level="3">
                9
            </a>
            <a href="/pagination.php?page=2" class="page-next nav-item-inner" aria-label="Next" data-level="3"></a>
            <a href="/pagination.php?page=37" class="page-last nav-item-inner" aria-label="Last" data-level="3"></a>
        </nav>
    </div>
</div>

Лицензия

Эта библиотека находится под лицензией MIT License.