Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CodeIgniter:基于文件夹和子文件夹的URL结构_Codeigniter - Fatal编程技术网

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

CodeIgniter:基于文件夹和子文件夹的URL结构,codeigniter,Codeigniter,我对当前的CodeIgniter有点问题。我安装了一个带有“Pages”控制器的CI,该控制器从/views加载静态文件,但它只会上升到1个子文件夹,我希望向其中添加另一个子文件夹 它主要做以下几点: class Pages extends CI_Controller { public function view($page = 'index', $sub_page = 'index') { if ($page == 'index') { $path = $page

我对当前的CodeIgniter有点问题。我安装了一个带有“Pages”控制器的CI,该控制器从/views加载静态文件,但它只会上升到1个子文件夹,我希望向其中添加另一个子文件夹

它主要做以下几点:

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);

}
}
  • 如果请求的URL段(例如site.com/URL)作为文件(例如/views/URL.php)在/views中,它将从那里加载它,但是如果URL段(例如URL)实际上是/views中的一个文件夹,它将从该文件夹加载index.php(例如/views/URL/index.php,而URL仍然是site.com/URL)
  • 以上内容与任何其他文件名一起使用,而不仅仅是index.php。如果我有site.com/url/buy,它将从/views/url文件夹加载buy.php文件
  • 我试图实现的是向该结构添加一个子文件夹:

  • 如果我在site.com/url/buy/faq上从/views/url/buy等加载faq.php文件
  • 当前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);
    
    }
    }
    
    你们有什么建议吗

    提前谢谢

    使用该类并将片段转换为目录。大致如下:

      $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';
        }
    
    $i=$this->uri->total_segments();
    $path=APPPATH.“视图/页面”;
    对于($j=2;$juri->段($j);
    }
    如果(!file_存在($path./index.php))){
    如果(!file_存在($path..php”)){
    show_404();
    }否则{
    $path=$path.'.php';
    }
    }否则{
    $path=$path'/index.php';
    }
    
    首先确保路由正确。在
    config/routes.php
    中:

    $route['default_controller'] = "pages";
    
    必须在控制器的construct方法中编写代码,否则需要在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 ...
    }
    
    如果我从site.com/url/buy/faq加载faq.php文件 /视图/url/购买等

    我没有时间检查您的代码,但以下是您可以尝试的内容。 使用路线:

    config/routes.php

    $route['url/buy/(:any)'] = 'pages/view/$1';
    
    controllers/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;
        }
    }
    

    问题是什么?404页面始终存在?是的,它无法与其他子文件夹一起工作。感谢您的代码!我使用了它,几乎使其正常工作,但我确实遇到了一个错误(无法加载请求的文件:views/url/buy/index.php)。该路径是正确的,因此我猜测它将正确加载文件,但我被困在$this->load->view。关于如何编写此加载视图有任何建议吗?@Max I thikn这是我的错误。从
    $path
    变量的开头删除
    视图/
    。不需要它。更新的代码。检查已尝试使用该选项,我得到:找不到您请求的页面。谢谢,但这将意味着手动添加所有路由,并且将有多个文件夹/子文件夹。