CodeIgniter:基于文件夹和子文件夹的URL结构

时间:2012-04-13 07:25:29

标签: codeigniter

我在使用当前的CodeIgniter时遇到了一些问题。我有一个带有“Pages”控制器的CI安装程序,它从/ views加载静态文件,但它最多只能到1个子文件夹,我想要添加另一个子文件夹。

它几乎可以做到以下几点:

  1. 如果请求的URL段(例如site.com/url)在/ views中作为文件(例如/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文件。
  3. 我想要实现的是在此结构中添加一个新的子文件夹:

    1. 如果我去site.com/url/buy/faq从/ views / url / buy等加载faq.php文件..
    2. 当前的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);
      
      }
      }
      

      你们有什么建议吗?

      提前致谢!

3 个答案:

答案 0 :(得分: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 ...
}

答案 1 :(得分: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';
    }

答案 2 :(得分:0)

  

如果我去site.com/url/buy/faq加载faq.php文件   / views / url / buy等等..

我没有时间检查你的代码,但这是你可以尝试的。 使用路线:

配置/ 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;
    }
}