5
votes

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.

4
I use ajax + jQuery datatables. Seems easier to me, perhaps it'll work for you? [link]datatables.netKisaragi

4 Answers

2
votes

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');
}
1
votes
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.

1
votes

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,'',"&amp;");

$this->pagination->initialize($config);
0
votes

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,'',"&amp;");
            $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'] = '&nbsp;<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('&nbsp;',$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/");
    }
}