CodeIgniter Pagination wrong generate next link - php

I'm Quit New and trying to Make Pagination Inside Codeigniter...
I'm to create pagination with one extra argument.. link first argument is for getting ID for database search.. and than create pagination... I've done so far but the next page link is not correct as it should be. please check my code and let me know what's wrong i am doing.
this is model code..
my modelclass name is movie
public function get_movies_by_actor($actor_id,$num=10,$start=0)
{
$this->db->select(" f.film_id,
f.language_id,
a.actor_id,
f.title,
f.description,
l.name AS language,
c.name AS category,
concat(a.first_name, ' ', a.last_name ) AS actor_name
",FALSE);
$this->db->from('actor AS a');
$this->db->join('film_actor AS fa', 'fa.actor_id=a.actor_id');
$this->db->join('film AS f', 'f.film_id=fa.film_id', 'left');
$this->db->join('language AS l', 'l.language_id=f.language_id', 'left');
$this->db->join('film_category AS fc', 'f.film_id=fc.film_id', 'left');
$this->db->join('category AS c', 'c.category_id=fc.category_id', 'left');
$this->db->where('a.actor_id', $actor_id);
$this->db->order_by('f.film_id','desc')->limit($start,$num);
$query = $this->db->get();
return $query->result();
}
this and controller code.
my controller class name is movies
public function actor_movie($actor_id,$start=0)
{
$data['movies']=$this->movie->get_movies_by_actor($actor_id,$start,10);
$this->load->library('pagination');
$config['base_url'] = base_url().'index.php/movies/actor_movie/'.$actor_id.'/';
$config['total_rows'] = $this->movie->get_total_movies();
$config['per_page'] = 10;
$config['display_pages'] = FALSE;
$config['first_link'] = FALSE;
$config['last_link'] = FALSE;
$config['next_tag_open'] = '<li class="next">';
$config['next_link'] = 'Older Post →';
$config['next_tag_close'] = '</li>';
$config['prev_tag_open'] = '<li class="prev">';
$config['prev_link'] = '&lt Newer Post';
$config['prev_tag_close'] = '</li>';
$this->pagination->initialize($config);
$data['pagination_links'] = $this->pagination->create_links();
$data['title'] = '$this->pagination->create_links()';
$this->load->view('header');
$this->load->view('actor_movies',$data);
$this->load->view('footer');
}

just you need to add uri_segment in pagination $config array in Controller Function...
$config['uri_segment'] = 4;

Related

How do I make CI Pagination first page url segment always appear? First page pagination with search query has an error message

My team and I are making a search function with pagination and the base table works fine, even the pagination works fine. The problem is when we use the search function. Upon searching, an error message pops up on the first page:
Error message on the first page, although the results for the search query shows up. But when you turn to the page 2 of the search query, error message disappears and everything is normal.
This is the url of the first page where the error above shows up:
project1/index.php/configname/view?name=smith
This is the url when you turn to the next page where there are no errors:
project1/index.php/configname/view/8?name=smith
When we manually insert a zero as before the question mark, no error shows up, like so:
project1/index.php/configname/view/0?name=smith
We figured it has something to do with the uri segment not showing up on the first page, so we are looking for a solution where the zero will be the default and will be there upon loading the view/searching.
here is our config function:
public function view()
{
$data['title'] = 'View';
$config = array();
$search = $this->input->get("name");
$config["base_url"] = base_url() . "/index.php/configname/view";
$config["total_rows"] = $this->Users_model->get_search_count($search);
$config["per_page"] = 8;
$config["uri_segment"] = 3;
if (count($_GET) > 0) $config['suffix'] = '?' . http_build_query($_GET);
$config['first_url'] = $config['base_url'].'?'.http_build_query($_GET);
$config['full_tag_open'] = '<div class="pagination">';
$config['full_tag_close'] = '</div>';
$config['first_link'] = 'First';
$config['last_link'] = 'Last';
$config['first_tag_open'] = '<li class="page-item"><span class="page-link">';
$config['first_tag_close'] = '</span></li>';
$config['prev_link'] = '&laquo';
$config['prev_tag_open'] = '<li class="page-item"><span class="page-link">';
$config['prev_tag_close'] = '</span></li>';
$config['next_link'] = '&raquo';
$config['next_tag_open'] = '<li class="page-item"><span class="page-link">';
$config['next_tag_close'] = '</span></li>';
$config['last_tag_open'] = '<li class="page-item"><span class="page-link">';
$config['last_tag_close'] = '</span></li>';
$config['cur_tag_open'] = '<li class="page-item active"><a class="page-link" href="#">';
$config['cur_tag_close'] = '</a></li>';
$config['num_tag_open'] = '<li class="page-item"><span class="page-link">';
$config['num_tag_close'] = '</span></li>';
$this->pagination->initialize($config);
$page = ($this->uri->segment(3)) ? $this->uri->segment(3) : 0;
$data['list'] = $this->Users_model->get_all($config['per_page'], $page, $search);
$data['links'] = $this->pagination->create_links();
$this->load->view('include/header', $data);
$this->load->view('include/sidetopbar', $data);
$this->load->view('user/viewloans', $data);
}
This is our model:
function get_all($limit, $start, $st)
{
$sql = "select * from $this->tbl where full_name like '%$st%' order by date DESC limit " . $start . ", " . $limit;
$query = $this->db->query($sql);
return $query->result();
}
function get_search_count($st = NULL)
{
if ($st == "NULL") $st = "";
$sql = "select * from $this->tbl where full_name like '%$st%'";
$query = $this->db->query($sql);
return $query->num_rows();
}
This is the line in which the error was referring to for our Pagination.php on CI, but we didn't change anything from it:
if ($this->prefix !== '' OR $this->suffix !== '')
{
$this->cur_page = str_replace(array($this->prefix, $this->suffix), '', $this->cur_page);
}
TL;DR: Error message shows up on the first page upon using our search function. We just want to make it disappear as the search queries properly work, just the error makes us mad.
in this section
if ($this->prefix !== '' OR $this->suffix !== '')
{
$this->cur_page = str_replace(array($this->prefix, $this->suffix), '', $this->cur_page);
}
check if $this->suffix is null set it to 1
if(!is_numeric($this->suffix)){
$this->suffix = 1;
}
CodeIgniter seems to treat the search query string as a page number suffix: when it gets the page number from the url, it removes this suffix from the page number. When the page number is missing from the url, it tries to remove this suffix from a null value, and because of the more strict type checking in php 8 this gives the error. (I don't get this error with CI3 on php 7.4.)
It's not in the documentation (found here: https://github.com/bcit-ci/CodeIgniter/pull/4384 ), but you can also set the current page for the Pagination library manually using $config['cur_page'] = ... ;
If you set this to something that isn't considered "empty" by php, CodeIgniter will use this page number instead of getting the one from the url. And if you set it to a page number that does not make sense, for example, -1, CodeIgniter will use 0 instead. So you could try setting it to -1 when the segment is missing:
$config['cur_page'] = $this->uri->segment(3) ?: -1;
Not sure if this triggers other errors on php 8 though!

Code Igniter pagination does not return all the rows having the same parameters

I'm relatively new in Code Igniter and I'm trying to use the Code Igniter pagination class for the first time. I'm trying to get some rows in my database table, depending on the state, lga and category selected by the user. These three are passed to the function as parameters. I have followed the process I found on SO and some other sites to implement pagination on the page, and it seems to work, except that it doesn't return all the rows that has the specified parameters.
This what I have:
Model - Posts_model.php
public function count_lga_cat_posts($state, $lga, $category) {
return $this->db->get_where('lga_posts', array('state' => $state, 'lga' => $lga, 'category' => $category, 'display' => 'true'))->num_rows();
}
public function fetch_lga_cat_data($limit, $start) {
$this->db->limit($limit, $start);
$this->db->order_by("id", "desc");
$query = $this->db->get("lga_posts");
if ($query->num_rows() > 0) {
foreach ($query->result() as $row) {
$data[] = $row;
}
return $data;
}
return false;
}
Controller - Lga_posts.php
public function selected_state_lga_posts_category($state, $lga, $category)
{
//config for pagination
$config = array();
$uri_seg = 5;
$config["base_url"] = base_url('state2/'.$state.'/'.$lga.'/'.$category); //as specified in routes
$config["total_rows"] = $this->posts_model->count_lga_cat_posts($state, $lga, $category);
$config["per_page"] = 3;
$config["uri_segment"] = $uri_seg;
$config['use_page_numbers'] = TRUE;
$config['cur_tag_open'] = ' <a class="current">';
$config['cur_tag_close'] = '</a>';
$config['first_link'] = 'Back to first page';
$config['next_link'] = 'View more posts';
$config['prev_link'] = 'Previous posts';
$config['last_link'] = 'Jump to last page';
$config['display_pages'] = FALSE;
$this->pagination->initialize($config);
$page = ($this->uri->segment($uri_seg))? $this->uri->segment($uri_seg) : 0;
$this->db->where(array('state' => $state, 'lga' => $lga, 'category' => $category, 'display' => 'true'));
$data["results"] = $this->posts_model->fetch_lga_cat_data($config["per_page"], $page);
$str_links = $this->pagination->create_links();
$data["links"] = explode(' ',$str_links );
$data['state'] = $state;
$data['lga'] = $lga;
$data['category'] = $category;
$this->load->view('posts/lga/selected_state_lga_posts_category', $data);
When I load this page, everything seems to work fine, the pagination links are working as expected, but some rows in the table are not pulled, even though they have the same parameters as the ones that were pulled and displayed. If I change per_page config to 1, the last page gives an error "invalid argument in foreach" or something similar. I wonder if it has something to do with my query, since I do not want to get all the rows in the table, but the ones that have the selected parameters i.e. state, lga and category.
Can someone please point out to me what I'm doing wrong?

Codeigniter, using URL as parameter for query

i am using codeigniter, i am trying to create a page where if the url entered example.com/mobil/bekas/toyota/avanza it shows all used car that has toyota as brand and avanza as model, and if the url entered example.com/mobil/bekas/toyota it shows all used car that has toyota as brand.
Here is my controller :
public function bekas($brand_nama,$model_nama='NULL')
{
$this->load->model('listing_model');
$data['cars'] = $this->listing_model->viewListingByBrandAndModel($brand_nama, $model_nama);
$this->load->view('product_listing.php', $data);
}
Here is the model :
function viewListingByBrandAndModel($brand_nama, $model_nama)
{
$this->load->library('pagination');
$this->load->library('table');
$config['base_url'] = 'http://example.com/mobil/bekas/'.$brand_nama.'/'.$model_nama;
$config['total_rows'] = $this->db->select('*')
->join('car_list_tbl','car_list_tbl.car_list_ID = user_listing_tbl.car_list_ID')
->join('member_tbl','member_tbl.mID = user_listing_tbl.mID')
->join('model_tbl','model_tbl.model_ID = car_list_tbl.model_ID')
->join('series_tbl','series_tbl.series_ID = car_list_tbl.series_ID')
->join('body_type_tbl','body_type_tbl.body_type_nama = car_list_tbl.body_type_nama')
->join('brand_tbl','brand_tbl.brand_name = car_list_tbl.brand_name')
->where('car_list_tbl.brand_name',$brand_nama)
->like('model_tbl.model_nama', $model_nama)
->where('user_listing_tbl.listing_type','BEKAS')
->get('user_listing_tbl')->num_rows();
$config['per_page'] = 20;
$config['num_links'] = 10;
$config['display_pages'] = TRUE;
$config['full_tag_open'] = '<ul class="pagination">';
$config['full_tag_close'] = '</ul>';
$config['cur_tag_open'] = '<li class="active"><a href="#">';
$config['cur_tag_close'] = '</a></li>';
$config['num_tag_open'] = '<li>';
$config['num_tag_close'] = '</li>';
$config['first_link'] = FALSE;
$config['last_link'] = FALSE;
$config['prev_link'] = false;
$config['next_link'] = false;
$config['next_tag_open'] = '<li><a href="#"><i class="fa fa-chevron-left">';
$config['next_tag_close'] = '</i></a></li>';
$config['prev_tag_open'] = '<li><a href="#"><i class="fa fa-chevron-right">';
$config['prev_tag_close'] = '</i></a></li>';
$this->pagination->initialize($config);
//Pagination End
$sql = $this->db->select('*')
->join('car_list_tbl','car_list_tbl.car_list_ID = user_listing_tbl.car_list_ID')
->join('member_tbl','member_tbl.mID = user_listing_tbl.mID')
->join('brand_tbl','brand_tbl.brand_name = car_list_tbl.brand_name')
->join('model_tbl','model_tbl.model_ID = car_list_tbl.model_ID')
->join('series_tbl','series_tbl.series_ID = car_list_tbl.series_ID')
->where('car_list_tbl.brand_name',$brand_nama)
->like('model_tbl.model_nama', $model_nama)
->where('user_listing_tbl.listing_type','BEKAS')
->get('user_listing_tbl', $config['per_page'], $this->uri->segment(5));
return $sql->result();
I am still newbie at web programming, can i have inputs on which part i am lacking ? Because it works when i type example.com/mobil/bekas/toyota/avanza but it wont show anything when i type example.com/mobil/bekas/toyota
1 ) You are passing NULL as a string in parameter
2) Please use the if condition base on the $model_name at the time of the database query. Do not pass the extra conditions in query with like model_name LIKE '';
$this->db->select('*')
->join('car_list_tbl','car_list_tbl.car_list_ID = user_listing_tbl.car_list_ID')
->join('member_tbl','member_tbl.mID = user_listing_tbl.mID')
->join('brand_tbl','brand_tbl.brand_name = car_list_tbl.brand_name')
->join('model_tbl','model_tbl.model_ID = car_list_tbl.model_ID')
->join('series_tbl','series_tbl.series_ID = car_list_tbl.series_ID')
->where('car_list_tbl.brand_name',$brand_nama);
if($model_nama){
$this->db->like('model_tbl.model_nama', $model_nama);
}
$this->db->where('user_listing_tbl.listing_type','BEKAS');
->get('user_listing_tbl', $config['per_page'], $this->uri->segment(5));
return $this->db->result();
Your function declaration has a small syntax error. The value NULL is a special value in PHP and as such, should not be surrounded in quotes. For this reason, you were querying the database for the type 'toyota' with the make 'NULL' rather than NULL.
Changing your controller code should fix the issue:
public function bekas($brand_nama,$model_nama=NULL)
{
//...
}

codeigniter pagination, sending parameters between functions

I have a problem with pagination and codeigniter. I have a quick_searh view from witch I am submitting the information to a index controller function and there setting the pagination and calling the quick_search method to get the data I want. It just doesnt work . I've spent more then 5 hours rewriting those methods and even starting with quick_search and then passing to index function but nothing worked, please help.
public function index(){
// search parameters config
$lawyer_name = $this->input->post('lawyer_name');
$kanzlei = $this->input->post('kanzlei');
$area_of_expertise = $this->input->post('area_of_expertise');
$post_code = $this->input->post('post_code');
$city = $this->input->post('city');
$result = $this->quick_search(
$this->uri->segment(3),
$lawyer_name,
$kanzlei,
$area_of_expertise,
$post_code,
$city);
if(isset($result)){
// pagination config
$this->load->library('pagination');
$this->load->library('table');
$config['total_rows'] = count($result);
$config['base_url'] = 'http://localhost/anwalt/index.php/search/index';
$config['per_page'] = 5;
$config['num_links'] = 5;
$this->pagination->initialize($config);
$data['search_result_array'] = $result;
$data['main_content'] = 'pages/quick_search_results';
$this->load->view('templates/home_body_content', $data);
}
}
the quick_search function:
public function quick_search($offset, $lawyer_name, $kanzlei, $area_of_expertise, $post_code, $city){
// no input in the quick search
if( empty($lawyer_name) && empty($kanzlei) && empty($area_of_expertise)
&& empty($post_code) && empty($city))
{
$result = 'nothing';
} else {
$this->load->model('quick_search_model');
$result = $this->quick_search_model->get_search_results(
$offset,
$lawyer_name,
$kanzlei,
$area_of_expertise,
$post_code,
$city
);
}
return $result;
}
the sql is like this:
$sql = "SELECT users.user_id, users.canonical_name, first_name, last_name, city, phone_number, kanzlei
from users
inner join user_normal_aos
on users.user_id = user_normal_aos.user_id
inner join normal_areas_of_expertise
on user_normal_aos.normal_areas_of_expertise_id = normal_areas_of_expertise.normal_areas_of_expertise_id
where ".implode(" AND ", $where);
if(empty($offset)){
$offset = 0;
}
$sql = $sql." LIMIT ".$offset.", 4";
The data are displayed but I dont see the pagination in there .. and even when I want to change the url for segmenting it says I dont have any data.
The view is like:
<h1>Quick search results</h1>
<?php
if($search_result_array == "nothing"){
echo "<h3>You havent inputed anything</h3>";
} else {
echo $this->table->generate($search_result_array);
}
echo $this->pagination->create_links();
As per your search variables you can use this:
$lawyer_name = $this->input->post('lawyer_name');
$kanzlei = $this->input->post('kanzlei');
$area_of_expertise = $this->input->post('area_of_expertise');
$post_code = $this->input->post('post_code');
$city = $this->input->post('city');
/*pagination start*/
$this->load->library('pagination');
$config['base_url'] = base_url().'index.php/index/lawyer/'.$lawyer_name.'/kanzlei/'.$kanzlei.'/area_of_expertise/'.$area_of_expertise.'/post_code/'.$city.'/page/';
$config['total_rows'] = $this->model->count_all_results(); ###implement this function to count all the vodeos as per the search variables, just use the same function as "quick_search" but without the limit clause
$config['per_page'] = count($result);;
$config['uri_segment'] = 10;
$config['next_link'] = 'Next';
$config['prev_link'] = 'Prev';
$config['cur_tag_open'] = '<span class="active_page">';
$config['cur_tag_close'] = '</span>';
$this->pagination->initialize($config);
/*pagination end*/
You can not use $this->pagination->create_links(); method in view.
Use $data['pagination'] = $this->pagination->create_links(); in controller just before loading view
and echo $pagination in view
hope this will help you.

How to create pagination links when combining data from two different queries

I have a controller with a method that looks something like this:
public function browsecategory($category_id)
{
//find any subcategories for this category
$this->load->model('category/category_model');
$this->load->model('category/product_category_model');
$records['categories'] = $this->category_model->find_all_by('parent_id', $category_id);
//add some product data too.
$records['products'] = $this->product_category_model->find_all_by('category_id', $category_id);
Template::set('records', $records);
Template::render();
}//end browsecategory
All the examples I've seen for the codeigniter pagination "stuff" is using one query.
I need to combine two data sets and serve on one view.
Any suggestions?
EDIT 1
I've tried to follow MDeSilva's suggestion below. And although the pagination object is correctly calculating the number of links to create, all items appear on all pages.
Here's the code in the model that gets the data:
public function get_categories_and_products($limit=12, $offset=0, $category_id=null)
{
print '<BR>the function got the following offeset:'.$offset;
$query = "(SELECT cat.category_id, cat.title, cat.image_thumb, cat.deleted, cat.display_weight ";
$query = $query."FROM bf_categories cat ";
$query = $query."WHERE cat.parent_id=".$category_id;
$query = $query." AND cat.category_id <>".$category_id;
$query = $query.") UNION (";
$query = $query."SELECT p.product_id, p.name, p.image_thumb, p.deleted , p.display_weight";
$query = $query." FROM bf_product p ";
$query = $query."Inner join bf_product_category cp ";
$query = $query."on p.product_id=cp.product_id ";
$query = $query."Where cp.category_id=".$category_id.")";
$this->db->limit($limit, $offset);
$catsandprods= $this->db->query($query);
return $catsandprods->result() ;
}
And here's the code in the controller:
public function browsecategory($category_id, $offset=0)
{
$this->load->library('pagination');
$total = $this->product_model->get_cats_prods_count($category_id);
$config['base_url'] = site_url('/product/browsecategory/'.$category_id);
$config['uri_segment'] = 4;
$config['total_rows'] = $total;
$config['per_page'] = 5;
$config['num_links'] = 10;
$this->pagination->initialize($config);
$offset = ($this->uri->segment($config['uri_segment'])) ? $this->uri->segment($config['uri_segment']) : 0;
print $offset;
//Call the model function here to get the result,
$records= $this->product_model->get_categories_and_products(5,$offset,$category_id);
//add to breadcrumb trail
$this->build_bread_crumb_trail($category_id);
$breadcrumbs = $this->breadcrumbs->expand_to_hyperlinks();
Template::set('currentcategory',$category_id);
Template::set('breadcrumbs', $breadcrumbs);
Template::set('records', $records);
Template::render();
}
I've debugged and I can see that the line of code "$this->db->limit($limit, $offset);" in the model is not working. It always returns the full record set...
Can you tell me what I'm missing?
Thanks.
This is the way to generate pagination links in CI, for your requirement have a query with a join,
public function index($offset = 0) {
$language_id = 1;
$artwork_id = null;
if ($_SERVER['REQUEST_METHOD'] == 'POST')
{
$artwork_id = $this->input->post('serach_artwork_id', TRUE) ? $this->input->post('serach_artwork_id', TRUE) : null;
$data['artwork_id'] = $artwork_id;
}
$this->load->library('pagination');
$limit = 10;
$total = $this->Artwork_model->get_artwork_count($language_id, $artwork_id);
$config['base_url'] = base_url().'artwork/index/';
$config['total_rows'] = $total;
$config['per_page'] = $limit;
$config['uri_segment'] = 3;
$config['first_link'] = '<< First';
$config['last_link'] = 'Last >>';
$config['next_link'] = 'Next ' . '>';
$config['prev_link'] = '<' . ' Previous';
$config['num_tag_open'] = '<span class="number">';
$config['num_tag_close'] = '</span>';
$config['cur_tag_open'] = '<span class="current"><a href="#">';
$config['cur_tag_close'] = '</a></span>';
$this->pagination->initialize($config);
//Call the model function here to get the result,
$data['artworks'] = $this->Artwork_model->get_artworks($language_id, $limit, $offset, $artwork_id);
$this->template->write('title', 'Artwork : Manage Artwork');
$this->template->write_view('content', 'artwork/index', $data);
$this->template->render();
}
Here is an example for query with multiple joins in the model
public function get_artworks($language_id = 1, $limit = 10, $offset = 0, $arwork_id = null)
{
$this->db->select('a.id, a.price, a.is_shop, at.title,at.status,at.date_added,ats.name as artist_name');
$this->db->from('artworks a');
$this->db->join('artwork_translations at', 'a.id = at.artwork_id');
$this->db->join('artists ats', 'a.artist_id = ats.id');
$this->db->where('at.language_id', $language_id);
if(!is_null($arwork_id) && !empty($arwork_id) && $arwork_id != 'all')
{
$this->db->where('a.id =', $arwork_id);
}
$this->db->order_by('a.id DESC');
$this->db->limit($limit, $offset);
$artworks = $this->db->get();
return $artworks->result();
}
In the View
<?= $this->pagination->create_links(); ?>
The pagination class doesn't care about the how the data source is constructed, just so you hand it the data result object it wants. So you would just pass limits & offsets into your data queries, or else pull all your data and slice it up afterwards.
However, I don't really understand how you are thinking to combine these different bits of data into a single result to display - are you trying to display all categories, then paginate the products? If so, you are set up incorrectly
Simply use PHP function array_merge
<?php $beginning = 'foo'; $end = array(1 => 'bar');
$result = array_merge((array)$beginning, (array)$end);
$this->load->view('view.php', $result);
?>
and extract according to keys for array used.
It is really simple & working

Categories