Красноречивая функция пагинации в проекте Slim 3 с использованием веточки
Как я могу использовать функцию paginate из проекта Eloquent в Slim 3, используя веточку?
Это в моем контроллере:
$posts = Sound::paginate(2);
$this->container->view->render($response, 'admin/sounds/index.twig', [
'posts' => $posts
]);
Это мнение:
{{ posts.links() }}
Но это не работает так, как я ожидал:
Warning: call_user_func() expects parameter 1 to be a valid callback, no array or string given in **PATH_TO_PROJECT**\vendor\illuminate\pagination\AbstractPaginator.php on line 412
Fatal error: Call to a member function make() on null in **PATH_TO_PROJECT**\vendor\illuminate\pagination\LengthAwarePaginator.php on line 90
Что я должен сделать, чтобы это работало?
3 ответа
Извини за опоздание:
Я не сохранил проект, я не помню точно, как я сделал, но это: https://github.com/romanzipp/PHP-Slim-Pagination выглядит так, как я сделал.
$app->get('/posts', function(Request $req, Response $res, $args = []) use ($cache) {
$page = ($req->getParam('page', 0) > 0) ? $req->getParam('page') : 1;
$limit = 5; // Number of posts on one page
$skip = ($page - 1) * $limit;
$count = Post::getCount([]); // Count of all available posts
return $this->view->render($res, 'post-list.twig', [
'pagination' => [
'needed' => $count > $limit,
'count' => $count,
'page' => $page,
'lastpage' => (ceil($count / $limit) == 0 ? 1 : ceil($count / $limit)),
'limit' => $limit,
],
// return list of Posts with Limit and Skip arguments
'posts' => Post::getList([
'limit' => $limit,
'skip' => $skip,
])
]);
});
В шаблоне:
{% if pagination.needed %}
<div class="ui pagination menu">
{% for i in 1..pagination.lastpage %}
<a class="{% if i == pagination.page %}active{% endif %} item" href="?page={{ i }}">{{ i }}</a>
{% endfor %}
</div>
{% endif %}
<div class="ui container">
{% for post in posts %}
<a class="item">
{# Post contents (title, url, ...) #}
</a>
{% endfor %}
</div>
Во-первых, вам нужно включить подсветку / пагинацию в ваш проект (он не включен в подсветку / базу данных):
composer require illuminate/pagination
Теперь paginator должен знать, как разрешить текущую страницу. Вы должны убедиться, что это сделано, прежде чем использовать paginator, я лично поставил его там, где я устанавливаю зависимости:
// $container is application's DIC container.
// Setup Paginator resolvers
Illuminate\Pagination\Paginator::currentPageResolver(function ($pageName = 'page') use ($container) {
$page = $container->request->getParam($pageName);
if (filter_var($page, FILTER_VALIDATE_INT) !== false && (int) $page >= 1) {
return $page;
}
return 1;
});
Затем в вашем шаблоне ветки вы можете выводить ссылки на страницы. Но, пожалуйста, обратите внимание, что paginator генерирует некоторый HTML-код, который должен быть записан для вывода как есть, поэтому вам нужно указать twig игнорировать экранирование для ссылок:
{{ posts.links | raw }}
Можете ли вы попробовать это:
{{ posts.links }}
Я предполагаю что links
является получателем, который возвращает ссылки. Если нет, это не сработает, как вы ожидаете.