Welcome Guest, Not a member yet? Register   Sign In
How do I get the number of pagination items in Codeigniter 3?
#1

(This post was last modified: 10-15-2021, 02:50 AM by Ajax30.)

I have been working on an online newspaper/blogging application with CodeIgniter 3.1.8 and Twitter Bootstrap 4.

By default, the posts are paginated and displayed *12 at a time*, at `http://myblog.com/`, `http://myblog.com/?page=2`, and so on.

In the Posts controller (`application\controllers\Posts.php`) I have:

   
PHP Code:
private function _initPagination($path$totalRows$query_string_segment 'page')
    {
        //load and configure pagination 
        $this->load->library('pagination');
        $config['base_url']            base_url($path);
        $config['query_string_segment'] = $query_string_segment;
        $config['enable_query_strings'] = TRUE;
        $config['reuse_query_string']  TRUE;
        $config['total_rows']          $totalRows;
        $config['per_page']            12;

        if($this->Static_model->get_static_data()['has_pager']){
            $config['display_pages'] = FALSE;
$config['first_link'] = FALSE;
$config['last_link'] = FALSE;
$config['prev_tag_open'] = '<li class="prev">';
$config['prev_tag_close'] = '</li>';
$config['next_tag_open'] = '<li class="next">';
$config['next_tag_close'] = '</li>';
        }

        if (!isset($_GET[$config['query_string_segment']]) || $_GET[$config['query_string_segment']] < 1) {
            $_GET[$config['query_string_segment']] = 1;
        }
        $this->pagination->initialize($config);
        
        $limit  
$config['per_page'];
        $offset = ($this->input->get($config['query_string_segment']) - 1) * $limit;
        
        
return array(
            'limit' => $limit,
            'offset' => $offset
        
);
    }
    
    
public function index()
    {
        //call initialization method
        $config $this->_initPagination("/"$this->Posts_model->get_num_rows());
        $data                  $this->Static_model->get_static_data();
        $data['base_url']      base_url("/");
        $data['pages']        $this->Pages_model->get_pages();
        $data['categories']    $this->Categories_model->get_categories();
        $data['search_errors'] = validation_errors();
        
        
//use limit and offset returned by _initPaginator method
        $data['posts'] = $this->Posts_model->get_posts($config['limit'], $config['offset']);
        $this->twig->addGlobal('pagination'$this->pagination->create_links());
        
        
// featured posts
        if ($data['is_featured']) {
            $data['featured'] = $this->Posts_model->featured_posts();
            $this->twig->addGlobal('featuredPosts'"themes/{$data['theme_directory']}/partials/hero.twig");
        }
        
        $this
->twig->display("themes/{$data['theme_directory']}/layout"$data);
    


I am currently working on loading more posts via AJAX. I use the following code to do this:

   
   
Code:
(function($) {
   
        var currentPage = 2;
        var posts = null;
   
        $('.pagination').hide();
   
        $(window).scroll(function() {
            if ($(window).scrollTop() >= $(document).height() - $(window).height() - 25) {
                loadMore();
            }
        });
   
        function loadMore() {
            $.ajax({
                    url: baseUrl + '?page=' + currentPage,
                    type: 'GET',
                    beforeSend: function() {
                        if (typeof posts != 'undefined') {
                            $('.loader').show();
                        }
                    }
                })
                .done(function(data) {
                    $('.loader').hide();
   
                    posts = $(data).find('#postsContainer').html();
   
                    // If there are no more posts, hide loader
                    //  Otherwise, load more posts
                    if (typeof posts == 'undefined') {
                        $('.loader').hide();
                        $('#postsContainer').append('<p class="text-center text-muted">No more posts to load</p>');
                    } else {
                        $('#postsContainer').append(posts);
                        currentPage = currentPage + 1;
                    }
                });
        }
   
    })(jQuery);



The problem

The problem is that the script does not know when `currentPage` equals the last page so, as a result, "No more posts to load" is displayed as many times as I scroll after the last pos has loaded.

I should do something like:

   
Code:
if (currentPage > maxPage) {
     $('#postsContainer').append('<p class="text-center text-muted">No more posts to load</p>');
}


But I do not have the `maxPage` variable.

How do I get the number of pagination items?
Reply
#2

In CI3 it doesn't seems to exist an easy way to get this value from the Pagination library, but if you look at the code, this is how they compute the number of pages:
PHP Code:
// Calculate the total number of pages
 
$num_pages = (int) ceil($this->total_rows $this->per_page); 
CodeIgniter 4 tutorials (EN/FR) - https://includebeer.com
/*** NO support in private message - Use the forum! ***/
Reply




Theme © iAndrew 2016 - Forum software by © MyBB