{"id":34729768,"url":"https://github.com/lampager/lampager-cakephp2","last_synced_at":"2026-05-25T22:04:17.855Z","repository":{"id":57010957,"uuid":"107854611","full_name":"lampager/lampager-cakephp2","owner":"lampager","description":"Rapid pagination for CakePHP 2","archived":false,"fork":false,"pushed_at":"2020-01-12T17:00:46.000Z","size":70,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":7,"default_branch":"master","last_synced_at":"2023-07-15T07:39:30.660Z","etag":null,"topics":["cakephp2","fast","pagination","paginator","php"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/lampager.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-10-22T09:59:16.000Z","updated_at":"2023-07-15T07:39:30.661Z","dependencies_parsed_at":"2022-08-21T15:10:36.824Z","dependency_job_id":null,"html_url":"https://github.com/lampager/lampager-cakephp2","commit_stats":null,"previous_names":[],"tags_count":7,"template":null,"template_full_name":null,"purl":"pkg:github/lampager/lampager-cakephp2","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lampager%2Flampager-cakephp2","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lampager%2Flampager-cakephp2/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lampager%2Flampager-cakephp2/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lampager%2Flampager-cakephp2/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lampager","download_url":"https://codeload.github.com/lampager/lampager-cakephp2/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lampager%2Flampager-cakephp2/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33494793,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-25T14:31:05.219Z","status":"ssl_error","status_checked_at":"2026-05-25T14:31:02.878Z","response_time":57,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cakephp2","fast","pagination","paginator","php"],"created_at":"2025-12-25T02:55:59.703Z","updated_at":"2026-05-25T22:04:17.848Z","avatar_url":"https://github.com/lampager.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n\u003cimg width=\"320\" alt=\"lampager-cakephp2\" src=\"https://user-images.githubusercontent.com/1351893/32145370-967f8572-bd0a-11e7-8324-10854958fd7f.png\"\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n\u003ca href=\"https://travis-ci.com/lampager/lampager-cakephp2\"\u003e\u003cimg src=\"https://travis-ci.com/lampager/lampager-cakephp2.svg?branch=master\" alt=\"Build Status\"\u003e\u003c/a\u003e\n\u003ca href=\"https://coveralls.io/github/lampager/lampager-cakephp2?branch=master\"\u003e\u003cimg src=\"https://coveralls.io/repos/github/lampager/lampager-cakephp2/badge.svg?branch=master\" alt=\"Coverage Status\"\u003e\u003c/a\u003e\n\u003ca href=\"https://scrutinizer-ci.com/g/lampager/lampager-cakephp2/?branch=master\"\u003e\u003cimg src=\"https://scrutinizer-ci.com/g/lampager/lampager-cakephp2/badges/quality-score.png?b=master\" alt=\"Scrutinizer Code Quality\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n# Lampager for CakePHP 2\n\nRapid pagination without using OFFSET\n\n## Requirements\n\n- PHP: ^5.6 || ^7.0\n- CakePHP: ^2.10\n- [lampager/lampager][]: ^0.4\n\n### Note\n\n- For CakePHP 2.x, use lampager/lampager-cakephp2 (this version).\n- For CakePHP 3.x, use [lampager/lampager-cakephp v1.x][].\n- For CakePHP 4.x, use [lampager/lampager-cakephp v2.x][].\n\n## Installing\n\n```bash\ncomposer require lampager/lampager-cakephp2\n```\n\nMove `Plugin/Lampager` to the appropriate directory if necessary.\n\n## Basic Usage\n\nLoad as a plugin. See [How To Install Plugins][] for detail.\n\nPlugin needs to be loaded manually in `app/Config/bootstrap.php`:\n\n```php\n// Be sure to require vendor/autoload.php beforehand.\n// CakePlugin::load() will fail unless autoloader is properly configured.\nCakePlugin::load('Lampager');\n```\n\nNext, add `'Lampager.Lampager'` to your Model class (`AppModel` is preferable):\n\n```php\nclass AppModel extends Model\n{\n    public $actsAs = [\n        'Lampager.Lampager',\n    ];\n}\n```\n\nUse in one or more of the following methods:\n\n- Use in Controller (via `LampagerBehavior`)\n- Use in Model (via `LampagerBehavior`)\n\n### Use in Controller\n\nAt first, your `Model` class must have `'Lampager.Lampager'` enabled. Use in a\nway described in the Cookbook: [Pagination][]. Note the options that are\nspecific to Lampager such as `forward`, `seekable`, or `cursor`.\n\n```php\n/** @var \\Lampager\\PaginationResult $posts */\n$posts = $this-\u003epaginate(Post::class, [\n    // Lampager options\n    'forward' =\u003e true,\n    'seekable' =\u003e true,\n    'cursor' =\u003e [\n        'Post' =\u003e [\n            'id' =\u003e '4',\n            'created' =\u003e '2017-01-01 10:00:00',\n        ],\n    ],\n\n    // PaginatorComponent::settings query\n    'conditions' =\u003e [\n        'Post.type' =\u003e 'public',\n    ],\n    'order' =\u003e [\n        'Post.created' =\u003e 'DESC',\n        'Post.id' =\u003e 'DESC',\n    ],\n    'limit' =\u003e 10,\n]);\n\n$this-\u003eset('posts', $posts);\n```\n\n### Use in Model\n\nAt first, your `Model` class must have `'Lampager.Lampager'` enabled. Simply use\n`Model::find` with `lampager`. The custom find type `lampager` (see\n[Retrieving Your Data][]) works in a way similar to the core find type `all`\nwith additional parameters and post processor enabled.\n\n```php\n/** @var \\Lampager\\PaginationResult $posts */\n$posts = $this-\u003efind('lampager', [\n    // Lampager options\n    'forward' =\u003e true,\n    'seekable' =\u003e true,\n    'cursor' =\u003e [\n        'Post' =\u003e [\n            'id' =\u003e '4',\n            'created' =\u003e '2017-01-01 10:00:00',\n        ],\n    ],\n\n    // Model::find query\n    'limit' =\u003e 10,\n    'order' =\u003e [\n        'Post.modified' =\u003e 'DESC',\n        'Post.created' =\u003e 'DESC',\n        'Post.id' =\u003e 'DESC',\n    ],\n]);\n\nforeach ($posts as $post) {\n    /** @var mixed[][] $post */\n    debug($post['Post']['id']);\n    debug($post['Post']['created']);\n    debug($post['Post']['modified']);\n}\n```\n\n## Classes\n\nSee also: [lampager/lampager][].\n\n| Name                     | Type  | Extends                       | Description                                                                         |\n|:-------------------------|:------|:------------------------------|:------------------------------------------------------------------------------------|\n| `LampagerBehavior`       | Class | ModelBehavior                 | CakePHP behavior which handles `Model::find()` and `PaginatorComponent::paginate()` |\n| `LampagerArrayCursor`    | Class | Lampager\\\\Contracts\\\\`Cursor` | Multi-dimensional array cursor                                                      |\n| `LampagerPaginator`      | Class | Lampager\\\\`Paginator`         | Paginator implementation for CakePHP                                                |\n| `LampagerArrayProcessor` | Class | Lampager\\\\`ArrayProcessor`    | Processor implementation for CakePHP                                                |\n| `LampagerColumnAccess`   | Class |                               | Multi-dimensional array accessor                                                    |\n| `LampagerTransformer`    | Class |                               | CakePHP query genenrator                                                            |\n\n## API\n\nSee also: [lampager/lampager][].\n\nUsing `Model::find()` or `PaginatorComponent::paginate()` is recommended. The\nquery is merged with CakePHP query and passed to `Lampager\\Query`.\n\n### LampagerPaginator::\\_\\_construct()\u003cbr\u003eLampagerPaginator::create()\n\nCreate a new paginator instance. These methods are not intended to be directly\nused in your code.\n\n```php\nstatic LampagerPaginator::create(Model $builder, array $options): static\nLampagerPaginator::__construct(Model $builder, array $options)\n```\n\n### LampagerPaginator::transform()\n\nTransform a Lampager query into a CakePHP query.\n\n```php\nLampagerPaginator::transform(\\Lampager\\Query $query): array\n```\n\n### LampagerPaginator::build()\n\nPerform configure + transform.\n\n```php\nLampagerPaginator::build(array $cursor = []): array\n```\n\n### LampagerPaginator::paginate()\n\nPerform configure + transform + process.\n\n```php\nLampagerPaginator::paginate(array $cursor = []): \\Lampager\\PaginationResult\n```\n\n#### Arguments\n\n- **`(array)`** __*$cursor*__\u003cbr\u003e An associative array that contains `$column =\u003e $value`. It must be **all-or-nothing**.\n  - For the initial page, omit this parameter or pass an empty array.\n  - For the subsequent pages, pass all the parameters. The partial one is not allowed.\n\n#### Return Value\n\ne.g.,\n\n(Default format when using `Model::find()`)\n\n```php\nobject(Lampager\\PaginationResult)#1 (5) {\n  [\"records\"]=\u003e\n  array(3) {\n    [0]=\u003e\n    array(1) {\n      [\"Post\"]=\u003e\n      array(3) { ... }\n    }\n    [1]=\u003e\n    array(1) {\n      [\"Post\"]=\u003e\n      array(3) { ... }\n    }\n    [2]=\u003e\n    array(1) {\n      [\"Post\"]=\u003e\n      array(3) { ... }\n    }\n  }\n  [\"hasPrevious\"]=\u003e\n  bool(false)\n  [\"previousCursor\"]=\u003e\n  NULL\n  [\"hasNext\"]=\u003e\n  bool(true)\n  [\"nextCursor\"]=\u003e\n  array(1) {\n    [\"Post\"]=\u003e\n    array(2) {\n      [\"id\"]=\u003e\n      string(1) \"3\"\n      [\"created\"]=\u003e\n      string(19) \"2017-01-01 10:00:00\"\n    }\n  }\n}\n```\n\n### LampagerTransformer::\\_\\_construct()\n\nCreate a new transformer instance. This class is not intended to be directly\nused in your code.\n\n```php\nLampagerTransformer::__construct(Model $builder, array $options)\n```\n\n## Examples\n\nThis section describes the practial usages of lampager-cakephp2.\n\n### Use in Controller\n\nThe example below shows how to accept a cursor parameter from a request and\npass it through `PaginatorComponent::settings`. Be sure that your `Model` class\nhas `'Lampager.Lampager'` enabled.\n\n```php\nclass PostsController extends AppController\n{\n    public function index()\n    {\n        // Get cursor parameters\n        $previous = $this-\u003erequest-\u003eparam('named.previous_cursor');\n        $next = $this-\u003erequest-\u003eparam('named.next_cursor');\n\n        $this-\u003ePaginator-\u003esettings = [\n            // Lampager options\n            // If the previous_cursor is not set, paginate forward; otherwise backward\n            'forward' =\u003e !$previous,\n            'cursor' =\u003e $previous ?: $next ?: [],\n            'seekable' =\u003e true,\n\n            // PaginatorComponent::settings query\n            'conditions' =\u003e [\n                'Post.type' =\u003e 'public',\n            ],\n            'order' =\u003e [\n                'Post.created' =\u003e 'DESC',\n                'Post.id' =\u003e 'DESC',\n            ],\n            'limit' =\u003e 10,\n        ];\n\n        /** @var \\Lampager\\PaginationResult $posts */\n        $posts = $this-\u003ePaginator-\u003epaginate(Post::class);\n        $this-\u003eset('posts', $posts);\n    }\n}\n```\n\nAnd the pagination links can be output as follows:\n\n```php\n// If there is a previous page, print pagination link\nif ($posts-\u003ehasPrevious) {\n    echo $this-\u003eHtml-\u003elink('\u003c\u003c Previous', [\n        'controller' =\u003e 'posts',\n        'action' =\u003e 'index',\n        'previous_cursor' =\u003e $posts-\u003epreviousCursor,\n    ]);\n}\n\n// If there is a next page, print pagination link\nif ($posts-\u003ehasNext) {\n    echo $this-\u003eHtml-\u003elink('Next \u003e\u003e', [\n        'controller' =\u003e 'posts',\n        'action' =\u003e 'index',\n        'next_cursor' =\u003e $posts-\u003enextCursor,\n    ]);\n}\n```\n\n## Supported database engines\n\n### MySQL, MariaDB, PostgreSQL, and SQLite\n\nSupported!\n\n### Microsoft SQL Server\n\nNot supported.\n\n[lampager/lampager]:              https://github.com/lampager/lampager\n[lampager/lampager-cakephp v1.x]: https://github.com/lampager/lampager-cakephp/tree/v1.x\n[lampager/lampager-cakephp v2.x]: https://github.com/lampager/lampager-cakephp\n[How To Install Plugins]:         https://book.cakephp.org/2/en/plugins/how-to-install-plugins.html\n[Pagination]:                     https://book.cakephp.org/2/en/core-libraries/components/pagination.html\n[Retrieving Your Data]:           https://book.cakephp.org/2/en/models/retrieving-your-data.html#creating-custom-find-types\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flampager%2Flampager-cakephp2","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flampager%2Flampager-cakephp2","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flampager%2Flampager-cakephp2/lists"}