0

CodeIgniter インストールの単純なコントローラーで次の問題があります。

Pages.phpcontrollers/pages.phpコントローラーで URL セグメントを調べ、ディレクトリ内のフォルダーとサブフォルダーから静的ファイルを読み込みます/views/pages

例:

  • 私が持っている場合site.com/buy、それは buy.php フォームをロードします/views/pages
  • URL が の場合はから site.com/buy/goロードされますが、現在はから ロードされますgo.php/views/pages/buysite.com/buyindex.php/views/pages/buy

別のサブフォルダーを追加するように変更されました (例: site.com/buy/go/whyfrom /views/pages/buy/go/why)。

コントローラー:

class Pages extends CI_Controller {

public function __construct() {
    parent::__construct();
    $this->view(); 
}

private function view() {

    $url_string = $this->uri->uri_string();

    if (!file_exists(APPPATH . 'views/pages/'. $url_string. '/index.php')) {
        if (!file_exists(APPPATH . 'views/pages/' . $url_string . '.php')) {
            show_404();
        } else {
            $path = $url_string . '.php';
        }
    } else {
        $path = $url_string . '/index.php';   
    }

    $this->load->view('pages/' . $path);

}

問題は、URL に関係なく 404 が返されることです。

削除するpages/と、$this->load->view別のエラーがスローされます。ファイルを読み込めません。しかし、それはファイルを正しく取得します。(たとえば、buy/go.php, while the URL issite.com/buy/go` を読み込めません)。

4

1 に答える 1

0

何が起こっているのかを確認するために、いくつかの異なることを試してみました。

私が試したすべてのことについて詳細に説明するつもりはありませんが、基本的に変更する必要があるのは 2、3 だけです。を使用して__construct()も、使用しようとしている方法では機能しないようです (つまり、すべてのリクエストを 1 つのメソッドに渡すだけです)。代わりに、すべてのメソッドを手動で指定するか、ルートを使用する必要があります。それが私が行ったことです。

次の行を追加するconfig/routes.phpと、すべてのリクエストがビュー メソッドにリダイレクトされます。

$route['pages/(:any)'] = 'ページ/ビュー';

ルートを設定したら、__construct. pages/残っている唯一のことは、すでに行っている可能性があるパスの一部を削除することです。次のコードを/pages/buy/go/test(3 レベル) までテストしましたが、理論的にはどのネスト レベルでも同じように動作するはずです。

class Pages extends CI_Controller {

    パブリック関数 view()
    {
        $url_string = $this->uri->uri_string();

        if (!file_exists(APPPATH . 'views/'. $url_string. '/index.php'))
        {
            if (!file_exists(APPPATH . 'views/' . $url_string . '.php'))
            {
                show_404();
            }
            そうしないと
            {
                $path = $url_string . '.php';
            }
        }
        そうしないと
        {
            $path = $url_string . '/index.php';   
        }
        $this->load->view($path);
    }
}

.php補足として、どちらの方法でも問題ありませんが、ビューをロードするときにファイル拡張子を追加する必要はありません。

于 2012-04-26T19:12:21.080 に答える