codeIgniter pagination- doesn't go to the next

2019-04-27 12:56发布

问题:

I am using pagination for searched results. Searching is working perfectly. The first 10 records are shown after the search. But when I click the next button everything disappears and an empty page is displayed.

Any ideas what might be wrong in my code would be appreciated.

Model

function search_bookings($time, $title, $payment, $start_date, $end_date,$limit, $start, $type) {

        $this->db->select('reservations.*');
        $this->db->from('reservations');
        $this->db->where('is_deleted', '0');
        $this->db->order_by('date_cal',"desc");

         if (!empty($time) && !is_null($time)) {
            $this->db->where('reservations.type', $time);
        }
        if (!empty($payment) && !is_null($payment)) {
            $this->db->where('reservations.advanced_payment_status', $payment);
        }

        if (!empty($title) && !is_null($title)) {
            $this->db->where('reservations.title', $title);
        }

        if (!empty($start_date) && !is_null($start_date)) {
            $this->db->where('reservations.date_cal >=', $start_date);
            $this->db->where('reservations.date_cal <=', $end_date);
        }

         if ($type == 'half') {
            $this->db->limit($limit, $start);
        }
        $query = $this->db->get();
        return $query->result();
    }

Controller

 function search_reservations($start = 0) {
        $reservation_service = new Reservation_service();
        $config = array();

        $config["base_url"] = site_url() . "/dashboard/manage_bookings/";
        $config["per_page"] = 10;
        $config["uri_segment"] = 4;
        $config["num_links"] = 4;

        $time = $this->input->post('type', TRUE);
        $title = $this->input->post('title', TRUE);
        $payment = $this->input->post('payment', TRUE);
        $date_from = $this->input->post('date_from', TRUE);
        $date_to = $this->input->post('date_to', TRUE);
        $searched_results = $reservation_service->search_bookings($time, $title, $payment, $date_from, $date_to, $config["per_page"], $start, 'half');
        $data['search_results'] = $searched_results;
        $config["total_rows"] = count($reservation_service->search_bookings($time, $title, $payment, $date_from, $date_to, $config["per_page"], 0, 'all'));
        $this->pagination->initialize($config);

        $data["links"] = $this->pagination->create_links();

        $this->load->view('body_pages/search_results', $data);
    }

Search results view

<table  class="display table table-bordered table-striped" id="bookings_table">
    <thead>
        <tr>
            <th>#</th>
            <th>Date</th>
            <th>Hall</th>
            <th>Time</th>                               
            <th>Actions</th>
        </tr>
    </thead>
    <tbody>
        <?php
        $i = 0;
        foreach ($search_results as $result) {
            ?>
            <tr id="bookings_<?php echo $result->id; ?>">
                <td><?php echo ++$i; ?></td>
                <td><?php echo $result->date_cal; ?></td>
                <td><?php if ("RP" == $result->title) { ?><?php
                        echo "Royal Princess Ballroom (Downstairs)";
                    }
                    ?>
                    <?php if ("GK" == $result->title) { ?><?php
                        echo "Grand Kings Ballroom (Upstairs)";
                    }
                    ?>
                </td>
                <td><?php echo $result->type; ?></td>  
                <td align="center">    
                    <a class="btn btn-primary btn-xs" onclick="display_edit_reservation_pop_up(<?php echo $result->id; ?>)"><i class="fa fa-pencil"  title="Update"></i></a>
                    <a class="btn btn-danger btn-xs" onclick="delete_bookings(<?php echo $result->id; ?>)" ><i class="fa fa-trash-o " title="Remove"></i></a>
                </td>
            </tr>
        <?php } ?>

    </tbody>

</table>

<div class="pagination">
    <?php echo $links; ?>
</div>                                          

回答1:

Hey Hi please find the below controller code with pagination classes

/* start code of pagination */
        $config                     = array();
        $config["base_url"]         = base_url()."cms/manage_cms";
        if (count($_GET) > 0) $config['suffix'] = '?' . http_build_query($_GET, '', "&");
        if (count($_GET) > 0) $config['first_url'] = $config['base_url'].'?'.http_build_query($_GET);
        $page = ($this->uri->segment(3)) ? $this->uri->segment(3) : 0;
        //$page = 0;
        $config["total_rows"]       = count($this->mdl_cms->getAllCmsByCondition($searchindex,$orderField,$orderby,$rowsPerPage,$page,false));

        if($config["total_rows"] < $rowsPerPage){
            $page = 0;
        }
        $config["per_page"]         = $rowsPerPage;
        //$config["uri_segment"]      = 3;
        $config['full_tag_open']    = '<div class="pagination"><ul>';
        $config['full_tag_close']   = '</ul></div><!--pagination-->';

        $config['first_link'] = '&laquo; First';
        $config['first_tag_open'] = '<li class="prev page">';
        $config['first_tag_close'] = '</li>';

        $config['last_link'] = 'Last &raquo;';
        $config['last_tag_open'] = '<li class="next page">';
        $config['last_tag_close'] = '</li>';

        $config['next_link'] = 'Next &rarr;';
        $config['next_tag_open'] = '<li class="next page">';
        $config['next_tag_close'] = '</li>';

        $config['prev_link'] = '&larr; Previous';
        $config['prev_tag_open'] = '<li class="prev page">';
        $config['prev_tag_close'] = '</li>';

        $config['cur_tag_open']     = '<li class="active"><a href="">';
        $config['cur_tag_close']    = '</a></li>';
        $config['num_tag_open']     = '<li class="page">';
        $config['num_tag_close']    = '</li>';

        $this->pagination->initialize($config);  // Load pagination class 


        $usersArr = $this->mdl_cms->getAllCmsByCondition($searchindex,$orderField,$orderby,$rowsPerPage,$page,true); 
        //echo $this->db->last_query(); //die;
        $data["links"] = $this->pagination->create_links(); // Create pagination links

Hope it will work for you



回答2:

Try adding

$config['use_page_numbers'] = TRUE;

And Make

$config['uri_segment'] = 4;

To

$config['uri_segment'] = 3;

Might need to set up your routes.php

$routes['dashboard/manage_bookings/(:any)'] = "dashboard/manage_bookings/$1"

CI2 http://www.codeigniter.com/userguide2/general/routing.html

CI3 http://www.codeigniter.com/user_guide/general/routing.html



回答3:

You are taking the $time, $title, $payment, $date_from, $date_to variables from POST.

The paginiation links are like - home/search_reservations/2

once user clicks on those links the search data from post is lost. you need to keep your search parameters on the record if you want them to affect all the pages.

2 ways to do that-

1) use GET instead of POST. keep your search parameters in the query string of your generated pagination links. This way all the pages will have the search parameters. Also useful if you want to share/bookmark a specific page of the search result. E.g your pages will be linked like -

www.yoursite.com/home/search_reservations/2?time=123&title=123&payment=123&date_from=123&date_to=123 

2) keep the search parameter in session. A lot messier in the code but prettier in the URL.