CodeIgniter Forums
codeigniter pagination: it shows the correct result until page 2 or 3 - Printable Version

+- CodeIgniter Forums (https://forum.codeigniter.com)
+-- Forum: Using CodeIgniter (https://forum.codeigniter.com/forumdisplay.php?fid=5)
+--- Forum: General Help (https://forum.codeigniter.com/forumdisplay.php?fid=24)
+--- Thread: codeigniter pagination: it shows the correct result until page 2 or 3 (/showthread.php?tid=62539)



codeigniter pagination: it shows the correct result until page 2 or 3 - codeigniter1932 - 07-26-2015

I create a pagination with codeigniter

first i take the category id ($id) to display the related post to that category, and because the menu can has the subcategories i make the id list in an array to select post from that array: this is my

controller:

 
Code:
 function index($id=null){

   $this->load->model('category_model');
   $id_list = $this->category_model->all_category_ids($id);

   $id_list .= $id;
   $id_list = explode(',',$id_list);

   $config['base_url']= base_url()."/category/index/".$id."/page/";
   $config['total_rows'] = $this->category_model->total_category($id_list);
   $config['per_page'] = 2;
   $config['uri_segment'] = 5;
   $config['use_page_numbers'] = TRUE;    

   $this->load->library('pagination');
   $this->pagination->initialize($config);
   $pagination = $this->pagination->create_links();
   $page = ($this->uri->segment(5))?$this->uri->segment(5):0;


   $this->load->model('category_model');  
   $single_category = $this->category_model->select_category($id,$config['per_page'],$page,$id_list);

   $this->load->model('category_model');
   $all_category = $this->category_model->all_category();
   $multi_category = $this->category_model->build_multi_menu($all_category,0);        

   $data = array(
       'single_category' => $single_category,
       'multi_category' => $multi_category,
       'pagination' => $pagination
   );

   $this->template->load('category/index',$data);
}

and this is my model file: Category_model.php


Code:
function __construct(){

   parent::__construct();  

}

function all_category(){

   return $this->db->get('category')->result_array();

}

function has_children($rows, $id) {
foreach ($rows as $row) {
   if ($row['parent_id'] == $id) {
       return true;
   }
}
return false;
}

function build_multi_menu($rows, $parent = 0) {
   $result = "<ul>";
   foreach ($rows as $row) {
       if ($row['parent_id'] == $parent) {
           $id = $row['id'];
           $url = base_url();
           $result .= "<li><a href=\"$url"."category/index/$id\">{$row['category']}</a>";
           if ($this->has_children($rows, $row['id'])) {
               $result .= $this->build_multi_menu($rows, $row['id']);
           }
           $result .= "</li> \n";
       }
   }
   $result .= "</ul> \n";
   return $result;
}

function select_category($id,$limit,$start,$id_list){


   $this->db->select('*');
   $this->db->from('products');
   $this->db->join('category_post','products.id=category_post.post_id');
   $this->db->where_in('category_post.category_id',$id_list);
   $var = $this->db->limit($limit,$start)->get()->result_array();

   $var2 = array();
   foreach($var as $value){
       $postid = $value['post_id'];
       if(!in_array($value['post_id'],$var2)){

               $var2[$postid] = array(
                   'id'=> $value['post_id'],
                   'title' => $value['title'],
                   'abstract' => $value['abstract'],
                   'full-text' => $value['full-text'],
                   'price' => $value['price'],
                   'real-price' => $value['real-price'],
                   'image-name' => $value['image-name'],
                   'category_id' => $value['category_id'],
               );

       }
   }
   return $var2;
   /*echo"<pre>";
   print_r($var2);
   exit();*/

}

function total_category($id_list){

   $this->db->select('*');
   $this->db->from('products');
   $this->db->join('category_post','products.id=category_post.post_id');
   $this->db->where_in('category_post.category_id',$id_list);
   $var = $this->db->get()->result_array();

   $var2 = array();
   foreach($var as $value){
       $postid = $value['post_id'];
       if(!in_array($value['post_id'],$var2)){

               $var2[$postid] = array(
                   'id'=> $value['post_id'],
                   'title' => $value['title'],
                   'abstract' => $value['abstract'],
                   'full-text' => $value['full-text'],
                   'price' => $value['price'],
                   'real-price' => $value['real-price'],
                   'image-name' => $value['image-name']
               );

       }
   }

   $c = count($var2);
   return $c;


}


function all_category_ids($level = 0) {
   $rows = $this->db
       ->select('id,category,parent_id')
       ->where('parent_id', $level)
       ->order_by('id','asc')
       ->get('category')
       ->result();
   $id_list = null;

   if (count($rows) > 0) {

       foreach ($rows as $row) {
           $id_list .= $row->id.",";
           // Append subcategories
           $id_list .= $this->all_category_ids($row->id);
       }
   }
   return $id_list;
}


it works fine to page 2 or 3, from that page it mixed up the result and some times repeats the page 3

I really confused. I appreciate any help


RE: codeigniter pagination: it shows the correct result until page 2 or 3 - mwhitney - 07-27-2015

When you set use_page_numbers to TRUE, you need to calculate the offset to be used by your model. You're just passing the page number in as the offset, which would work if you only show 1 item per page (except that your first page would probably skip the first result). If you assume in your model that you're going to receive a page number instead of an offset, you could probably $this->db->limit($limit, ($start - 1) * $limit) instead of $this->db->limit($limit, $start). Depending on how you're separating your responsibilities between model and controller, though, you may want to do the calculation in the controller, instead.