在我的网站上,我有一个“登录提示”,每页都可以看到。我正在使用模板系统,因此每个页面的标题中都会出现此登录提示。
当用户登录时,应显示其用户名和注销链接。当他们没有登录时,会显示登录或注册的链接。
我在MY_Controller中有一个函数,用于检查用户是否在每个页面加载时都登录,并且工作正常:
if($this->is_logged_in()) {
$this->username = $this->session->userdata('username');
$data['login_prompt'] = "Hi, " . $this->username . " " . anchor("account/logout", "Logout");
}
在我的header.php(视图)中,我有:
<div id="login-prompt" class="transparent">
<?php
if (!isset($login_prompt)) $login_prompt = anchor("account/login", "Login") . " or " . anchor("account/register", "register");
echo $login_prompt;
?>
</div>
问题出在我的控制器上。这是ucp.php的构造函数,它扩展了MY_Controller:
public $data;
function __construct()
{
parent::__construct();
$data['login_prompt'] = $this->data['login_prompt'];
}
我希望$data['login_prompt']
在我的控制器的每个方法中都可用,以便将其传递给视图。但是,打印$data['login_prompt']
会出现 'undefined index'
错误,因此header.php中定义的默认“登录或注册”消息始终可见。
ucp.php中的典型方法如下:
function index()
{
$this->template->build("ucp/ucp_view", $data);
}
如您所见,应将$data
数组传递给视图。如果我在方法本身而不是构造函数中定义$data['login_prompt']
,那么:
function index()
{
$data['login_prompt'] = $this->data['login_prompt'];
$this->template->build("ucp/ucp_view", $data);
}
登录提示会更改为正确的已登录邮件。但是,我宁愿不将此行添加到我的应用程序中每个控制器的每个方法中。
我发现的类似问题只是将传递给视图的$data
数组更改为$this->data
,概述了here。这可以工作,但打破了我的应用程序的其他几个部分。
我觉得错误是非常明显的。我做错了什么?
答案 0 :(得分:2)
你有几个选择
您可以在$this->data
上使用MY_Controller
属性,然后确保将$this->data
传递给您的所有观看
// MY_Controller
public $data;
public function __construct()
{
if($this->is_logged_in())
{
$this->username = $this->session->userdata('username');
$this->data['login_prompt'] = "Hi, " . $this->username . " " . anchor("account/logout", "Logout");
}
}
然后在我们的控制器中..
// An example controller. By extending MY_Controller
// We have the data property available
UcpController extends MY_Controller
{
public function __construct()
{
parent::__construct();
}
public function index()
{
$this->data['Some extra variable'] = 'Foo';
// Notice we are giving $this->data rather than $data...
// this means we will have our login prompt included
// as it is set by the parent class
$this->template->build("ucp/ucp_view", $this->data);
}
}
或者,您可以在MY_Controller
中设置全局数组,然后使用load->vars
方法使数组可用于所有视图
// MY_Controller
public $global_data;
public function __construct()
{
if($this->is_logged_in())
{
$this->username = $this->session->userdata('username');
$this->global_data['login_prompt'] = "Hi, " . $this->username . " " . anchor("account/logout", "Logout");
$this->load->vars($this->global_data);
}
}
答案 1 :(得分:1)
尝试在您的视图中将$data['login_prompt']
切换为$login_prompt
。
错误消息'undefined index'指的是'login_prompt'
不是关联数组$data
中的索引。代码点火器将您传递给$this->load->view()
的数组分解。与extract()
的工作方式类似(php docs,ci docs)。
答案 2 :(得分:0)
http://codeigniter.com/user_guide/general/views.html
向左滚动到“向视图添加动态数据”