2012-04-14 67 views
0

我在CodeIgniter安裝中的簡單控制器有以下問題。CodeIgniter控制器給404或它無法加載視圖文件

controllers/pages.php Pages.php控制器查看URL段並從/views/pages目錄內的文件夾和子文件夾加載靜態文件。

實施例:

  • 如果我有site.com/buy,那麼它會加載buy.php形式/views/pages
  • 如果URL是site.com/buy/go,那麼它會加載go.php/views/pages/buy,而site.com/buy現在將index.php from /views/pages/buy

It被改爲添加另一個子文件夾(例如, site.com/buy/go/why from /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); 

} 

的問題是,我收到了404無論URL的。

如果我從$this->load->view刪除pages/它會引發另一個錯誤:無法加載文件;但它確實獲得了正確的文件。 (例如無法加載buy/go.php, while the URL is site.com/buy/go`)。

+0

你確定uri_string()工作正常嗎?它會在index.php – Gerep 2012-04-14 18:54:20

+0

之後返回所有內容我不確定;我不知道如何檢查,因爲我得到404無論URL。有關如何檢查它的任何建議?謝謝。 – Lee 2012-04-14 18:58:09

+0

那麼,在PHP上,你可以使用var_dump(),嘗試在你的構造函數中使用它,只要'var_dump($ this-> uri-> uri_string());退出();',只是爲了確保它返回你所需要的。 – Gerep 2012-04-14 19:00:30

回答

0

我剛剛玩過幾個不同的東西,看看發生了什麼。

我不會對我所嘗試過的所有東西進行大量細節處理,但基本上只有幾件事要改變。使用__construct()似乎並不像您嘗試使用它的方式那樣工作(即僅將所有請求傳遞給一個方法)。相反,你需要手動指定所有的方法或使用路由 - 這就是我所做的。

添加下面一行到你的config/routes.php將重定向到視圖方法的所有請求:

$route['pages/(:any)'] = 'pages/view';

一旦你在的地方沒有必要爲__construct的路線。剩下的唯一東西就是刪除路徑中的pages/部分,這可能已經完成了。我已經測試了以下代碼,最低爲/pages/buy/go/test(3個級別),但理論上它應該在任何嵌套級別上都一樣。

 
class Pages extends CI_Controller { 

    public function 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(); 
      } 
      else 
      { 
       $path = $url_string . '.php'; 
      } 
     } 
     else 
     { 
      $path = $url_string . '/index.php'; 
     } 
     $this->load->view($path); 
    } 
} 

一點題外話,你不需要加載視圖時添加文件擴展名,除非它是其他的東西比.php,不過沒關係無論哪種方式。

相關問題