0

我正在为我的应用程序使用 codeigniter,并使用 HMVC 方法在此处添加包进行开发:

https://bitbucket.org/wiredesignz/codeigniter-modular-extensions-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_view 文件。因此,使用我的 if 语句,我需要它来确定它是否存在于该模块文件夹中的某个位置。

这有帮助吗?

4

2 回答 2

2

如果您想访问不同的模块视图,您可以通过以下方式访问它:

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

如果所有模块都需要它,也可以放在主视图,即应用程序视图中

您可以使用以下方法简单地访问它们:

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

从任何模块。

于 2013-01-16T07:57:43.370 回答
0

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

例如:在尝试加载模块之前检查模块是否有“my_template.php”文件。


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

给定路径:

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

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

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

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

-

$this->load->view('my_module/my_template');

my_template.php将在所有views/my_modules/文件夹中搜索文件

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

所以请注意,如果你想通过调用特定模块的视图

$this->load->view('x_module/my_template');

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

  • application/views/x_module/my_template.php
  • application/modules/x_module/views/x_module/my_template.php

!!注意:如果多个模块具有相同的子文件夹views/x_module/,或者如果您将文件直接放在模块的视图文件夹中,则在视图文件夹中设置具有相同文件名的另一个模块时可能会遇到问题

$this->load-views('my_template');<- 模棱两可

application/modules/x_module/views/my_template.php application/modules/y_module/views/my_template.php

-

$this->load-views('my_module/my_template');<- 模棱两可

application/modules/x_module/views/my_module/my_template.php application/modules/my_module/views/my_template.php

-

$this->load-views('x_module/my_template');<-晶莹剔透!

application/modules/x_module/views/x_module/my_template.php application/modules/y_module/views/y_module/my_template.php


这就是说,这里的问题是检查加载路径中是否存在模板,因此是 if 语句构造。

我在使用 HMVC & CI 和模块时遇到了这个问题,因为$this->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);

希望有帮助

于 2018-03-16T15:09:51.310 回答