3

私の Web サイトには、すべてのページに表示される「ログイン プロンプト」があります。テンプレート システムを使用しているため、このログイン プロンプトは各ページのヘッダーに表示されます。

ユーザーがログインすると、ユーザー名とログアウトへのリンクが表示されます。ログインしていない場合は、ログインまたは登録へのリンクが表示されます。

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>

問題は私のコントローラーにあります。MY_Controller を拡張する ucp.php のコンストラクターを次に示します。

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。Code igniter は、渡された配列を分割します$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 に答える