dqfsbvd43312 2014-02-04 11:59 采纳率: 0%
浏览 62

CodeIgniter不使用控制器和视图的多级子文件夹

I am working in Codeigniter with smarty templates.

Problem is that if i go about 2nd subfolder in view or controller, the Codeigniter stops working...

e-g here

application/controllers/main.php  - works
application/controllers/admin/dashboard.php - works
application/controllers/admin/manageUsers/ListUsers.php - not working

I have searched the web, and they said that i can work with routes, which might do work with controller..

but it is views that i am concern of.. i mean admin views should go under admin folder, but i can not create subfolder in admin, if i put all views in admin folder, it will be a mess, nothing organized. i hope you are understanding what i am trying to say.

e-g

themes/default/views/home.tpl - works
themes/default/views/admin/dashboard.tpl works
themes/default/views/admin/site_settings/preferences.tpl not working

please can anyone guide me how to fix these issues.

  • 写回答

2条回答 默认 最新

  • douwei3863 2014-02-04 13:41
    关注

    Your problem is quite common. I've had it when I started working with CodeIgniter as well. What I found out to be the best way to overcome it, was to create a Custom_Router, which extends the CI_Router class. Doing that allows you to overwrite the controller class include/require logic and allow the usage of subdirs. This is a working example:

    <?php
    
    class Custom_Router extends CI_Router
    {
        public function __construct()
        {
            parent::__construct();
        }
    
        public function _validate_request($segments)
        {
            if (file_exists(APPPATH.'controllers/'.$segments[0].EXT))
            {
                return $segments;
            }
    
            if (is_dir(APPPATH.'controllers/'.$segments[0]))
            {
                $this->set_directory($segments[0]);
                $segments = array_slice($segments, 1);
    
                while(count($segments) > 0 && is_dir(APPPATH.'controllers/'.$this->directory.DIRECTORY_SEPARATOR.$segments[0]))
                {
                    // Set the directory and remove it from the segment array
                    $this->directory = $this->directory . $segments[0] .DIRECTORY_SEPARATOR;
                    $segments = array_slice($segments, 1);
                }
    
    
                if (count($segments) > 0)
                {
                    if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$segments[0].EXT))
                    {
                        show_404($this->fetch_directory().$segments[0]);
                    }
                }
                else
                {
                    $this->set_class($this->default_controller);
                    $this->set_method('index');
    
                    if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$this->default_controller.EXT))
                    {
                        $this->directory = '';
                        return array();
                    }
    
                }
    
                return $segments;
            }
    
            show_404($segments[0]);
        }
    }
    
    ?>
    

    The code above works fine with as many subdirs as you'd want, although I wouldn't advice using this approach. I usually specifically state the path to my controllers in the route.php file.

    Regarding your second problem - the templates. I never liked messy code and even messier viewers which contain <?php echo $something; for(...){}; foreach(){}... ?> all over the place. For me, that makes the code really hard to read and specially harder to debug. That's why I've been using the Twig template engine. There are tutorials how to get it working in CodeIgniter (I've used this one). Once you're done with it, in your controller you would simply need to write:

    class Login extends Custom_Controller
    {
        /**
         * Index Page for this controller.
         */
        public function index() {
            $data = array();
            $error_message = "Invalid user!";
    
            if($this->session->getUserId() != null){
                redirect('/welcome');
            }
    
            // other logic....
    
    
    
            // depending on how you configure twig, this will search for "login.html.twig"
            // in "application/views/". If your file is located somewhere in the subdirs, 
            // you just write the path: 
            //   admin/login.html.twig => application/views/admin/login.html.twig
            $this->twig->display('login.html.twig', $data); 
        }
    }
    

    If Twig is not an option for you, then you will need to create a new class which extends the CI_Loader class and overwrite the public function view(){} method.

    By the way, if you're creating a web application with a backend, you might find it easier to manage and maintain your code if you separate your applications in different directories. If you choose to go this way, you will need to create application/public and application/admin folders preserving the directory structure of a CodeIgniter "application". Here are the steps:

    1. Create separate applications

      /applications
      -- public (a standard application directory structure)
      ---- cache
      ---- config
      ---- controllers
      ---- models
      ---- views
      ---- ...
      -- admin (a standard application directory structure)
      ---- cache
      ---- config
      ---- controllers
      ---- models
      ---- views
      ---- ...
      
    2. Open /index.php and change $application_folder to point to applications/public

    3. Create a copy of /index.php, name it backend.php (or whatever you want). Open the file and change $application_folder to point to the applications/admin folder.

    4. Open .htaccess and add a rule to pass all URI starting with /admin to backend.php

      # Route admin urls
      RewriteCond %{REQUEST_URI} admin([/])?(.*)
      RewriteRule .* backend.php?$1 [QSA,L]
      
    评论

报告相同问题?

悬赏问题

  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)