3

在我的网站上,我有一个在每个页面上都可见的“登录提示”。我正在使用模板系统,因此此登录提示出现在每个页面的标题中。

当用户登录时,它应该显示他们的用户名和注销链接。当他们未登录时,将显示登录或注册的链接。

我在 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概述。这可行,但会破坏我的应用程序的其他几个部分。

我觉得这个错误非常明显。我究竟做错了什么?

4

3 回答 3

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);
    }
}
于 2012-07-08T15:41:45.520 回答
1

尝试在您的视图中切换$data['login_prompt']到。$login_prompt

错误消息“未定义的索引”是指'login_prompt'不是关联数组中的索引$data。代码点火器分解了您传递给的数组$this->load->view()。类似于extract()工作原理(php docs,ci docs)。

于 2012-07-08T15:30:13.543 回答
0

http://codeigniter.com/user_guide/general/views.html

向下滚动大约一半到“将动态数据添加到视图”

于 2012-07-08T15:25:21.233 回答