2012-04-13 101 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