Красноречивая функция разбивки на страницы в проекте Slim 3 с использованием ветки

Как я могу использовать функцию разбиения на страницы из проекта Eloquent в Slim 3 с помощью twig?

Это в моем контроллере:

$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

Что я должен сделать, чтобы заставить его работать?


person Swarovski    schedule 29.06.2017    source источник


Ответы (3)


Можете ли вы попробовать это:

{{ posts.links }}

Я предполагаю, что links - это геттер, который возвращает ссылки. Если нет, это не сработает, как вы ожидаете.

person Alvin Bunk    schedule 29.06.2017

Во-первых, вам нужно включить в свой проект иллюминацию/разбиение на страницы (это не включено в иллюминацию/базу данных):

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 }}
person Nima    schedule 20.07.2017
comment
Привет, приятно знать, но я сделал свою собственную систему разбиения на страницы. Я не пробовал ваше решение. - person Swarovski; 23.07.2017
comment
Было бы неплохо опубликовать ваше решение, чтобы другие знали, что есть альтернативные способы добиться этого. - person Nima; 24.07.2017
comment
Можно подробнее о Контейнере? - person Oğuz Can Sertel; 24.04.2018
comment
Куда вы добавили этот кусок кода? Я использую тонкий скелет и добавляю его в зависимости, но это мало что меняет. - person ffuentes; 05.07.2018
comment
depwndencies.php — хорошее место для этого. В чем именно проблема с вашим кодом? - person Nima; 05.07.2018

Извини за опоздание :

Я не сохранил проект, не помню точно как, но это: 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>
person Swarovski    schedule 11.08.2017
comment
Хотя теоретически это может ответить на вопрос, было бы предпочтительнее включить сюда основные части ответа и предоставить ссылку для справки . - person GhostCat; 11.08.2017