使用表单进行搜索/筛选分页


Pagination with search/filter using form

我是新来的编码器框架,我正试图用搜索过滤器做分页。

我遇到过这样的答案(虽然没有答案)和这个也没有勾选答案,所以我不确定这是否是正确的遵循方式,而且很困惑。

默认情况下,页面将显示使用分页的表的所有结果。

现在我陷入了困境,所以如果有一些明显的错误,请原谅我。

所以我在这里要做的是当用户在下拉框中选择一个值并提交时,假设客户a,我期望仅从customer列中包含Customer A的行。

然而,在提交之后,我得到了所有的结果,更糟的是,在没有我的页眉和页脚的纯文本(单独的视图)。我明白这是因为我没有调用它们,但它仍然不显示只有Customer A的那些。

一直试图找到一个简单的解决方案,其中表单提交后,分页查询将根据从表单获得的值执行,并显示所选行。除了这两个链接外,我似乎找不到任何其他链接,所以我不确定我的过滤方式是否正确。

<<p> 视图/strong>
<form method="POST" action='<?php echo base_url("index.php/Home/load_lot_table")?>' class="form-inline">
     <select id="cust_drop_down" name="cust_drop_down" class="form-control input-mini">
         <option value="all">All</option>
         <option value="custA">Customer A</option>
         <option value="custB">Customer B</option>
     </select>
     <input type="submit" class="btn btn-primary purple_button" value="Search">
</form>
控制器

public function on_hold_lot() // Default function to display result 
{
    $data['title'] = 'Search System';
    $this->load->view('templates/normal_header', $data);
    $this->populate_customer_dropdown(); // private
    $this->load_lot_table(); // public
    $this->load->view('templates/legend_footer', $data);
}
public function load_lot_table() // Main pagination function
{
    if(isset($this->input->post))
    {
        $search = array(
        'customer' => $this->input->post('cust_drop_down')
        );
    }
    else
    {
        $search = array(
        'customer' => 'all',
        'stage' => 'all',
        'lot_status' => 'all'
        );
    }
    $config = array();
    $config['base_url'] = base_url()."index.php/Home/on_hold_lot";
    $config['total_rows'] = $this->home_model->record_count();
    $config['per_page'] = 10;
    $config['uri_segment'] = 3;
    $config['next_link'] = 'Next';
    $config['prev_link'] = 'Previous';
    $this->pagination->initialize($config);
    $page = ($this->uri->segment(3)) ? $this->uri->segment(3) : 0;
    $results = $this->home_model->fetch_lots($config['per_page'], $page, $search);
    $data['disp_rows'] = $results;
    $data['links'] = $this->pagination->create_links();
    return $this->load->view('home/lot_disposition', $data);
}

public function record_count()
{
    return $this->db->count_all('disp_dummy');
}
public function fetch_lots($limit, $start, $search = null)
{
    $this->db->limit($limit, $start);
    if($search != null && $search['customer'] != 'all')
    {
        $this->db->where('customer', $search['customer']);
    }
    $query = $this->db->get('disp_dummy');
    if($query->num_rows() > 0)
    {
        foreach($query->result() as $row)
        {
            $data[] = $row;
        }
        return $data;
    }
    else
    {
        return false;
    }
}

你需要对你的代码做一些修改:

首先使用GET请求提交你的搜索,因为你不会在第二页获得张贴的参数分页:

视图:

<form method="GET" action='<?php echo base_url("index.php/Home/load_lot_table")?>' class="form-inline">
     <select id="cust_drop_down" name="cust_drop_down" class="form-control input-mini">
         <option value="all">All</option>
         <option value="custA">Customer A</option>
         <option value="custB">Customer B</option>
     </select>
     <input type="submit" class="btn btn-primary purple_button" value="Search">
</form>

在您的控制器中,您必须检查get值而不是post值。同样在$config['total_rows']中,您需要传递当前查询中而不在表中出现的行的总数。它应该是这样的:

CONTROLLER:

 public function load_lot_table() // Main pagination function
{
    if($this->input->get('cust_drop_down'))
    {
        $search = array(
        'customer' => $this->input->get('cust_drop_down')
        );
    }
    else
    {
        $search = array(
        'customer' => 'all',
        'stage' => 'all',
        'lot_status' => 'all'
        );
    }
    $config = array();
    $config['base_url'] = base_url()."index.php/Home/on_hold_lot";
    $config['total_rows'] = $this->home_model->fetch_lots($search)->num_rows();
    $config['per_page'] = 10;
    $config['uri_segment'] = 3;
    $config['next_link'] = 'Next';
    $config['prev_link'] = 'Previous';
    $this->pagination->initialize($config);
    $page = ($this->uri->segment(3)) ? $this->uri->segment(3) : 0;
    $results = $this->home_model->fetch_lots($search, $config['per_page'], $page)->result_array();
    $data['disp_rows'] = $results;
    $data['links'] = $this->pagination->create_links();
    return $this->load->view('home/lot_disposition', $data);
}

在你的模型中对搜索函数做如下修改:

public function fetch_lots($search = null, $limit = null, $start = 0)
{
   if($limit != null){
       $this->db->limit($limit, $start);
    }

    if($search != null && $search['customer'] != 'all')
    {
        $this->db->where('customer', $search['customer']);
    }
    $query = $this->db->get('disp_dummy');
    if($query->num_rows() > 0)
    {
       return $query;
    }
    else
    {
        return false;
    }
}