2012-04-13 235 views
3

我對當前的CodeIgniter有點問題。我有一個CI安裝與「頁面」控制器從/視圖加載靜態文件,但它只能上升到1個子文件夾,我正在尋找添加另一個子文件夾。CodeIgniter:基於文件夾和子文件夾的URL結構

幾乎是它具有下列功能:

  1. 如果URL請求段(例如site.com/url)是/意見的文件(例如/views/url.php),它會加載它從那裏,但如果URL段(例如URL)實際上是一個文件夾裏面/意見它會加載該文件夾中的index.php(例如/views/url/index.php,而URL仍然是site.com/url)。
  2. 以上內容與任何其他名稱的文件並不只是index.php。如果我有site.com/url/buy,它會從/ views/url文件夾中加載buy.php文件。

我試圖做到的,是一個新的子文件夾添加到該結構:

  1. 如果我去site.com/url/buy/faq加載faq.php從文件/視圖/ URL /購買等..

目前Pages.php控制器如下:

class Pages extends CI_Controller { 

public function view($page = 'index', $sub_page = 'index') { 

    if ($page == 'index') { 
     $path = $page . '.php'; 
    } else { 
     $path = $page . '/' . $sub_page . '.php'; 
    }  

    if (!file_exists('application/views/pages/' . $path)) { 
     if (!file_exists('application/views/pages/' . $page . '.php')) { 
      show_404(); 
     } else { 
      $path = $page . '.php'; 
     } 
    } 

    // $this->output->cache(60); 
    // $this->output->enable_profiler(TRUE); 

    $data['title'] = ucfirst($page); 
    $data['url'] = lcfirst($page); 

    $this->load->view('pages/modules/header', $data); 
    $this->load->view('pages/'. $path, $data); 
    $this->load->view('pages/modules/footer', $data); 

} 
} 

。你們有什麼建議?

在此先感謝!

+0

是什麼問題?總是404頁面? – safarov 2012-04-13 07:32:36

+0

是的,它不會與另一個子文件夾一起使用。 – Lee 2012-04-13 07:35:50

回答

0

使用URI類並將段轉換爲目錄。東西大致是這樣的:

$i = $this->uri->total_segments(); 
    $path = APPPATH."views/pages"; 
    for($j=2;$j<$i;$j++){ 
    $path = $path . "/" . $this->uri->segment($j); 
    } 
    if (!file_exists($path . "/index.php")) { 
     if (!file_exists($path . ".php")) { 
      show_404(); 
     } else { 
      $path = $path . '.php'; 
     } 
    }else{ 
      $path = $path . '/index.php'; 
    } 
1

首先確保您有正確的路由。在config/routes.php

$route['default_controller'] = "pages"; 

你必須寫在控制器的constuct方法的代碼,否則你將需要在URL添加方法名。在Pages.php

class Pages extends CI_Controller { 

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

    private function view() { 

     $url_string = $this->uri->uri_string(); //get all parameters form url 

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

    //here codes continue ... 
} 
+0

感謝您的代碼!我使用它,幾乎使它工作,但我得到一個錯誤(無法加載所需的文件:views/url/buy/index.php)。該路徑是正確的,所以我的猜測是它會正確加載文件,但我堅持在$ this-> load-> view。有關如何編寫此加載視圖的任何建議? – Lee 2012-04-13 08:31:49

+0

@Max我thikn這是我的錯誤。從'$ path' varibale開始移除'views /'。沒有必要。更新的代碼。檢查 – safarov 2012-04-13 08:37:55

+0

已經嘗試過,我得到:您請求的頁面未找到。 – Lee 2012-04-13 08:42:21

0

如果我去site.com/url/buy/faq加載從 /視圖/ URL的faq.php文件/購買等..

我沒有時間檢查你的代碼,但這裏是你可以嘗試的。 使用路線:

的config/routes.php文件

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

控制器/ pages.php

class Pages extends CI_Controller { 

function __construct() { 

    parent::__construct(); 
} 

function view($page) { 

    if(!file_exist(APPPATH . "views/pages/{$page}.php") { 

     $this->load->view("pages/{$page}"); 
    } 
    else { 
     show_404; 
    } 
} 
+0

謝謝,但這意味着要手動添加所有的路線,它將是幾個文件夾/子文件夾。 – Lee 2012-04-13 13:05:49