Нумерация страниц с поиском / фильтром по форме

Я новичок в codeigniter Framework, и я пытаюсь сделать нумерацию страниц с поисковым фильтром.

Я встречал ответы, такие как этот (который не имеет ответа, хотя) и этот который также не имеет отмеченного галочкой ответа, так что я не уверен, что это правильный путь, да еще запутанный.

По умолчанию на странице отображаются все результаты таблицы с использованием нумерации страниц.

Теперь я застрял и попал в беспорядок, так что извините, если есть несколько очевидных ошибок.

Итак, что я пытаюсь сделать здесь, это когда пользователь выбирает значение в раскрывающемся списке и отправляет, скажем, Клиент A, я ожидаю строки, содержащие Customer A из колонкиcustomer только.

Однако после отправки я получаю все результаты и, что еще хуже, в виде обычного текста без заголовка и нижнего колонтитула (отдельные представления). Я понимаю, что это потому, что я не звонил им, но все равно не отображаются те, у кого Customer A только.

Попытка найти простое решение, при котором после отправки формы запрос на разбиение на страницы будет выполняться в соответствии со значением, полученным из формы, и отображать выбранные строки. Кажется, не могу найти ничего, кроме двух ссылок, поэтому я не уверен, правильно ли я фильтрую.

Посмотреть

<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;
}
}

2

Решение

Вам нужно будет внести некоторые изменения в свой код:

Прежде всего, используйте запрос 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'] вам нужно передать общее количество строк, которые присутствуют в вашем текущем запросе, а не в таблице. Так было бы что-то вроде этого:

КОНТРОЛЛЕР:

 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;
}
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector