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

时间:2014-02-04 11:59:10

标签: php codeigniter smarty directory-structure

我正在使用智能模板在Codeigniter工作。

问题是如果我在视图或控制器中查看第二个子文件夹,Codeigniter会停止工作...

e-g here

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

我在网上搜索过,他们说我可以使用路由,这可能与控制器一起工作..

但是我关注的是观点。 我的意思是管理员视图应该在管理文件夹下,但我不能在管理员中创建子文件夹,如果我把所有视图放在管理员文件夹中,它将是一个烂摊子,没有组织。我希望你能理解我想说的话。

E-克

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

请任何人都可以指导我如何解决这些问题。

2 个答案:

答案 0 :(得分:1)

你的问题很常见。当我开始使用CodeIgniter时,我已经拥有它了。我发现克服它的最佳方法是创建Custom_Router,扩展CI_Router类。这样做可以覆盖控制器类include / require逻辑并允许使用子目录。这是一个有效的例子:

<?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]);
    }
}

?>

上面的代码适用于你想要的尽可能多的子目录,虽然我不建议使用这种方法。我通常在route.php文件中明确说明控制器的路径。

关于你的第二个问题 - 模板。我从来都不喜欢凌乱的代码甚至是杂乱无章的观众,这些观众到处都是<?php echo $something; for(...){}; foreach(){}... ?>。对我来说,这使代码真的很难阅读,特别难以调试。这就是我一直在使用Twig模板引擎的原因。有一些教程如何让它在CodeIgniter中运行(我使用过this)。一旦完成它,在控制器中你只需要写:

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

如果Twig不是您的选项,那么您需要创建一个新类,该类扩展CI_Loader类并覆盖public function view(){}方法。

顺便说一下,如果您正在创建一个带有后端的Web应用程序,那么如果您将应用程序分隔到不同的目录中,您可能会发现管理和维护代码更容易。如果选择这种方式,则需要创建application/publicapplication/admin个文件夹,保留CodeIgniter“应用程序”的目录结构。以下是步骤:

  1. 创建单独的应用程序

    /applications
    -- public (a standard application directory structure)
    ---- cache
    ---- config
    ---- controllers
    ---- models
    ---- views
    ---- ...
    -- admin (a standard application directory structure)
    ---- cache
    ---- config
    ---- controllers
    ---- models
    ---- views
    ---- ...
    
  2. 打开/index.php并将$application_folder更改为指向applications/public

  3. 创建/index.php的副本,将其命名为backend.php(或任何您想要的名称)。打开文件并将$application_folder更改为指向applications/admin文件夹。

  4. 打开.htaccess并添加规则,将所有以/admin开头的URI传递给backend.php

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

答案 1 :(得分:0)

  1. THIS文件放入application / core /
  2. 文件名必须是MY_Router.php