My problem is that when I press on the pagination link the URL CHANGE and the segment array also so, first I started with this URL:
site/argument/argument
and when I press the pagination link the URL turn into:
site/method/startIndex.
Is there a way to use pagination without using the URL query index ?
EDIT:
Here is my controller method where I've receive the arguments from the URL:
function index ($par1, $par2 = null, $par3 = null)
{
$data['records'] = $this->site_model->getRecords($par1, $par2, $par3);
$this->load->view('main', $data);
}
And this is the Model method where I've do the DB query:
function getRecords($par1, $par2 = null, $par3 = null )
{
if (!isset($par2) && !isset($par3)) {
$where = "lvlOne = '".$par1."'";
} elseif(isset($par2) && !isset($par3)) {
$where = "lvlOne = '".$par1."' AND lvlTwo = '".$par2."'";
} elseif(isset($par2) && isset($par3)) {
$where = "lvlOne = '".$par1."' AND lvlTwo = '".$par2."' AND lvlThree = '".$par3."'";
}
$this->db->from('mph_products');
$this->db->where($where);
$query = $this->db->get();
return $query->result();
}
How can I paginate this results? Because I've got conflicts with the pagination library URL
EDIT:
I've found a way to do what I've wanted to.
There is a config option of the Pagination Library where you put the suffix of the pagination anchor and you can pass the arguments to it.
$config['suffix'] = "$arg1/$arg2/$arg3";
:D
This library codeigniter pagination + bootstrap design
<?php
class Paginacao
{
public $CI;
function __construct() {
$this->CI = &get_instance();
$this->CI->load->library('pagination');
}
function criar($total_rows,$base_url,$per_page=15,$num_links=5)
{
$paginacao['total_rows'] = $total_rows;
$paginacao['base_url'] = site_url($base_url);
$paginacao['per_page'] = $per_page;
$paginacao['num_links'] = $num_links;
$paginacao['full_tag_open'] = '<br /><div class="pagination pagination-centered"><ul>';
$paginacao['full_tag_close'] = '</ul></div>';
$paginacao['first_link'] = 'Primeira';
$paginacao['first_tag_open'] = '<li>';
$paginacao['first_tag_close'] = '<li>';
$paginacao['last_link'] = 'Ultima';
$paginacao['last_tag_open'] = '<li>';
$paginacao['last_tag_close'] = '</li>';
$paginacao['next_link'] = 'Próximo';
$paginacao['next_tag_open'] = '<li>';
$paginacao['next_tag_close'] = '</li>';
$paginacao['prev_link'] = 'Anterior';
$paginacao['prev_tag_open'] = '<li>';
$paginacao['prev_tag_close'] = '</li>';
$paginacao['cur_tag_open'] = '<li class="active"><a href="#">';
$paginacao['cur_tag_close'] = '</a></li>';
$paginacao['num_tag_open'] = '<li>';
$paginacao['num_tag_close'] = '</li>';
$this->CI->pagination->initialize($paginacao);
$html = $this->CI->pagination->create_links();
return $html;
}
}
As I understand, you want not to see page number in url, but CI Pagination class always add number to link. For more details see Pagination class.
Also you can use jquery datatable for client or server pagination.
Related
I'm facing an issue with the pagination in my system. Pagination is working fine here.
But if I'm searching something in that text field and if the result is more than 5 ($config['per_page'] = 5;) its not showing the pagination buttons.
And actually, I have 6 results for the search keyword 'shihas'.
And also I can see the 6th result once I go to www.example.com/path/2 .
But still, the pagination link is not there. Please tell me a solution for this issue.
Controller:
public function index()
{
//all the posts sent by the view
$search_string = $this->input->post('search_string');
$order = $this->input->post('order');
$order_type = $this->input->post('order_type');
//pagination settings
$config['per_page'] = 5;
$config['base_url'] = base_url().'admin/posts';
$config['use_page_numbers'] = TRUE;
$config['num_links'] = 20;
$config['full_tag_open'] = '<ul>';
$config['full_tag_close'] = '</ul>';
$config['num_tag_open'] = '<li>';
$config['num_tag_close'] = '</li>';
$config['cur_tag_open'] = '<li class="active"><a>';
$config['cur_tag_close'] = '</a></li>';
//limit end
$page = $this->uri->segment(3);
//math to get the initial record to be select in the database
$limit_end = ($page * $config['per_page']) - $config['per_page'];
if ($limit_end < 0){
$limit_end = 0;
}
//if order type was changed
if($order_type){
$filter_session_data['order_type'] = $order_type;
}
else{
//we have something stored in the session?
if($this->session->userdata('order_type')){
$order_type = $this->session->userdata('order_type');
}else{
//if we have nothing inside session, so it's the default "Asc"
$order_type = 'Asc';
}
}
//make the data type var avaible to our view
$data['order_type_selected'] = $order_type;
//we must avoid a page reload with the previous session data
//if any filter post was sent, then it's the first time we load the content
//in this case, we clean the session filter data
//if any filter post was sent but we are on some page, we must load the session data
//filtered && || paginated
if($search_string !== false && $order !== false || $this->uri->segment(3) == true){
/*
The comments here are the same for line 79 until 99
if the post is not null, we store it in session data array
if is null, we use the session data already stored
we save order into the var to load the view with the param already selected
*/
if($search_string){
$filter_session_data['search_string_selected'] = $search_string;
}else{
$search_string = $this->session->userdata('search_string_selected');
}
$data['search_string_selected'] = $search_string;
if($order){
$filter_session_data['order'] = $order;
}
else{
$order = $this->session->userdata('order');
}
$data['order'] = $order;
//save session data into the session
if(isset($filter_session_data)){
$this->session->set_userdata($filter_session_data);
}
$data['count_posts']= $this->posts_model->count_posts($search_string, $order);
$config['total_rows'] = $data['count_posts'];
//fetch sql data into arrays
if($search_string){
if($order){
$data['posts'] = $this->posts_model->get_posts($search_string, $order, $order_type, $config['per_page'],$limit_end);
}else{
$data['posts'] = $this->posts_model->get_posts($search_string, '', $order_type, $config['per_page'],$limit_end);
}
}else{
if($order){
$data['posts'] = $this->posts_model->get_posts('', $order, $order_type, $config['per_page'],$limit_end);
}else{
$data['posts'] = $this->posts_model->get_posts('', '', $order_type, $config['per_page'],$limit_end);
}
}
}else{
//clean filter data inside section
$filter_session_data['search_string_selected'] = null;
$filter_session_data['order'] = null;
$filter_session_data['order_type'] = null;
$this->session->set_userdata($filter_session_data);
//pre selected options
$data['search_string_selected'] = '';
$data['order'] = 'id';
//fetch sql data into arrays
$data['count_posts']= $this->posts_model->count_posts('','');
$data['posts'] = $this->posts_model->get_posts('', '', $order_type, $config['per_page'],$limit_end);
$config['total_rows'] = $data['count_posts'];
}
//initializate the panination helper
$this->pagination->initialize($config);
//load the view
$data['main_content'] = 'admin/posts/list';
$this->load->view('includes/template', $data);
}
You can use datatable which is so real time.
DataTables is a plug-in for the jQuery Javascript library. It is a highly flexible tool, based upon the foundations of progressive enhancement, and will add advanced interaction controls to any HTML table.
Pagination, instant search and multi-column orderingSupports almost any data source:DOM, Javascript, Ajax and server-side processingEasily theme-able: DataTables, jQuery UI, Bootstrap, FoundationWide variety of extensions inc. Editor, Buttons, FixedColumns and moreExtensive options and a beautiful,
expressive APIFully internationalisableProfessional quality: backed by a suite of 2900+ unit testsFree open source software (MIT license)! Commercial support available.
Just put code:
$(document).ready(function(){
$('#myTable').DataTable();
});
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)
{
//...
}
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.
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
I want to create a simple menu function which can call it example get_menu()
Here is my current code.
<?php
$select = 'SELECT * FROM pages';
$query = $db->rq($select);
while ($page = $db->fetch($query)) {
$id = $page['id'];
$title = $page['title'];
?>
<?php echo $title; ?>
<?php } ?>
How to do that in?
function get_menu() {
}
Let me know.
Here is the function for that:
function get_menu(&$db)
{
$select = 'SELECT * FROM pages';
$query = $db->rq($select);
$menu = '';
while ($page = $db->fetch($query)) {
$id = $page['id'];
$title = $page['title'];
$menu .= '<a href="page.php?id=' . $id . '" &title="' . $title .'></a>'
}
return $menu;
}
.
Some Quick Corrections In Your Script:
You were missing = after id
You were missing & after title
Suggestion:
You can give your menu links a class and style as per your menu needs :)
get_menu() has to get reference to $db somehow. Probably the best and easiest way is to pass that reference as parameter:
function get_menu(MyDatabaseHandler $db) {
// code proposed by Sarfraz here
}
now here you already have a mistake:
<?php echo $title; ?>
notice the = after id
you can't be too careful
First, separate the part where you're doing something, and the one used to display things.
Second, the alternative syntax looks better for the display part.
<?php
function get_menu(){
$items = array();
$select = 'SELECT * FROM pages';
$query = $db->rq($select);
while ($page = $db->fetch($query)) {
$items[] = $page['id'];
}
return $items;
}
$menuItems = get_menu();
?>
<ul>
<?php foreach($menuItems as $item): ?>
<li><?php echo $item['title']; ?></li>
<?php endforeach;?>
</ul>
The code Sarfraz posted is going to create invalid anchor tags (i.e. links). They'll also be missing names. Here is the shorter/faster version:
function get_menu($db)
{
$result = $db->rq('SELECT id,title FROM pages');
$menu = '';
while ($page = $db->fetch($result))
{
$id = $page['id'];
$title = $page['title'];
$menu .= "<a href='page.php?id={$id}&title={$title}'>{$title}</a>\n";
}
return $menu;
}
To use that do this:
echo get_menu($db);
The error you were getting was probably resulting from not passing the database connection to the function.
NOTE: It's generally not a good idea to show database ID numbers to the user in the interest of security; slugs are much better for identifying pages and are SEO friendly. Also, there shouldn't be any need to pass the page title to page.php because if you've got the ID you can get that when you need it from the database. Here's the code with this in mind:
function get_menu($db)
{
$result = $db->rq('SELECT id,title FROM pages');
$menu = '';
while ($page = $db->fetch($result))
{
$menu .= "<a href='page.php?id={$page['id']}'>{$page['title']}</a>\n";
}
return $menu;
}
just put function get_menu() { above your code and } below
or like this??
function get_menu( $title, $id ) {
$menu = '';
$menu .= '<a href="page.php?id' . $id . '" title="' . $title .'></a>'
echo $menu;
}
------------------------
$select = 'SELECT * FROM pages';
$query = $db->rq($select);
while ($page = $db->fetch($query)) {
$id = $page['id'];
$title = $page['title'];
get_menu($title, $id );
}
function getMenu()
{
$select = 'SELECT FROM pages';
$query = $db->rq($select);
$menu = new Array;
while ($page = $db->fetch($query)) {
$menu[] = '';
}
return $menu;
}