Codeigniter pagination is not working - php

I am using codeigniter pagination. But I'm facing a problem while using codeingiter pagination. Here is the issue which I am facing.
Ex: If there are more than 10 records for a page and here I am displaying 5 records per page. If I click on the second page it is displaying the data correctly but if I need to go back for the first page it is not working. Here is my code:
Controller:
class Testimonial extends CI_Controller {
function __construct() {
parent::__construct();
//here we will autoload the pagination library
$this->load->model('testimonial_model');
$this->load->library('pagination');
}
public function index()
{
$config = array();
$config["base_url"] = base_url('testimonial/index');
$config['total_rows'] = $this->testimonial_model->record_count();//here we will count all the data from the table
$config['per_page'] = 2;//number of data to be shown on single page
$config["uri_segment"] = 2;
$this->pagination->initialize($config);
$page = ($this->uri->segment(3)) ? $this->uri->segment(3) : 0;
$data["records2"] = $this->testimonial_model->get_all_testimonials($config["per_page"], $page);
$data["links"] = $this->pagination->create_links();//create the link for pagination
$data['mainpage'] = "testimonial";
$this->load->view('templates/template',$data);
}
}
Model:
class Testimonial_model extends CI_Model
{
function get_all_testimonials($limit, $start)
{
$this->db->limit($limit, $start);
$this->db->select('T.*');
$this->db->from('testimonials AS T');
$this->db->where(array('T.status'=>1));
$q = $this->db->get();
if($q->num_rows()>0)
{
return $q->result();
}
else
{
return false;
}
}
function record_count()
{
return $this->db->count_all("testimonials");
}
}

use this answer please read the code once to understand it
public function index()
{
$config = array();
//$config["base_url"] = base_url('testimonial/index');
$get_vars = $this->input->get();
if(is_array($get_vars))
$config['suffix'] = '?'.http_build_query($get_vars,'', "&");
//$config['prefix'] = '?'.http_build_query($get_vars,'', "&");
$config['base_url'] = base_url().$this->router->class.'/index';
$config['first_url'] = $config['base_url'] . (isset($config['suffix'])?$config['suffix']:'');
$config['total_rows'] = $this->testimonial_model->record_count();//here we will count all the data from the table
$config['per_page'] = 2;//number of data to be shown on single page
//this line should be according to url to fetch actual value
$config["uri_segment"] = ($this->uri->segment('2')?$this->uri->segment('2'):0); // 2 or 3 based on ur url
$this->pagination->initialize($config);
$page = $config["uri_segment"];
$data["records2"] = $this->testimonial_model->get_all_testimonials($config["per_page"], $page);
$data["links"] = $this->pagination->create_links();//create the link for pagination
$data['mainpage'] = "testimonial";
$this->load->view('templates/template',$data);
}

Related

codeigniter pagination not work for particular user articles

My Pagination not work , In this case simple print users article to match the rc code of users its work perfectly url is ../project/article/user_article/?rc=4715422 , its work but pagintion url not print any article, pagination url is ../project/article/user_article/?rc=4715422/1,
here is my code: controller code is -
public function user_article()
{
$rc=$_GET['rc'];
$data['title'] = "User Article";
$config = array();
$config["base_url"] = base_url() . 'article/user_article/?rc='. $rc ;
$config["total_rows"] = $this->article_m->record_count_uarticles($_GET);
$config["per_page"] = 1;
$config["uri_segment"] = 3;
$this->pagination->initialize($config);
$page = ($this->uri->segment(3)) ? $this->uri->segment(3) : 0;
$data["results"] = $this->article_m->fetch_result_uarticles($_GET, $config["per_page"], $page);
$data["links"] = $this->pagination->create_links();
if ($this->session->userdata ('is_logged_in')){
$data['profile']=$this->model_users->profilefetch();
$this->load->view('header',$data);
$this->load->view('user_article', $data);
$this->load->view('sfooter', $data);
} else {
redirect('signin');
}
}
and my modal is :
public function record_count_uarticles($rc) {
$query=$this->db->select('email,writer')->where('rc',$rc['rc'])->get('users');
$result=$query->result_array();
if ($query->num_rows() > 0) {
$row = $query->row_array();
$array = array ('email' => $row['email'], 'status' => '1');
return $this->db->where($array)->count_all_results("articles");
}
}
public function fetch_result_uarticles($rc, $limit, $start) {
$query=$this->db->select('email,writer')->where('rc',$rc['rc'])->get('users');
$result=$query->result_array();
if ($query->num_rows() > 0) {
$row = $query->row_array();
$this->db->limit($limit, $start);
$array = array ('u.email' => $row['email'], 'a.status' => '1', 'u.writer' => '1');
$query1=$this->db->select('a.id,title,a.status,description,image,a.email,tags,postdate,firstname,lastname,rc')->join('users u','u.email = a.email','left')->where($array)->order_by('a.id', 'DESC')->get('articles a');
if ($query1->num_rows() > 0) {
foreach ($query1->result() as $row) {
$data[] = $row;
}
return $data;
}
return false;
}
}
Check this code, pagination show properly, first page article print correctly but after click on pagination link then no article print in scnd page
This Link work but default link is not work , is there any query to change the url
../project/article/user_article/?rc=4715422/1 -- Default Link Not Work
../project/article/user_article/1/?rc=4715422 -- Custom Edited Link work

CodeIgniter Pagination not working: Object not found! Error 404

I'm working on the pagination for codeigniter. I was able to set it on my page but when I click the next page it will say
Object not found! Error 404.
My is correctly placed when I click the next, which is http://localhost/contents/index/2. Also another thing I noticed is that $config['per_page'] = 2; yet when I load the page all the data that was looped from a database is shown in 1 page instead of 2 per page.
Controller
//Pagenation below
$this->load->library('pagination');
$config['base_url'] = 'http://localhost/contents/index';
$config['total_rows'] = 200;
$config['per_page'] = 2;
$this->pagination->initialize($config);
echo $this->pagination->create_links();
$data['contents'] = $this->content_model->get_content();
$data['title'] = 'Contents';
$this->load->view('template/header', $data);
$this->load->view('pages/index', $data);
$this->load->view('template/footer');
try this
function index($offset=null){
$this->load->library('pagination');
$config['base_url'] = 'http://localhost/contents/index/';
$config['total_rows'] = 200;
$config['per_page'] = 2;
$this->pagination->cur_page = $offset;
$this->pagination->initialize($config);
$data['contents'] = $this->content_model->get_content($config['per_page'],$offset);
$data['title'] = 'Contents';
$this->load->view('template/header', $data);
$this->load->view('pages/index', $data);
$this->load->view('template/footer');
}
whole data showing in 1 page because you are not passing limit in model function.you getting 404 because you forgot / at the end of the base_url
in model
function get_content($limit,$offset) {
$query = $this->db->get('content',$limit,$offset);
return $query->result();
}
in view
echo $this->pagination->create_links(); //put this in view not in controller
use have to write the routes to get the values of the page number . You have to add this line to your routes.php in application/config folder
CODE: Routes.php
$route['index/(:num)'] = 'index/$1';
index function in index.php :
function index($current_page){
$this->load->library('pagination');
$config['base_url'] = 'http://localhost/contents/index';
$config['total_rows'] = 200;
$config['per_page'] = 2;
$this->pagination->initialize($config);
$this->pagination->cur_page = $current_page;
echo $this->pagination->create_links();
$data['contents'] = $this->content_model->get_content();
$data['title'] = 'Contents';
$this->load->view('template/header', $data);
$this->load->view('pages/index', $data);
$this->load->view('template/footer');
}

CodeIgniter Search Results Pagination

Well I've searched and searched all around but I still can't find a solution to my problem. I'm still new to php and codeigniter so maybe I missed the answer already but anyways, here's what I'm trying to do.
This is my Controller (c_index.php) - calls a search function and performs pagination on the resulting array.
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class C_index extends CI_Controller {
public function __construct()
{
parent::__construct();
$this->load->model('m_search');
$this->load->library("pagination");
$this->load->library("table");
}
/** Index Page for this controller */
public function index()
{
if($this->session->userdata('logged_in')){
$this->load->view('v_user');
}
else{
$this->load->view('index');
}
}
public function search()
{
// start of search
$search_term = $this->input->post('word');
$books = $this->m_search->search_books($search_term);
// start of pagination
$config['base_url'] = "http://localhost/test/index.php/c_index/search";
$config['per_page'] = 5;
$config['num_links'] = 7;
$config['total_rows'] = count($books);
echo $config['total_rows'];
$this->pagination->initialize($config);
$data['query'] = array_slice($books,$this->uri->segment(3),$config['per_page']);
$this->load->view("index",$data);
}
}
Here's my view (index.php) - basically just displays the pagination result
<h3> Search Results </h3>
<!-- table -->
<table class="table table-condensed table-hover table-striped" id="result_table">
<tbody>
<?php
if(isset ($query)){
if(count($query)!=0){
foreach($query as $item){
echo "<tr><td>". $item['title'] ." by " .$item['author'] ."<br/></td></tr>";
}
echo $this->pagination->create_links();
}
else
{
echo "No results found for keyword ' ". $this->input->post('word')." ' .";
}
}
else
{
echo "Start a search by typing on the Search Bar";
}
?>
</tbody>
</table>
My model (m_search.php) - basically searches the database and returns an array of results.
<?php
class M_search extends CI_Model{
function search_books($search_term='default')
{
$filter = $this->input->post('filter');
//echo $filter;
if($filter == 'title')
{
//echo 'title';
$this->db->select('*');
$this->db->from('book');
$this->db->like('title',$search_term);
// Execute the query.
$query = $this->db->get();
return $query->result_array();
}else if($filter == 'author')
{
//echo 'author';
$this->db->select('*');
$this->db->from('book');
$this->db->like('author',$search_term);
// Execute the query.
$query = $this->db->get();
return $query->result_array();
}else if($filter == 'type')
{
//echo 'type';
$this->db->select('*');
$this->db->from('book');
$this->db->like('book_type',$search_term);
// Execute the query.
$query = $this->db->get();
return $query->result_array();
}else if($filter == 'status')
{
//echo 'status';
$this->db->select('*');
$this->db->from('book');
$this->db->like('book_status',$search_term);
// Execute the query.
$query = $this->db->get();
return $query->result_array();
}else
{
//echo 'all';
$this->db->select('*');
$this->db->from('book');
$this->db->like('book_status',$search_term);
$this->db->or_like('book_type',$search_term);
$this->db->or_like('author',$search_term);
$this->db->or_like('title',$search_term);
// Execute the query.
$query = $this->db->get();
return $query->result_array();
}
}
}
Now my problem is keeping the results for the pagination.
The first page is fine but whenever I click on a page link, the results on the table show the whole database and is not limited to my search results.
I've read somewhere that I need to use sessions to keep my search_term so that it works when I switch pages but I don't know where to put it.
Any advice or suggestions would be greatly appreciated. Thanks.
There are several of different ways to handle search and pagination depending on your needs. Based on your existing code, this is what I would do.
Change
$search_term = $this->input->post('word');
to
$search_term = ''; // default when no term in session or POST
if ($this->input->post('word'))
{
// use the term from POST and set it to session
$search_term = $this->input->post('word');
$this->session->set_userdata('search_term', $search_term);
}
elseif ($this->session->userdata('search_term'))
{
// if term is not in POST use existing term from session
$search_term = $this->session->userdata('search_term');
}
function search_books($search_term='default')
{
$filter = $this->input->post('filter');
//echo $filter;
if($filter == 'title')
{
$this->db->like('title',$search_term);
}
else if($filter == 'author')
{
$this->db->like('author',$search_term);
}
else if($filter == 'type')
{
$this->db->like('book_type',$search_term);
}
else if($filter == 'status')
{
$this->db->like('book_status',$search_term);
}
else
{
$this->db->like('book_status',$search_term);
$this->db->or_like('book_type',$search_term);
$this->db->or_like('author',$search_term);
$this->db->or_like('title',$search_term);
// Execute the query.
}
$query = $this->db->get('book');
return $query->result_array();
}
}
Just trying to lessen your Model code, if you don't want to use "session" and want to copy, paste link/url and get same result in your search then you should use uri class in your controller.
you can use following code in your controller all query string will show in pagination links.
$config['reuse_query_string']=TRUE;
for additional parameters in paging link you can un comment following 2 lines.
//$getData = array('s'=>$search);
//$config['suffix'] = '?'.http_build_query($getData,'',"&");
$this->pagination->initialize($config);
Try in this way in your Controller,
public function search()
{
$result=array();
if($this->session->userdata('login_id')!='')
{
$q = trim($this->input->get('q'));
if(strlen($q)>0)
{
$config['enable_query_strings']=TRUE;
$getData = array('q'=>$q);
$config['base_url'] = base_url().'admin/Product/search/';
$config['suffix'] = '?'.http_build_query($getData,'',"&");
$config['first_url'] = $config['base_url'].'?q='.$q;
$config["per_page"] = 10;
$config['use_page_numbers'] = TRUE;
$total_row = $this->Prod_model->search_record_count($q);
$config['total_rows']=$total_row;
$config['num_links'] = $total_row;
$config['cur_tag_open'] = ' <a class="current">';
$config['cur_tag_close'] = '</a>';
$config['next_link'] = 'Next >';
$config['prev_link'] = '< Previous';
if($this->uri->segment(3))
{
$page = $this->uri->segment(3);
}
else
{
$page = 1;
}
$result['search'] = $this->Prod_model->search($q,$config["per_page"],$page);
if(empty($result['search']))
{
echo "no data found";die;
}
else
{
$this->pagination->initialize($config);
$str_links = $this->pagination->create_links();
$result["links"] = explode(' ',$str_links);
$id=$this->session->userdata('login_id');
$result['user']=$this->Home_model->user_details($id);
$this->template->load('prod_table',$result);
}
}
else
{
echo "empty string";die;
}
}
else
{
redirect(base_url()."admin/");
}
}

CodeIgniter Pagination class prevents access to other pages

tried doing this on my own but had no luck =/
My pagination is on the main page, I have some sort of blog system there,
the only other view on that controller is login, which after enabling the pagination just disappeared and now instead of URL/login it displays the main page.
My controller:
public function view($page = 'index')
{
if ( !file_exists('application/views/pages/'.$page.'.php') || $page == 'header' || $page == 'footer')
{
// Whoops, we don't have a page for that!
show_404();
}
if( $page = 'index' ) {
$this->load->library('pagination');
$config['base_url'] = base_url('posts');
$config['total_rows'] = $this->db->order_by("id", "desc")->get('Updates')->num_rows();
$config['per_page'] = 5;
$config['uri_segment'] = 3;
$config['full_tag_open'] = '<div id="pages">';
$config['full_tag_close'] = '</div>';
$this->pagination->initialize($config);
$data['records'] = $this->db->order_by("id", "desc")->get('Updates', $config['per_page'], $this->uri->segment(2));
}
$this->load->model('panel_model');
$data['math_captcha_question'] = $this->mathcaptcha->get_question();
$this->load->view('header');
$this->load->view('pages/'.$page, $data);
$this->load->view('footer');
}
routes.php:
$route['login'] = "pages/view/login";
I'd be really glad if any of you guys could give me a hand :)
Thanks!
base_url = assets, files and directories.
site_url = URL of your site, because it does append $config['index_page'].
Try replace base_url('posts') with site_url('posts');

CodeIgniter Pagination, possible routing issue?

I'm trying to learn CodeIgniter and I'm having trouble with the pagination. I'm a complete newbie so I apologise if I've missed anything.
The pagination displays on my views fine, generates everything it should, but the pages give me a 404. I suspect it might have something to do with the routes or the uri_segment (though I've changed it to a whole bunch of numbers and nothing did the trick), but I'm not sure.
The URLs each page generates are /music3/music/20, /music3/music/40, etc.
Let me know if you need anything I haven't included.
Controller:
$config['base_url'] = 'http://moefoster.com/music3/music/';
$config['total_rows'] = $this->db->count_all('Music');
$config['per_page'] = '20';
$config['num_links'] = '5';
$config['uri_segment'] = '2';
$this->pagination->initialize($config);
$data['music'] = $this->music_model->get_music($config['per_page'], $config['uri_segment']);
Model:
public function get_music($num = 20, $offset = 0, $slug = FALSE) {
if ($slug === FALSE) {
return $this->db->select('*')->from('Music')->limit($num, $offset)->order_by('Release', 'desc')->get()->result_array();
}
$query = $this->db->get_where('Music', $num, $offset, array('Track' => $slug));
return $query->row_array();
}
Routes:
$route['music'] = 'music';
$route['default_controller'] = "music";
$route['(:any)'] = 'pages/view/$1';
you use standard pagination :/ nevermind, pagination generated like this:
class / function / pagination num
URL BASE:
$config['base_url'] = 'http://moefoster.com/music/';
ROUTES:
$route['music'] = 'music';
$route['music/(:num)'] = 'music/$1';
$route['default_controller'] = "music";
$route['(:any)'] = 'pages/view/$1';
but I use in backend, \libraries\My_Pagination.php
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
class MY_Pagination extends CI_Pagination
{
var $offset = 0;
var $pagination_selector = 'page';
var $index_page;
function MY_Pagination ()
{
parent::__construct();
log_message('debug', "MY_Pagination Class Initialized");
$this->index_page = config_item('index_page') != '' ? config_item('index_page') . '/' : '';
$this->_set_pagination_offset();
}
function _set_pagination_offset ()
{
$CI = & get_instance();
if (strstr($CI->uri->uri_string(), $this->pagination_selector)) {
$segments = $CI->uri->segment_array();
foreach ($segments as $key => $value) {
if ($value == $this->pagination_selector) {
$this->offset = $CI->uri->segment($key + 1);
$this->uri_segment = $key + 1;
$uri = $CI->uri->uri_string();
$pos = strpos($uri, $this->pagination_selector);
$this->base_url = '/'.$this->index_page . substr($uri, 0, $pos + strlen($this->pagination_selector.'/'));
}
}
}
else {
$this->offset = 0;
$this->uri_segment = 0;
$this->base_url = '/'.$this->index_page . $CI->uri->uri_string() . '/' . $this->pagination_selector.'/';
}
}
}
Example controller
function somefunction($somevariable){
$config['total_rows'] = Model_Admin::getCountClankyCategory($somevariable);
$config['per_page'] = 25;
$config['cur_tag_open'] = '#START SOME HTML#';
$config['cur_tag_close'] = '#END SOME HTML#';
$config['full_tag_open'] = '#START SOME HTML PAGINATION#';
$config['full_tag_close'] = '#END SOME HTML PAGINATION#';
$this->pagination->initialize($config);
$data['content'] = Model_Admin::getAllClankyCategory($somevariable,$config['per_page'],$this->pagination->offset);
.....
}
some example model
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Model_Admin extends CI_Model {
private static $db;
function __construct()
{
parent::__construct();
self::$db = &get_instance()->db;
}
static function getAllClankyCategory($cat,$num,$offset) {
self::$db->where('#MYTYPE#',$cat);
return self::$db->get('#SOMETABLE#',$num,$offset)->result_array();
}
static function getCountClankyCategory($cat) {
return self::$db->count_all_results('#SOMETABLE#');
}
then if u use "some hard code routing", routes like, other u use without these routes
$route['admin/articles/cat/(:any)'] = "admin/cat/$1";
$route['admin/articles/cat/(:any)/(:num)'] = "admin/cat/$1/$2";
You can check one my previous answers on Pagination which explains very well how to do pagination and how to take care urls perfectly.....

Categories