Красноречивая функция пагинации в проекте 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 является получателем, который возвращает ссылки. Если нет, это не сработает, как вы ожидаете.

Другие вопросы по тегам