在CodeIgniter中从控制器向视图传递变量

21

我刚接触 Codeigniter 和 OOP PHP。

控制器:

public function index(){
    $this->load->model('main_model');
    $planet = $this->main_model->solar();
    $this->load->view('main_view', $planet);    
    }
如果在控制器中使用echo $planet则会按预期执行。如果在视图中使用echo $planet,则会出现未定义的变量错误。$planet不是一个数组。为什么$planet变量没有传递到视图中?
我知道这是一个简单的基础问题,我感到很尴尬,因为我无法弄清楚自己做错了什么。
编辑:好吧,在更多的调试之后,我让它工作了。变量只有当它们被格式化为数组时才能从控制器传递到视图中吗?

1
下面的答案都是正确的。CodeIgniter用户指南非常有用。用户指南中此页面关于“向视图添加动态数据”的内容与您的问题相关。 - jleft
变量可以通过对象数组从控制器传递到视图。 - jleft
@user1616244 请接受这些答案中的一个。 - Pramod Kumar Sharma
@jleft,那些超链接似乎已经失效了。 - mickmackusa
4个回答

31

你需要将一个数组传递给视图。CodeIgniter会自动使$planet对你可用。

$data = array('planet' => $planet);
$this->load->view('main_view', $data);

使用这个方法,你可以在视图中使用$planet

例如,如果你执行以下操作:

$data = array('foo' => 'Hello', 'bar' => 'world');
$this->load->view('main_view', $data);

$foo$bar将在您的视图中可用。数组中的键值对会自动转换为视图中的变量。


这也是控制器向模型传递变量以及从模型返回控制器所需的方式吗? - user1616244
不需要,你可以直接调用模型函数并将其保存在变量中。就像你已经在代码中做的那样:$planet = $this->main_model->solar(); - Mischa
非常感谢大家的帮助。我知道这是一个相当基础的问题。OOP PHP似乎很容易,但学习和理解MVC模型对我来说有些困难。 - user1616244
@Mischa先生,如何在视图页面中访问这个$data = array('foo' => 'Hello', 'bar' => 'world'); - KUMAR
@KUMAR,它成为视图中的一个变量,因此是$foo$bar - Mischa

13
您可以将数组或对象传递给视图。然后,您可以在视图中将数组键作为变量访问。

控制器

数组

public function index()
{
    $this->load->model('main_model');
    $planet_data['planet'] = $this->main_model->solar();
    $this->load->view('main_view', $planet_data);
}

对象

public function index()
{
    $this->load->model('main_model');
    $planet_data = new stdClass(); //Creates a new empty object
    $planet_data->planet = $this->main_model->solar();
    $this->load->view('main_view', $planet_data);
}

来自CodeIgniter用户手册(链接已失效): 注意:如果您使用对象,类变量将被转换为数组元素。

视图

无论您如何传递数据,都可以像这样显示:

<?php echo $planet; ?>

如果它是一个数组,那么您需要遍历它。如果是一个对象,则访问其成员变量。
在我的经验中,使用数组比使用对象更为常见。

我已经阅读了有关在CodeIgniter中从控制器传递值到视图的详细指南。链接为http://www.cloudways.com/blog/how-to-pass-data-in-codeigniter/。 - Owais Alam

1

试试这样:

public function index(){
    $this->load->model('main_model');
    $data['planet'] = $this->main_model->solar();
    $this->load->view('main_view', $data);    
}

在您的观点下,您可以访问"$planet"


1
如果模态框包含数组响应:
public function solar() {
   $data['earth'] = 'Earth';
   $data['venus'] = 'Venus';
   return $data;
}

然后您可以像这样查看数据:

public function index(){
    $this->load->model('main_model');
    $planet = $this->main_model->solar();
    $this->load->view('main_view', $planet);    
}

但是在视图中,您将可以访问像这样的数据:
echo $earth;
echo $venus;

如果您不知道将会得到什么响应,则可以使用以下代码:

public function index(){
    $this->load->model('main_model');
    $planet['planet'] = $this->main_model->solar();
    $this->load->view('main_view', $planet);    
}

在视图文件中,您可以像这样访问数据:
print_r($planet);

如果您不知道将会显示什么数据,只需在视图中使用以下代码:
print_r($this->_ci_cached_vars);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接