Блог Codeigniter 3: как я могу использовать нумерацию страниц из метода index () внутри метода search ()? - PullRequest
0 голосов
/ 16 сентября 2018

Я работаю над базовым приложением блога в 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().

Чего не хватает?

1 Ответ

0 голосов
/ 20 сентября 2018

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