Codeigniter 3 博客:如何在 search() 方法中使用 index() 方法的分页?



我正在 Codeigniter 3.1.8 中开发一个基本的博客应用程序。帖子是分页的。应用程序使用pagination.php配置文件。

有一个用于搜索帖子的搜索框。我希望对搜索结果进行分页,并且由于方法index()search()位于同一个Posts控制器中,因此我正在寻找一种方法,通过在搜索结果中使用index()内的分页来避免代码冗余。

在帖子控制器中,我有:

class Posts extends CI_Controller {
public function __construct() {
parent::__construct();
$this->load->model('Static_model');
$this->load->model('Posts_model');
$this->load->model('Categories_model');
$this->load->model('Comments_model');
}
public function index() {
//load and configure pagination 
$this->load->library('pagination');
$config['base_url'] = base_url("/posts");
$config['query_string_segment'] = 'page';
$config['total_rows'] = $this->Posts_model->get_num_rows();
$config['per_page'] = 12;
if (!isset($_GET[$config['query_string_segment']]) || $_GET[$config['query_string_segment']] < 1) {
$_GET[$config['query_string_segment']] = 1;
}
$limit = $config['per_page'];
$offset = ($this->input->get($config['query_string_segment']) - 1) * $limit;
$this->pagination->initialize($config);
$data = $this->Static_model->get_static_data();
$data['categories'] = $this->Categories_model->get_categories();
$data['posts'] = $this->Posts_model->get_posts($limit, $offset);
$this->load->view('partials/header', $data);
$this->load->view('posts');
$this->load->view('partials/footer');
}
public function search() {
$this->form_validation->set_rules('search', 'Search term', 'required|trim|min_length[3]');
$this->form_validation->set_error_delimiters('<p class = "error search-error"> ', ' </p>
');
// If search fails
if ($this->form_validation->run() === FALSE) {
return $this->index();
} else {
$expression = $this->input->post('search');
$data = $this->Static_model->get_static_data();
$data['categories'] = $this->Categories_model->get_categories();
$data['posts'] = $this->Posts_model->search($expression, $limit, $offset);
$data['expression'] = $expression;
$this->load->view('partials/header', $data);
$this->load->view('search');
$this->load->view('partials/footer');
}
}
}

Posts_model模型包含帖子列表搜索结果的代码:

public function get_posts($limit, $offset) {
$this->db->order_by('id', 'DESC');
$query = $this->db->get('posts', $limit, $offset);
return $query->result();
}
public function search_count($expression) {
$query = $this->db->like('title', $expression)
->or_like('description', $expression)
->or_like('content', $expression);
$query = $this->db->get('posts');
return $query->num_rows();  
}
public function search($expression, $limit, $offset) {
$query = $this->db->like('title', $expression)
->or_like('description', $expression)
->or_like('content', $expression);
$this->db->order_by('posts.id', 'DESC');
$query = $this->db->get('posts', $limit, $offset);
return $query->result();
}

需要明确的是,我想避免将其复制到search()方法中:

$this->load->library('pagination');
$config['query_string_segment'] = 'page';
$config['total_rows'] = $this->Posts_model->get_num_rows();
$config['per_page'] = 12;
if (!isset($_GET[$config['query_string_segment']]) || $_GET[$config['query_string_segment']] < 1) {
$_GET[$config['query_string_segment']] = 1;
}
$limit = $config['per_page'];
$offset = ($this->input->get($config['query_string_segment']) - 1) * $limit;
$this->pagination->initialize($config);

我试图index()借用分页到search()

陷入了困境。缺少什么?

尝试这样的事情:
- 在控制器中创建一个私有方法并将分页初始化代码移动到此处
- 在index()search()中调用私有方法

class Posts extends CI_Controller {
public function __construct() {
parent::__construct();
$this->load->model('Static_model');
$this->load->model('Posts_model');
$this->load->model('Categories_model');
$this->load->model('Comments_model');
}
private function _initPagination($path, $totalRows) {
//load and configure pagination 
$this->load->library('pagination');
$config['base_url'] = base_url($path);
$config['query_string_segment'] = 'page';
//pass $totalRows param to pagination config
$config['total_rows'] = $totalRows;
$config['per_page'] = 12;
if (!isset($_GET[$config['query_string_segment']]) || $_GET[$config['query_string_segment']] < 1) {
$_GET[$config['query_string_segment']] = 1;
}
$this->pagination->initialize($config);
$limit = $config['per_page'];
$offset = ($this->input->get($config['query_string_segment']) - 1) * $limit;
return ['limit' => $limit, 'offset' => $offset];
}
public function index() {
//call initialization method
$config = $this->_initPagination("/posts", $this->Posts_model->get_num_rows());
$data = $this->Static_model->get_static_data();
$data['categories'] = $this->Categories_model->get_categories();
//use limit and offset returned by _initPaginator method
$data['posts'] = $this->Posts_model->get_posts($config['limit'], $config['offset']);
$this->load->view('partials/header', $data);
$this->load->view('posts');
$this->load->view('partials/footer');
}
public function search() {
$this->form_validation->set_rules('search', 'Search term', 'required|trim|min_length[3]');
$this->form_validation->set_error_delimiters('<p class = "error search-error"> ', ' </p>
');
// If search fails
if ($this->form_validation->run() === FALSE) {
return $this->index();
} else {
$expression = $this->input->post('search');
//call initialization method
$config = $this->_initPagination("/search", $this->Posts_model->search_count($expression));
$data = $this->Static_model->get_static_data();
$data['categories'] = $this->Categories_model->get_categories();
//use limit and offset returned by _initPaginator method
$data['posts'] = $this->Posts_model->search($expression, $config['limit'], $config['offset']);
$data['expression'] = $expression;
$this->load->view('partials/header', $data);
$this->load->view('search');
$this->load->view('partials/footer');
}
}
}

相关内容

  • 没有找到相关文章

最新更新