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
Php CodeIgniter无法同时处理控制器和视图的多级子文件夹_Php_Codeigniter_Smarty_Directory Structure - Fatal编程技术网

Php CodeIgniter无法同时处理控制器和视图的多级子文件夹

Php CodeIgniter无法同时处理控制器和视图的多级子文件夹,php,codeigniter,smarty,directory-structure,Php,Codeigniter,Smarty,Directory Structure,我在使用smarty模板的Codeigniter中工作 问题是,如果我转到视图或控制器中的第二个子文件夹,Codeigniter将停止工作 这里是e-g application/controllers/main.php - works application/controllers/admin/dashboard.php - works application/controllers/admin/manageUsers/ListUsers.php - not working 我在网上搜索过,

我在使用smarty模板的Codeigniter中工作

问题是,如果我转到视图或控制器中的第二个子文件夹,Codeigniter将停止工作

这里是e-g

application/controllers/main.php  - works
application/controllers/admin/dashboard.php - works
application/controllers/admin/manageUsers/ListUsers.php - not working
我在网上搜索过,他们说我可以使用routes,也可以使用controller

但我关心的是这些观点。。 我的意思是管理视图应该放在管理文件夹下,但我不能在管理中创建子文件夹,若我把所有视图都放在管理文件夹中,那个将是一个混乱,并没有组织。我希望你能理解我想说的话

e-g


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

您的问题很常见。当我开始使用CodeIgniter时,我也有过这种感觉。我发现克服它的最佳方法是创建一个
Custom_Router
,它扩展了
CI_Router
类。这样做允许您覆盖控制器类include/require逻辑并允许使用subdir。这是一个工作示例:

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

?>
如果Twig不是您的选项,那么您需要创建一个新类来扩展
CI_加载器
类,并覆盖
public function view(){}
方法

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

  • 创建单独的应用程序

    /applications
    -- public (a standard application directory structure)
    ---- cache
    ---- config
    ---- controllers
    ---- models
    ---- views
    ---- ...
    -- admin (a standard application directory structure)
    ---- cache
    ---- config
    ---- controllers
    ---- models
    ---- views
    ---- ...
    
  • 打开
    /index.php
    并将
    $application\u文件夹更改为指向
    applications/public

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

  • 打开
    .htaccess
    并添加一条规则,将以
    /admin
    开头的所有URI传递到
    backend.php

    # Route admin urls
    RewriteCond %{REQUEST_URI} admin([/])?(.*)
    RewriteRule .* backend.php?$1 [QSA,L]
    
  • 将文件放入应用程序/核心/
  • 文件名必须是MY_Router.php

  • 您正在使用模板库吗?查看文件的文件夹结构对我来说似乎很奇怪。在您的
    管理员
    控制器中,您正在执行
    功能管理($site\u settings,$preferences)
    ;您是否尝试过编辑
    config/route.php
    文件并添加
    $route['admin/(.*)]='admin/$1'?另一种方法是添加一个
    Custom_Router
    ,它扩展了
    CI_Router
    ,并更改
    require/include
    逻辑。你试过了吗?
    /applications
    -- public (a standard application directory structure)
    ---- cache
    ---- config
    ---- controllers
    ---- models
    ---- views
    ---- ...
    -- admin (a standard application directory structure)
    ---- cache
    ---- config
    ---- controllers
    ---- models
    ---- views
    ---- ...
    
    # Route admin urls
    RewriteCond %{REQUEST_URI} admin([/])?(.*)
    RewriteRule .* backend.php?$1 [QSA,L]