Php 在HMVC方法中定位视图文件

Php 在HMVC方法中定位视图文件,php,codeigniter,module,hmvc,Php,Codeigniter,Module,Hmvc,我将codeigniter用于我的应用程序,并使用HMVC方法进行开发,添加了以下软件包: 我有一个为我的视图创建的自定义模板,在我的内容视图中有以下几行: if ((!isset($page_view)) || (is_null($page_view)) || (!file_exists(APPPATH . 'views/backend/' . $this->cms_template . '/cpanel/pages/' . $page_view . '.php'))) {

我将codeigniter用于我的应用程序,并使用HMVC方法进行开发,添加了以下软件包:

我有一个为我的视图创建的自定义模板,在我的内容视图中有以下几行:

if ((!isset($page_view)) || (is_null($page_view)) || (!file_exists(APPPATH . 'views/backend/' .     $this->cms_template . '/cpanel/pages/' . $page_view . '.php')))
{
    $this->load->view('backend/' . $this->cms_template . '/cpanel/template/page_unknown_view');
}
else
{
    $this->load->view('backend/' . $this->cms_template . '/cpanel/pages/' . $page_view);
}
?>

当文件夹中有视图时,这种方法有效,但由于我的一些视图将位于HMVC方法的不同文件夹中,因此它始终显示为我的未知页面文件。我应该如何修改以使其与此方法一起工作

编辑:让我尝试重新表述所有这些。这是我的文件系统

/application/views/backend/{templatename}/cpanel/index_view
/application/views/backend/{templatename}/cpanel/template/(header.php, footer.php, content.php)
/application/modules/users/controllers/users
/application/modules/users/views/users_view
假设用户控制器加载cpanel视图作为其主视图页面,主视图页面加载三个模板页面。作为页眉、页脚和内容页。在内容页内部,它执行如上图所示的if语句。它将收到一个变量,该变量确定要加载哪个特定于控制器的视图。在本例中,我希望它加载users\u视图文件。因此,使用if语句,我需要它来确定该模块文件夹中是否存在文件


这有帮助吗?

如果要访问其他模块视图,可以通过以下方式访问:

$this->load->view('module_name/view_file_name');
如果所有模块中都需要,也可以将其放置在主视图(即应用程序视图)中

您只需通过以下方式访问它们:

$this->load->view('view_file_name'); 

从任何模块。

根据我对OP问题的理解,它是关于在尝试加载之前检查视图文件是否存在

在尝试加载模块之前,请检查模块是否有“my_template.php”文件


首先,
load->view()
函数检查加载路径中的每个
视图
文件夹

给定路径:

应用程序/
应用程序/模块/xxxxx/
应用程序/模块/yyyy/

$this->load->view('my_template')

将在所有
视图/
文件夹中搜索
my_template.php
文件

application/views/my_template.php
application/modules/xxxxx/views/my_template.php
application/modules/yyyy/views/my_template.php

-

$this->load->view('my_模块/my_模板')

将在所有
视图/my\u模块/
文件夹中搜索
my\u template.php
文件

application/views/my_module/my_template.php
application/modules/xxxxx/views/my_module/my_template.php
application/modules/yyyy/views/my_module/my_template.php

因此,请注意,如果要通过调用特定模块的视图

$this->load->view('x_模块/my_模板')

您必须在主视图文件夹或模块视图文件夹中创建“x_模块/”子文件夹:

  • application/views/x_module/my_template.php
  • application/modules/x_module/views/x_module/my_template.php
!!注意:如果多个模块具有相同的子文件夹
views/x_module/
,或者如果您将文件直接放在模块的views文件夹中,则在views文件夹中设置具有相同文件名的另一个模块时可能会出现问题

$this->加载视图(“我的模板”)加载视图(“我的_模块/我的_模板”)加载视图(“x_模块/my_模板”)
load->view()
如果文件不存在就会抛出错误,有时您只想检查文件是否可用,而不考虑文件丢失时的错误

因此,我的解决方案是检查CI加载路径中的文件

// set the view I want to load->view()
$relative_view_path = 'x_module/my_template.php';

// retrieve an array of the paths loaded by CI
$pack_path = $this->load->get_package_paths( TRUE );

// set the checker to false
$can_load = FALSE;

// loop the loaded paths
foreach( $pack_path as $path )
{
    // Check if the file exists in the path
    // $path has a ending slash !
    if( file_exists( $path.$relative_view_path ) ) $can_load = TRUE; 
}

// and finally 
if( $can_load == TRUE ) $this->load->view($relative_view_path);

希望这有帮助

你确定你的问题吗?你没有其他有用的信息吗?我没有很好地理解你对这个问题的描述!!file_exists函数正在Codeigniter的原生视图位置文件夹中查找视图文件,但我添加了一个第三方插件,需要弄清楚如何将其应用于it。是的,我得到了,但是我缺少的是你需要什么。我应该如何修改我的if语句。你的意思是:当文件夹中有视图时,这是有效的,但由于我的一些视图将位于不同的文件夹中。。。你是说“不同的文件夹”是一个不同的模块吗?答案不错,但请查看我的帖子编辑以进一步解释。