CodeIgniter4 視圖

2020-08-17 15:31 更新

視圖只是一個網(wǎng)頁或頁面片段,例如頁眉,頁腳,側(cè)邊欄等。實際上,視圖可以靈活地嵌入其他視圖中(在其他視圖內(nèi)部)。

視圖不會被直接調(diào)用,它必須通過控制器加載。請記住,在 MVC 框架中,控制器充當(dāng)交通警察的作用,因此它專門負(fù)責(zé)讀取特定的視圖。 如果你還沒有閱讀過 控制器 頁面,建議你應(yīng)該先看下這個。

使用在控制器這一章里我們所創(chuàng)建的樣例控制器,讓我們?yōu)樗鼊?chuàng)建一個視圖。

創(chuàng)建視圖

使用你的文本編輯器,創(chuàng)建一個 BlogView.php 文件,代碼如下:

<html>
<head>
    <title>My Blog</title>
</head>
<body>
    <h1>Welcome to my Blog!</h1>
</body>
</html>

將文件保存到 app/Views 文件夾。

顯示視圖

要加載并且顯示指定的視圖文件,你需要用到下面的方法:

echo view('name');

name 是視圖文件的名稱。

重要

如果你省略了文件的擴展名,那么框架會默認(rèn)該文件以 .php 擴展名結(jié)尾。

現(xiàn)在,打開你之前創(chuàng)建的 Blog.php 這個控制器文件,并將 echo 語句替換為 view 方法,以完成顯示視圖的功能:

<?php namespace App\Controllers;


class Blog extends \CodeIgniter\Controller
{
        public function index()
        {
                echo view('BlogView');
        }
}

如果你使用之前訪問網(wǎng)站的 URL 來重新訪問站點,你應(yīng)該會看到新的視圖。這個 URL 類似以下的內(nèi)容:

example.com/index.php/blog/

注解

盡管所有示例都是直接顯示視圖內(nèi)容,但是你也可以讓視圖內(nèi)容的結(jié)果返回給控制器;并將其添加到所有已捕獲的輸出內(nèi)容中。(譯者注:即不是直接輸出而是返回一個字符串用作后續(xù)使用)

加載多個視圖

CodeIgniter 可以智能的處理在控制器中多次調(diào)用 view() 方法。如果出現(xiàn)了多次調(diào)用,它們將被合并到一起。例如,你可能希望有一個 頁頭視圖、 一個菜單視圖,一個內(nèi)容視圖 以及 一個頁腳視圖。代碼看起來應(yīng)該這樣:

<?php namespace App\Controllers;


class Page extends \CodeIgniter\Controller
{
        public function index()
        {
                $data = [
                        'page_title' => 'Your title'
                ];


                echo view('header');
                echo view('menu');
                echo view('content', $data);
                echo view('footer');
        }
}

在上面的例子中,我們使用了 “添加動態(tài)數(shù)據(jù)” ,我們會在后面講到。

在子目錄中存儲視圖

如果你喜歡這樣的組織形式,則視圖文件可以保存到子目錄中。當(dāng)你這樣做時,加載視圖時需要包含子目錄的名字,例如:

echo view('directory_name/file_name');

命名空間視圖

您可以將視圖存儲在已命名空間的 View 目錄下,并像加載加載命名空間一樣加載視圖。雖然 PHP 不支持在命名空間下加載非類文件,但是 CodeIgniter 提供了此功能,使你可以將它們以類似于模塊的方式打包在一起,以便于重用或分發(fā)。

如果您在 自動加載 文件 PSR-4 數(shù)組中設(shè)置 Blog 目錄在 Example\Blog 命名空間下,則可 以像使用命名空間一樣找到視圖文件。下面的示例就是通過在名稱空間前添加視圖名稱來從 /blog/views 目錄下加載 BlogView 文件:

echo view('Example\Blog\Views\BlogView');

注解

譯者注 這段有點難懂,需要和 模塊 章節(jié)一起看會比較容易懂。我的理解:框架中視圖文件默認(rèn)在 app/Views 目錄下,當(dāng)然這個也是可以通過 app/Config/Paths.php 類的 $viewDirectory 屬性進行更改的。那么如果我們使用了 modules 功能把 Blog 模塊獨立出來,視圖文件也是可以正常加載的,那么就需要在 app/Config/Autoload.php 文件中設(shè)定好映射目錄,然后就可以通過命名空間的形式來加載視圖文件了。

緩存視圖

你可以通過 view 方法的第三個參數(shù) cache 選項來實現(xiàn)視圖緩存功能,緩存的實際單位是秒:

// 視圖會緩存 60 秒
echo view('file_name', $data, ['cache' => 60]);

默認(rèn)情況下,緩存視圖的文件名與視圖文件名相同。不過,你可以通過傳遞 cache_name 參數(shù)對緩存文件名進行自定義:

// 視圖會緩存 60 秒
echo view('file_name', $data, ['cache' => 60, 'cache_name' => 'my_cached_view']);

視圖中顯示動態(tài)數(shù)據(jù)

數(shù)據(jù)通過視圖方法的第二個參數(shù)從控制器傳遞到視圖,這是一個例子:

$data = [
        'title'   => 'My title',
        'heading' => 'My Heading',
        'message' => 'My Message'
];


echo view('blogview', $data);

讓我們打開你的控制器文件,并添加一下代碼:

<?php namespace App\Controllers;


class Blog extends \CodeIgniter\Controller
{
        public function index()
        {
                $data['title']   = "My Real Title";
                $data['heading'] = "My Real Heading";


                echo view('blogview', $data);
        }
}

現(xiàn)在打開視圖文件,并將文本更改為與數(shù)據(jù)中的數(shù)組鍵對應(yīng)的變量:

<html>
<head>
    <title><?= $title ?></title>
</head>
<body>
    <h1><?= $heading ?></h1>
</body>
</html>

現(xiàn)在重新刷新頁面,你應(yīng)該會看到變量已經(jīng)替換成數(shù)據(jù)中的值。

默認(rèn)情況下,傳遞的數(shù)據(jù)只在當(dāng)前調(diào)用 view 中可用。如果在一次請求中多次調(diào)用該方法,則必須將所需的數(shù)據(jù)傳遞給每個視圖。這樣可以防止 數(shù)據(jù)顯示/覆蓋到其他視圖中的數(shù)據(jù)而導(dǎo)致出現(xiàn)問題。如果你想保留數(shù)據(jù),則可以將 saveData 選項傳遞到第三個參數(shù)的 $option 數(shù)組中:

$data = [
        'title'   => 'My title',
        'heading' => 'My Heading',
        'message' => 'My Message'
];


echo view('blogview', $data, ['saveData' => true]);

另外,如果您希望 view 方法的默認(rèn)功能是在調(diào)用之間保存數(shù)據(jù),則可以在 app/Config/Views.php 中將 $saveData 設(shè)置為 true。

創(chuàng)建循環(huán)

傳入視圖文件的數(shù)據(jù)不僅僅限制為普通的變量,你還可以傳入多維數(shù)組,這樣你就可以在視圖中生成多行了。例如,如果你從數(shù)據(jù)庫中獲取數(shù)據(jù), 一般情況下數(shù)據(jù)都是一個多維數(shù)組。

這里是個簡單的例子,將它添加到你的控制器中:

<?php namespace App\Controllers;


class Blog extends \CodeIgniter\Controller
{
        public function index()
        {
                $data = [
                        'todo_list' => ['Clean House', 'Call Mom', 'Run Errands'],
                        'title'     => "My Real Title",
                        'heading'   => "My Real Heading"
                ];


                echo view('blogview', $data);
        }
}

現(xiàn)在打開視圖文件并創(chuàng)建一個循環(huán):

<html>
<head>
        <title><?= $title ?></title>
</head>
<body>
        <h1><?= $heading ?></h1>


        <h3>My Todo List</h3>


        <ul>
        <?php foreach ($todo_list as $item):?>


                <li><?= $item ?></li>


        <?php endforeach;?>
        </ul>


</body>
</html>
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號