PHPackages                             sqrt-pro/navigator - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Framework](/categories/framework)
4. /
5. sqrt-pro/navigator

ActiveLibrary[Framework](/categories/framework)

sqrt-pro/navigator
==================

Navigator is part of SQRT Framework

0.0.1(11y ago)01.3k1MITPHPPHP &gt;=5.3.0

Since May 20Pushed 11y ago2 watchersCompare

[ Source](https://github.com/sqrt-pro/Navigator)[ Packagist](https://packagist.org/packages/sqrt-pro/navigator)[ Docs](http://fw.sqrt.pro)[ RSS](/packages/sqrt-pro-navigator/feed)WikiDiscussions master Synced 1mo ago

READMEChangelogDependencies (3)Versions (3)Used By (1)

SQRT\\Navigator
===============

[](#sqrtnavigator)

Компонент позволяет автоматизировать или упростить работу с пагинацией, сортировкой и фильтрацией списка элементов.

Работа начинается с инициализации объекта Navigator с передачей в него объектов Request и Manager.

`$navi = new Navigator($request, $manager);`

Пагинация
---------

[](#пагинация)

Объект Navigator предоставляет набор методов, для получения первой, последней, следующей, предыдущей страниц, а также быстрой генерации объектов URL для них.

```
$navi->getPage(); // получение номера текущей страницы
$navi->getFirstPage(); // номер первой страницы
$navi->getLastPage(); // номер последней страницы
$navi->getNextPage(); // следующая страница от текущей
$navi->getPrevPage(); // предыдущая страница от текущей
```

По аналогии, для всех методов есть возможность получить готовый объект URL:

```
$navi->getPageUrl(42); // URL с номером страницы 42
$navi->getFirstPageUrl(); // URL с первой страницей
```

Функционал постраничности требует, чтобы у Navigator было известно общее количество элементов в выборке и указано количество элементов на странице.

```
$navi->setOnpage(10); // Указываем количество элементов на странице
$navi->setTotal(42); // Указываем количество элементов в выборке
echo $navi->getTotalPages(); // Результат - количество страниц: 5
```

Сортировка
----------

[](#сортировка)

Navigator позволяет задать допустимые варианты сортировки, а также сформировать ссылки на прямую и обратную сортировку.

```
$navi = new Navigator($request, new URL('hello'));
$navi->addOrderBy('id'); // Именование и в БД, и в URL совпадает
$navi->addOrderBy('total', 'Количество', 'count(*)'); // В URL будет параметр вида orderby:total, в SQL `count(*)`
```

После добавления можно получить полный список вариантов сортировки, или отдельные пункты, для формирования списков опций или ссылок в интерфейсе. Каждый вариант сортировки - это объект OrderBy:

```
$o = $navi->getOrderByOption('total'); // Получили объект
$o->asUrlParameter(); // Значение для подстановки в URL: total - сортировка по-возрастанию
$o->asUrlParameter(false); // _total - сортировка по убыванию
$o->asSQL(); // SQL выражение для сортировки, в данном случае count(*) ASC
$o->asUrl(); // Объект URL
```

Если в адресе содержится параметр сортировки, например `.../orderby:_total/`, можно получить текущий порядок для сортировки:

```
$navi->getOrderBy();
```

Если адрес не содержит выбора для сортировки, метод вернет `false` или способ сортировки по-умолчанию, если он был указан с помощью метода `$navi->setDefaultOrderBy()`.

Выборка элементов, подсчет количества записей
---------------------------------------------

[](#выборка-элементов-подсчет-количества-записей)

Navigator может сразу обрабатывать данные о сортировке, фильтрах и пагинации, применять их и получать кол-во элементов в выборке, автоматически расчитывать количество страниц и выдавать соответствующие этим настройкам объекты.

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

```
$navi->setCollection('Users'); // Указываем, что используем коллекцию Users
$navi->getTotal(); // Получение общего количества элементов в выборке
$navi->setOnpage(10); // Указываем количество элементов на странице
$navi->getItems(); // Получаем нужный набор элементов, с учетом сортировки и текущей страницы
$navi->each($callable); // Применение $callable к текущей выборке элементов
```

Фильтрация
----------

[](#фильтрация)

Механизм фильтрации работает с помощью назначения фильтров - объектов Filter. Базово предусмотрено три фильтра - Equal, Between и Like, выполняющие фильтрацию по прямому соответствию, выборке диапазона и условию LIKE. При необходимости реализации более сложной логики можно добавлять произвольные фильтры с использованием анонимных функций или создавать свои фильтры наследуясь от класса Filter.

Все фильтры добавляют новые условия (Объект `SQRT\DB\Conditions`) для последующей выборки. Можно задать условия по-умолчанию:

```
$navi
  ->conditions(true) // Флаг true указывает что это условия по-умолчанию
  ->equal('type', 'new')
  ->greaterOrEqual('age', 18);
```

Или добавить динамические фильтры:

```
$navi->addFilterEqual('one', 'is_numeric'); // Валидация может выполняться с помощью callable-выражений
$navi->addFilterEqual('two', '/^[a-z]+$/'); // Валидация может выполняться регулярными выражениями
$navi->addFilterBetween('date'); // На свой страх и риск можно обойтись и без валидации
$navi->addFilter(
  'some',
   null,
  function(Navigator $navi, Filter $filter) {
    if ($val = $filter->getCleanValue()) {
        $navi->conditions()->expr('... some complicated expression ...');
    }
  }
); // Произвольный фильтр
```

После формирования набора правил, фильтр можно использовать для автоматической обработки запросов и получения "чистых данных" из URL:

```
// .../one:42/
echo $navi->getFilter('one')->getCleanValue(); // Результат: 42

// .../one:two/
echo $navi->getFilter('one')->getCleanValue(); // Результат: false
```

Либо можно получать уже сформированный набор Conditions для SQL запросов с помощью метода `processFilters()`.

Callback, указываемый в фильтре, позволяет автоматизировать создание условий для выборки. В функцию передаются как аргументы объекты Navigator и Filter. После проверки и обработки данных, Callback-функция должна подготовить условие выборки и передать его в Navigator с помощью метода `conditions()`.

Таким образом, в результате работы всех фильтров, получается готовый набор условий, который можно использовать вручную или автоматически в методах `getItems()` и `countTotal()`.

Изначально предусмотренные фильтры Equal, Between и Like являются наиболее часто используемыми вариантами:

- **Equal:** прямое соответствие field = value
- **Between:** значение должно быть в диапазоне field &gt;= column\_from и field &lt;= column\_to
- **Like:** генерирует условие \[column\] LIKE "\[value\]%"

Для вышеописанного набора правил, URL и результат будет следующим:

```
URL: /hello/one:1/two:three/date_from:01.01.2014/date_to:31.12.2014/
Результат: `one`=1 AND `two`="three AND `date` >= "01.01.2014" AND `date`  1, 'two' => 2, 'test'=>'me'));
$navi->addFilterEqual('one');
$navi->addFilterEqual('two');
$navi->setPage(42);
echo $navi->getUrlClean()->toString(); // /hello/one:1/two:2/page:42/
```

Генерация элементов интерфейса
------------------------------

[](#генерация-элементов-интерфейса)

Для сортировки и фильтрации, кроме возможности просто получить объект URL, также предусмотрены методы для формирования HTML элементов интерфейса. Фильтры будут рендериться с текущими значениями фильтров и сортировки, с учетом валидности этих данных.

Для генерации SELECT:

```
$navi->getOrderByAsSelect(); // Генерация тега  с полным списком опций
```

Для фильтров предусмотрена возможность сгенерировать поле ввода INPUT или SELECT, если у него указаны опции выбора `$f->setOptions(array(...))`:

```
$f = $navi->getFilter('one'); // Получаем объект Filter
$f->asInput(); // Генерация тега
$f->asSelect(); // Генерация тега  с полным списком опций
```

###  Health Score

25

—

LowBetter than 37% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity14

Limited adoption so far

Community10

Small or concentrated contributor base

Maturity49

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~0 days

Total

2

Last Release

4016d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/b13b6471e4cd370ac559ab9c2616d4518c1552d91aa7685cfceedae0e61396e1?d=identicon)[sqrt-pro](/maintainers/sqrt-pro)

---

Top Contributors

[![cmsx](https://avatars.githubusercontent.com/u/2027189?v=4)](https://github.com/cmsx "cmsx (11 commits)")

### Embed Badge

![Health badge](/badges/sqrt-pro-navigator/health.svg)

```
[![Health](https://phpackages.com/badges/sqrt-pro-navigator/health.svg)](https://phpackages.com/packages/sqrt-pro-navigator)
```

###  Alternatives

[laravel/framework

The Laravel Framework.

34.6k509.9M17.0k](/packages/laravel-framework)[symfony/framework-bundle

Provides a tight integration between Symfony components and the Symfony full-stack framework

3.6k235.4M9.7k](/packages/symfony-framework-bundle)[laravel/reverb

Laravel Reverb provides a real-time WebSocket communication backend for Laravel applications.

1.5k9.4M48](/packages/laravel-reverb)[shopware/platform

The Shopware e-commerce core

3.3k1.5M3](/packages/shopware-platform)[drupal/core

Drupal is an open source content management platform powering millions of websites and applications.

19462.3M1.3k](/packages/drupal-core)[sulu/sulu

Core framework that implements the functionality of the Sulu content management system

1.3k1.3M152](/packages/sulu-sulu)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
