Пагинация для записей блога на Nette
В качестве продолжения статьи Создание блога на Nette реализуем пагинацию в нашем блоге на фреймворке Nette.
Подготовка⚓︎
Прежде всего переименуем класс PostFacade в PostRepository, а его метод getPublicArticles — в findPublishedPosts:
<?php
namespace App\Model;
use Nette\SmartObject;
use Nette\Database\Explorer;
use Nette\Database\Table\Selection;
use DateTime;
final class PostRepository
{
use SmartObject;
private Explorer $database;
public function __construct(Explorer $database)
{
$this->database = $database;
}
public function findPublishedPosts(): Selection
{
return $this->database
->table('posts')
->where('created_at < ', new DateTime)
->order('created_at DESC');
}
}
Кроме того, обновим наш config/services.neon:
Обновление презентера⚓︎
Затем внесём изменения в метод renderDefault в презентере HomepagePresenter:
<?php
declare(strict_types=1);
namespace App\Presenters;
use App\Model\PostRepository;
use Nette\Application\UI\Presenter;
final class HomepagePresenter extends Presenter
{
private PostRepository $repository;
public function __construct(PostRepository $repository)
{
$this->repository = $repository;
}
public function renderDefault(int $page = 1): void
{
// Найдем опубликованные записи
$posts = $this->repository->findPublishedPosts();
// и их часть, ограниченную вычислением метода page, которую мы передадим в шаблон
$lastPage = 0;
$this->template->posts = $posts->page($page, 10, $lastPage);
// а также необходимые данные для отображения опций пагинации
$this->template->page = $page;
$this->template->lastPage = $lastPage;
}
}
Обновление шаблона⚓︎
Осталось добавить ссылки пагинации в шаблон app\Presenters\templates\Homepage\default.latte:
{block content} ...
<div class="pagination">
{if $page > 1}
<a n:href="default, 1">Первая</a>
|
<a n:href="default, $page - 1">Предыдущая</a>
| {/if} Страница {$page} из {$lastPage} {if $page < $lastPage} |
<a n:href="default, $page + 1">Следующая</a>
|
<a n:href="default, $lastPage">Последняя</a>
{/if}
</div>
Если вы не видите изменений на главной странице, добавьте побольше записей.
Таким образом, мы реализовали механизм пагинации без использования пагинатора.
Материал, использованный для статьи⚓︎
- Paginating Database Results (English)