Как я могу изменить структуру ссылок, которые генерирует Codeigniter create_links ()? - PullRequest
1 голос
/ 04 октября 2019

Я работаю над небольшим приложением для блогов. Существует четкое разделение между его бэкэндом и его интерфейсом:

  1. Бэкэнд - это API , выполненный с Codeigniter 3, который выплевывает страницы, посты, нумерация страниц и т. д.
  2. Этот API-интерфейс используется AngularJS (v. 1.7.x);

интерфейсконтроллер сообщений выглядит следующим образом:

// All posts
.controller('PostsController', ['$scope', '$http', function($scope, $http){

    //Get current page (?page=2, ?page=3 etc)
    const currPage = window.location.search;

    // Get all the posts on the current page 
    $http.get('api/' + currPage).then(function(response) {

        // Posts
        $scope.posts = response.data.posts;

        // posts pagination
        $scope.pagination = response.data.pagination;
    });
}])

У меня проблема с разбиением на страницы, которую генерирует Codeigniter (API), вызванная тем, что его корень - http://apiblog.com/api/. HTML-код нумерации страниц выглядит следующим образом:

<ul class="pagination">
    <li><a href="http://apiblog.com/api/" data-ci-pagination-page="1" rel="prev">&lsaquo;</a></li>
    <li><a href="http://apiblog.com/api/" data-ci-pagination-page="1" rel="start">1</a></li>
    <li class="active"><span>2</span></li>
    <li><a href="http://apiblog.com/api/?page=3" data-ci-pagination-page="3">3</a></li>
    <li><a href="http://apiblog.com/api/?page=4" data-ci-pagination-page="4">4</a></li>
    <li><a href="http://apiblog.com/api/?page=3" data-ci-pagination-page="3" rel="next">&rsaquo;</a></li>
</ul>

Посмотрев на контроллер внешних сообщений, вы увидите, что ссылки нумерации страниц должны пропустить часть api/. Он должен быть:

<ul class="pagination">
    <li><a href="http://apiblog.com/" data-ci-pagination-page="1" rel="prev">&lsaquo;</a></li>
    <li><a href="http://apiblog.com/" data-ci-pagination-page="1" rel="start">1</a></li>
    <li class="active"><span>2</span></li>
    <li><a href="http://apiblog.com/?page=3" data-ci-pagination-page="3">3</a></li>
    <li><a href="http://apiblog.com/?page=4" data-ci-pagination-page="4">4</a></li>
    <li><a href="http://apiblog.com/?page=3" data-ci-pagination-page="3" rel="next">&rsaquo;</a></li>
</ul>

В контроллере Posts , отвечающем за отображение и разбиение на страницы постов в front-end :

private function _initPagination($path, $totalRows, $query_string_segment = 'page') {
    //load and configure pagination 
    $this->load->library('pagination');
    $config['base_url'] = base_url($path);
    $config['query_string_segment'] = $query_string_segment; 
    $config['enable_query_strings'] =TRUE;
    $config['reuse_query_string'] =TRUE;
    $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("/", $this->Posts_model->get_num_rows());

    $data = $this->Static_model->get_static_data();
    //$data['pagination'] = $this->pagination->get_as_array();
    $data['pagination'] = $this->pagination->create_links();
    $data['pages'] = $this->Pages_model->get_pages();
    $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']);

    // All posts
    $this->output->set_content_type('application/json')->set_output(json_encode($data, JSON_PRETTY_PRINT));
}

В серверной части (приборной панели) код сообщений:

public function index() {

    //load and configure pagination 
    $this->load->library('pagination');
    $config['base_url'] = base_url("/dashboard/posts");
    $config['query_string_segment'] = 'page';
    $config['total_rows'] = $this->Posts_model->get_num_rows();
    $config['per_page'] = 10;

    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->get_data();
    $data['posts'] = $this->Posts_model->get_posts($limit, $offset);
    $data['offset'] = $offset;

    $this->load->view('partials/header', $data);
    $this->load->view('dashboard/posts');
    $this->load->view('partials/footer');
}

Учитывая, что элементы нумерации страниц генерируются «за кулисами» к $data['pagination'] = $this->pagination->create_links();, Iне удалось установить необходимую конфигурацию нумерации страниц.

Как этого добиться?

1 Ответ

1 голос
/ 05 октября 2019

Внутри вашего _initPagination, где у вас есть следующая строка кода

$config['base_url'] = base_url($path);

Вы можете изменить выше на

$config['base_url'] = "http://".$_SERVER['HTTP_HOST'] . $path;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...