2010-04-11 73 views
4

基本上对于我的web应用程序,我试图更好地组织它。由于它的那一刻,我每次要加载一个网页,我不得不从我的控制器做它像这样:CodeIgniter/PHP - 从视图中调用视图

 $this->load->view('subviews/template/headerview'); 
    $this->load->view('subviews/template/menuview'); 
    $this->load->view('The-View-I-Want-To-Load'); 
    $this->load->view('subviews/template/sidebar'); 
    $this->load->view('subviews/template/footerview'); 

正如你可以告诉它不是真的很有效。

所以我想我会创建一个'主'视图 - 它被称为template.php。这是模板视图的内容:我想我可以从一个控制器调用它

<?php 
    $view = $data['view']; 

     $this->load->view('subviews/template/headerview'); 
     $this->load->view('subviews/template/menuview'); 
     $this->load->view($view); 
     $this->load->view('subviews/template/sidebar'); 
     $this->load->view('subviews/template/footerview'); 
?> 

然后:

$data['view'] = 'homecontent'; 
    $this->load->view('template',$data); 

不幸的是我根本无法进行这项工作。有没有人有任何解决方法或修复我可以放置到位?我已经尝试在template.php中放置$和view,但这没什么区别。通常的错误是“未定义的变量:数据”或“无法加载视图:$ view.php”等。

谢谢大家!

杰克

回答

13

我相信,你必须:

$view = $data['view']; 

$this->load->view('subviews/template/headerview'); 
$this->load->view('subviews/template/menuview'); 
$this->load->view($view); 
$this->load->view('subviews/template/sidebar'); 
$this->load->view('subviews/template/footerview'); 

你只是需要摆脱线:

$view = $data['view']; 

这是因为,当阵列从控制器传递,视图上的变量可以简单地通过$ view而不是$ data ['view']来访问。这里

+0

谢谢,我会给它一个!我会在几分钟后报告。 – Jack 2010-04-11 16:37:49

+0

非常感谢,完美的作品! :) – Jack 2010-04-11 16:40:15

+0

很高兴听到它 – dd0x 2010-04-11 16:41:05

6

不少建议http://codeigniter.com/forums/viewthread/88335/

我选择了这种方法: 控制器类:

public function __construct() 
{ 
    parent::__construct(); 

    $this->load->vars(array(
     'header' => 'partials/header', 
     'footer' => 'partials/footer', 
    )); 
} 

public function index() 
{  
    $data['page_title'] = 'Page specific title';   
    $this->load->view('my-view', $data); 
} 

查看:

<?php $this->load->view($header, compact('page_title')); ?> 
... blah blah ... 
<?php $this->load->view($footer); ?> 

无需加载在视图中的视图,并通过您的子视图可能使用的任何变量都远非理想。能够使用像Action Filters in Laravel这样的东西可能会更好。