CodeIgniter Pagination is not working - codeigniter

I set the CodeIgniter pagination's attributes but I am getting an error.
1 2 3 4 5 >
My pagination is working on pages 2-5 except page number 1. I do not realizing why it's happening. Here is my controller function where controller name is c_forum.
function show_posts_by_chapter($id_chapter=false) {
if($id_chapter==false)
show_404();
$config = array();
$config["base_url"] = base_url() . "index.php/c_forum/show_posts_by_chapter/" . $id_chapter.'/';
$config['total_rows'] = $this->m_forum->num_rows_by_chapter($id_chapter);
$config['per_page'] = 2;
$configp['uri_segment'] = 4;
$choice = $config["total_rows"] / $config["per_page"];
$config["num_links"] = round($choice);
$this->pagination->initialize($config);
$page = ($this->uri->segment(4)) ? $this->uri->segment(4) : 0;
$data['chapter_id'] = $id_chapter;
$data['allowed'] = $this->_get_level();
$data['count_rows'] = $config['total_rows'];
$data['posts_all'] = $this->m_forum->get_posts_by_chapter($config['per_page'], $page, $id_chapter);
$data['links'] = $this->pagination->create_links();
$this->load->view('forum/show_posts', $data);
}
View is simple :
`<?php echo $links; ?>`
Got answe: I used $configp['uri_segment'] = 4; and it should be $config['uri_segment'] = 4;

$configp['uri_segment'] = 4;
This should be
$config['uri_segment'] = 4;

Related

codeigniter pagination: links are working but the records are repeated on other pages

Can anyone please help me? I am trying to paginate my table. all links are working, but the items are repeated on other pages. I tried similar questions on here, but nothing is working.
function index($type="deposit", $limit_from=0)
{
$limit_from = ($this->uri->segment(4)) ? $this->uri->segment(4) : 0;
$total_records = $this->Expense->get_total_rows($type);
$data['controller_name'] = $this->get_controller_name();
$lines_per_page = 3;
$data[$type.'s'] = $this->Expense->get_records($lines_per_page, $limit_from, $type);
$config['base_url'] = base_url('index.php/expenses/index/'.$type);
$config['total_rows'] = $total_records;
$config['per_page'] = 3;
$config["uri_segment"] = 4;
// $choice = $total_records / $config['per_page'];
// $config['num_links'] = round($choice);
$config['use_page_numbers'] = TRUE;
$config['first_url'] = base_url('index.php/expenses/index/'.$type.'/1');
$this->pagination->initialize($config);
$data["links"] = $this->pagination->create_links();
$this->load->view('expenses/'.$type, $data);
$this->_remove_duplicate_cookies();
}
Thank you all. I got it to work: below is what I finally did and it is working great!
function index($type="deposit", $sort_by='deposit_date', $sort_order='asc', $page_limit=0)
{
$data['controller_name'] = $this->get_controller_name();
$config = array();
$config['base_url'] = site_url("expenses/index/$type/$sort_by/$sort_order");
$config['total_rows'] = $this->Expense->get_total_rows($type);
$config['per_page'] = 4;
$config["uri_segment"] = 6;
$data['num_rows'] = $config['total_rows'];
$data['type'] = $type;
$this->pagination->initialize($config);
$page = ($this->uri->segment(6)) ? $this->uri->segment(6) : 0;
$data[$type.'s'] = $this->Expense->get_records($config["per_page"], $page, $type, $sort_by, $sort_order);
$data["links"] = $this->pagination->create_links();
$data['headers'] = $this->Expense->table_headers($type);
$data['sort_by'] = $sort_by;
$data['sort_order'] = $sort_order;
$this->load->view('expenses/'.$type, $data);
$this->_remove_duplicate_cookies();
}

codeigniter pagination with uri routing

My controller is flex and my function name is post_blog. I have done the routing for this function $config['blog'] = 'flex/post_blog'. Till this everything is working fine. I added pagination for the page which is loaded by above function and my $config['base_url'] = 'blog'. Everything is fine on my first page but on the second page it is showing page not found.
How do I solve this problem?
$this->load->library('pagination');
if($this->uri->segment(2)){
$page = ($this->uri->segment(2)) ;
}
else{
$page = 1;
}
$config = array();
$config['base_url'] = base_url('blog');
$config['total_rows'] = $post_count;
$config['per_page'] = 15;
$config['num_links'] = 2;
$config['use_page_numbers'] = TRUE;
$config['cur_tag_open'] = ' <a class="current"><b>';
$config['cur_tag_close'] = '</b></a>';
$config['next_link'] = 'Next';
$config['prev_link'] = 'Previous';
$offset=(($page-1)*$config["per_page"]) ;
$this->pagination->initialize($config);
$str_links = $this->pagination->create_links();
$data['links'] = explode(' ',$str_links );
Try
$config['base_url'] = base_url('controller_name/blog');
$config['uri_segment'] = 3;
Also remove echo $page;exit;
Try Changing $config['num_links'] = 2; to $config['num_links'] = $post_count;

Can't display all item if order by field nama

I have model code function in Codeigniter like below, if me sort order by RAND() can display all item but if order by field name like part_no can't display all item, in next page same display with page 1.
Model
function listProductPerCategory($id, $limit, $start){
$this->db->select('
category.id, category.category, product.id, product.id_category,
product.name, product.picture, product.description, product.permalink, product.part_no
');
$this->db->join('category', 'product.id_category = category.id');
$this->db->where('product.id_category', $id);
$this->db->order_by('product.part_no');
$this->db->limit($limit, $start);
$query = $this->db->get($this->tableProduct);
return $query->result();
}
Controller
function listcategory($page = NULL) {
$id = $this->input->get('list');
$data['categoryHead'] = $this->M_home->listCategory();
$this->load->view('frontend/template/header', $data);
$data['productsLast'] = $this->M_home->listProductLast();
$data['productsLast2'] = $this->M_home->listProductLast2();
$data['category'] = $this->M_home->listCategory();
//paging
$config['base_url'] = base_url('categoryproduct'.'?'.http_build_query($_GET));
$config['total_rows'] = $this->M_home->listProductPerCategory_num_rows($id);
$config['per_page'] = $per_page = 12;
$config['uri_segment'] = 2;
$config['first_link'] = 'First';
$config['last_link'] = 'Last';
$config['next_link'] = 'Next';
$config['prev_link'] = 'Prev';
$config['page_query_string'] = TRUE;
//end paging
$this->pagination->initialize($config);
$data['paging'] = $this->pagination->create_links();
$page = ($this->uri->segment(2)) ? $this->uri->segment(2) : 0;
$data['listCategory'] = $this->M_home->listProductPerCategory($id, $per_page, $page);
$this->load->view('frontend/category', $data);
$this->load->view('frontend/template/footer');
}
You have understand that
In SQL LIMIT, start is starting number of record not PAGE.
But from what you passing to listProductPerCategory is page number
So from page 1 to page 2 it is only one record move on next page not 12 records.
So you need to fix in function listProductPerCategory (dont forget to change variable name which may you confuse yourself , change $start -> $page)
So you should get this as below
function listProductPerCategory($id, $limit, $page){
if($page < 1){
$page = 1;
}
if($page > 1){
$start = $limit * $page;
}else{
$start = 0;
}
$this->db->select('
category.id, category.category, product.id, product.id_category,
product.name, product.picture, product.description, product.permalink, product.part_no
');
$this->db->join('category', 'product.id_category = category.id');
$this->db->where('product.id_category', $id);
$this->db->order_by('product.part_no');
$this->db->limit($limit, $start);
$query = $this->db->get($this->tableProduct);
return $query->result();
}
Controller -
Try this -
function listcategory($page = 0){
$id = $this->input->get('list');
$data['categoryHead'] = $this->M_home->listCategory();
$this->load->view('frontend/template/header', $data);
$data['productsLast'] = $this->M_home->listProductLast();
$data['productsLast2'] = $this->M_home->listProductLast2();
$data['category'] = $this->M_home->listCategory();
//paging
$config['base_url'] = base_url('categoryproduct'.'?'.http_build_query($_GET));
$config['total_rows'] = $this->M_home->listProductPerCategory_num_rows($id);
$config['per_page'] = $per_page = 12;
$config['num_links'] = 2;
$config['uri_segment'] = 3;
$config['first_link'] = 'First';
$config['last_link'] = 'Last';
$config['next_link'] = 'Next';
$config['prev_link'] = 'Prev';
$config['page_query_string'] = TRUE;
//end paging
$this->pagination->initialize($config);
$data['paging'] = $this->pagination->create_links();
$data['page'] = $page;
// $page = ($this->uri->segment(2)) ? $this->uri->segment(2) : 0;
$data['listCategory'] = $this->M_home->listProductPerCategory($id, $per_page, $page);
$this->load->view('frontend/category', $data);
$this->load->view('frontend/template/footer');
Order by condition is wrong in your model.
Try this -
$this->order_by('title','ASC or DESC or RANDOM');

i have set $config['per_page'] = 20 but it get only two result

i am using codeigniter pagination with per page 20 result but it get only two result when i click on pagination mean page number like 2, 3, 4
following is my controller
function restaurant_listing()
{
$config['base_url'] = base_url() . 'admin/restaurant/restaurant_listing/';
//$config['base_url'] = "http://".$_SERVER['HTTP_HOST'];
//$config['base_url'] .= preg_replace('#/+$#','',dirname($_SERVER['SCRIPT_NAME'])).'/';
$config['total_rows'] = $this->restaurant_model->record_count();
$config['per_page'] = 20;
$config['uri_segment'] = 4;
$config['num_links'] = 10;
$config['use_page_numbers'] = TRUE;
$config['cur_tag_open'] = '<b>';
$config['cur_tag_close'] = '</b>';
$this->pagination->initialize($config);
$page = ($this->uri->segment(4)) ? $this->uri->segment(4) : 0;
$data["results"] = $this->restaurant_model->restlisting($config["per_page"], $page);
$data["links"] = $this->pagination->create_links();
$data['content'] = $this->load->view('admin/restaurant_listing', $data, true);
$this->load->view('admin/template', $data);
}
my view file contain
<div class="pagination"> <?php echo $links; ?> </div>
here i am showing pagination
maybe can fix your code i use this code for pagnation
controller code
public restaurant_listing()
{
$restaurant=$this->uri->segment(4);
$limit_ti=20;
if(!$restaurant):
offset_ti = 0;
else:
$offset_ti = $restaurant;
endif;
$this->load->model('Restaurant_model');// call model
$this->load->library('pagination'); // call library
$query=$this->restaurant_model->restlisting($limit_ti,$offset_ti); // geting an article
$total_page = $this->restaurant_model->record_count(); // count row
/** Pagination **/
$config['base_url'] = base_url().'admin/restaurant/restaurant_listing/';
$config['total_rows'] =$total_page->num_rows();
$config['per_page'] = 20;
$config['uri_segment'] = 4;
$config['num_links'] = 10;
$config['use_page_numbers'] = TRUE;
$config['cur_tag_open'] = '<b>';
$config['cur_tag_close'] = '</b>';
$this->pagination->initialize($config);
$data = array('query' => $query,'page'=>$restaurant);
$data['content'] = 'admin/restaurant_listing';
$this->load->view('template', $data);
}
models code
function restlisting($limit,$ofset){
$query=$this->db->query("select * from *name table* order by id ASC LIMIT $ofset,$limit");
return $query;
}
function record_count(){
$query=$this->db->query("select * from *name table*");
return $query;
}
view code
<div class="pagination"><?php echo $this->pagination->create_links(); // call the pagnation?></div>

issue with pagination and limit

I have 3 tables site_settings,sermons & Preachers. In site_settings table, set the max number of preachers to be displayed. Preacher table contains all the preacher details and sermons table contains sermons of all preachers. Am using pagination for displaying preachers(2/page). if the value of site_settings table is 1 or 2 then no of preachers will display 2, if 3 or 4 then preachers 4... I don't know what is happening. Is it a problem with pagination or limit? I am using the following code for this ( In Model)
Method in Model
function viewAll($offset=0, $limit=null) {
$this->db->select('settings_value');
$this->db->from('site_settings');
$this->db->where('settings_name', 'preachercount');
$count = $this->db->get()->row();
echo $count->settings_value;
$preacher = array();
$this->db->select('preacher.preacher_id,preacher.first_name,preacher.last_name,preacher.preacher_image,preacher.preacher_logo,preacher.preacher_bio_brief');
$this->db->distinct('preacher.preacher_id');
$this->db->from('preacher');
$this->db->join('sermons', 'sermons.preacher_id=preacher.preacher_id');
$this->db->order_by('preacher.sort_order');
$this->db->limit($count->settings_value);
$query = $this->db->get('', $limit, $offset);
if ($query->num_rows() > 0) {
foreach ($query->result() as $row) {
$preacher[$row->preacher_id]['preacher_id'] = $row->preacher_id;
$preacher[$row->preacher_id]['preacher_name'] = $row->first_name . ' ' . $row->last_name;
$preacher[$row->preacher_id]['preacher_image'] = $row->preacher_image;
$preacher[$row->preacher_id]['preacher_logo'] = $row->preacher_logo;
$preacher[$row->preacher_id]['preacher_bio_brief'] = $row->preacher_bio_brief;
$this->db->select('*');
$this->db->from('sermons');
$this->db->where('preacher_id', $row->preacher_id);
$this->db->order_by('sort_order ');
$sermon_array = array();
$query = $this->db->get();
if ($query->num_rows() > 0) {
foreach ($query->result() as $row1) {
$sermon_array[$row1->sermon_id] ['sermon_image'] = $row1->sermon_image;
$sermon_array[$row1->sermon_id] ['sermon_title'] = $row1->sermon_title;
$sermon_array[$row1->sermon_id] ['audio_file'] = $row1->audio_file;
$sermon_array[$row1->sermon_id] ['sermon_description'] = $row1->sermon_description;
}
}
$preacher[$row->preacher_id]['sermon'] = $sermon_array;
}
return $preacher;
}
return false;
}
Method in controller
function list() {
$paginate_segment = $this->uri->segment(3) ? $this->uri->segment(3) : 0;
$winner_list = $this->sermon_model->viewAllpreachers(0, null);
$config['base_url'] = base_url() . 'sermons/index/';
$config['total_rows'] = ($winner_list) ? count($winner_list) : 0;
$config['per_page'] = 2;
$config['full_tag_open'] = '';
$config['full_tag_close'] = '';
$config['uri_segment'] = 3;
$config['num_links'] = 4;
$config['display_pages'] = TRUE;
$config['first_link'] = 'First';
$config['first_link'] = 'First';
$config['first_tag_open'] = '<div>';
$config['first_tag_close'] = '</div>';
$config['last_link'] = 'Last';
$config['next_link'] = 'Next';
$config['prev_link'] = 'Prev';
$config['cur_tag_close'] = ' | ';
$config['num_tag_close'] = ' | ';
//initialize pagination
$this->pagination->initialize($config);
$this->data['preachers'] = $this->sermon_model->viewAllpreachers($paginate_segment, $config['per_page']);
$this->data['links'] = $this->pagination->create_links();
$this->data['page'] = $this->config->item('APP_template_dir') . 'site/home/sermons_view';
$this->load->vars($this->data);
$this->load->view($this->_container);
}
As stated in the comments, you're using a limit twice and need to combine those methods:
function viewAll($offset=0, $limit=null) {
$this->db->select('settings_value');
$this->db->from('site_settings');
$this->db->where('settings_name', 'preachercount');
$count = $this->db->get()->row();
// now use value of [$count] if [$limit] is null - else use [$limit]
$limit = (is_null($limit)) ? $count : $limit ;
$preacher = array();
$this->db->select('...');
$this->db->distinct('preacher.preacher_id');
$this->db->from('preacher');
$this->db->join('sermons', 'sermons.preacher_id=preacher.preacher_id');
$this->db->order_by('preacher.sort_order');
// then remove the [limit()] call
// $this->db->limit($count->settings_value); <-- NOT NEEDED
$query = $this->db->get('', $limit, $offset);
This effectively allows you to pass a $limit to the method, or use the settings from the db.

Resources