web-dev-qa-db-ja.com

CodeigniterとAngularJSのバグ:アプリケーションがルートディレクトリにない場合、ページネーションが機能しない

私はブログアプリケーションCodeigniter 3.1.8AngularJS v1.7.8で作業しています。

アプリケーションのダッシュボードは、「純粋な」Codeigniterであり、モデル、コントローラー、ビューを備えていますが、前面は、AngularJSによって管理および表示されるJSONで構成されています。 (「テーマ」を有効にするために、バックエンドとフロントエンドの間でこの明確な分離を操作しました。)

投稿はページ分割されます。バックエンドのPostsコントローラーでは、投稿リストは次のようになります。

_private function _initPagination($path, $totalRows, $query_string_segment = 'page') {
  //load and configure pagination 
    $this->load->library('pagination');
    $config['base_url'] = "http://".$_SERVER['HTTP_Host'] . $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->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));
}
_

フロントエンドのAngularJSでは、

_ // 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) {

        //Categories
        $scope.categories = response.data.categories;

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

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

    });
}])
_

問題は、アプリケーションがルートディレクトリ(www.examplesite.com/blogにあり、wwwではない)にnotがある場合、ページ付けが機能しない(リンクが間違ったリンクを指している)ことです。 .examplesite.com)。

Codeigniterのbase_url()を実行するために何か問題があると思いますが、バグを特定して修正することができませんでした。

この問題を解決するにはどうすればよいですか?

5
Razvan Zamfir

問題はここにあります:

$config['base_url'] = "http://".$_SERVER['HTTP_Host'] . $path;

$_SERVER['HTTP_Host']は常に他のディレクトリのないルートです。

あなたは次のようなものを使う必要があります:

$config['base_url'] = str_replace("/api/", "/", base_url()) . $path;

しかし、私はあなたにあなたのフロントエンド(Angular)でページネーションを実装することをお勧めします、そしてCIではあなたは次のようなものだけが必要です:

public function index($offset, $limit) {
    $data = [];
    $data['count'] = $this->Posts_model->get_num_rows();
    $data['pages'] = $this->Pages_model->get_pages();
    $data['categories'] = $this->Categories_model->get_categories();  
    $data['posts'] = $this->Posts_model->get_posts($limit, $offset);

    $this->output->set_content_type('application/json')->set_output(json_encode($data,JSON_PRETTY_PRINT));
}
1
Doru D.