代码点火器问题:将变量传递给视图的问题

时间:2011-09-21 09:41:56

标签: php codeigniter

我是CodeIgniter(2.03)的新手,我遇到以下问题:

这是我的主要模板(视图):

<?php $this->load->view('backOffice/bo_header_in'); ?>

<?php $this->load->view($bo_main_content); ?>

<?php $this->load->view('backOffice/bo_footer_in'); ?>

这是我的模特:

<?php

class Back_office_users extends CI_Model 
{

  public function getAllUsers () 
  {
    $query = $this->db->query("SELECT * FROM users");

    if ($query->num_rows() > 0) {
      foreach ($query->result() as $rows) {
        $users[] = $rows;
      }
      return $users; 
    }
  }
}  

这是我的控制器:

<?php

class Dashboard extends CI_Controller 
{

  public function __construct() 
  {
    parent::__construct();
    $this->is_logged_in();
  }

  public function index () 
  {   
    $this->load->model('back_office_users');
    $users['rows'] = $this->back_office_users->getAllUsers();

    $data['bo_main_content'] = "backOffice/dashboard";

    $this->load->view('backOffice/bo_template_in', $data, $users);

   // if I pass the variable like this it works just fine...
   //$this->load->view('backOffice/users', $users);
  }

  public function is_logged_in()
  {
    $is_logged_in = $this->session->userdata('is_logged_in');
    if (!isset($is_logged_in) || ($is_logged_in != true)) {
      $this->accessdenied();   
    }
  }

  public function accessdenied () 
  {    
    $data['bo_main_content'] = 'backOffice/accessdenied';
    $this->load->view('backOffice/bo_template', $data);
  }

  public function logout () 
  {    
    $this->session->sess_destroy();
    redirect('backOffice/index');
  }
}  

仪表板视图如下:

<?php
  print_r($users);
?> 

我收到以下错误:

  

遇到PHP错误

     

严重性:注意

     

消息:未定义的变量:用户

     

文件名:backOffice / dashboard.php

     

行号:9

任何人都可以解释一下如何解决这个问题?我在不使用模板的情况下创建了另一个视图,并打印了数组。

1 个答案:

答案 0 :(得分:3)

您没有将$users变量传递给第二个(嵌套)视图。

我建议将$users添加到$data数组,然后在第一个视图中将$users数组传递给嵌入视图。所以,在你的控制器中:

public function index () {

  /* stuff... */

  $data['users']['rows'] = $this->back_office_users->getAllUsers();

  $data['bo_main_content'] = "backOffice/dashboard";

  /* stuff... */

  $this->load->view('backOffice/bo_template_in', $data);
}

然后在主视图中:

<?php $this->load->view($bo_main_content, $users); ?>

然后在仪表板视图中:

<?php
  print_r($rows);
?>

这是因为在主视图中,如您所知,CodeIgniter会将$data的所有元素转换为变量,因此我们最终会得到$users个变量。 $users是一个包含rows的数组,因此当我们将$users传递到第二个视图时,第二个视图会将$users的所有元素转换为查看变量,因此我们现在可以访问$row