W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
視圖只是一個網(wǎng)頁或頁面片段,例如頁眉,頁腳,側(cè)邊欄等。實際上,視圖可以靈活地嵌入其他視圖中(在其他視圖內(nèi)部)。
視圖不會被直接調(diào)用,它必須通過控制器加載。請記住,在 MVC 框架中,控制器充當(dāng)交通警察的作用,因此它專門負(fù)責(zé)讀取特定的視圖。 如果你還沒有閱讀過 控制器 頁面,建議你應(yīng)該先看下這個。
使用在控制器這一章里我們所創(chuàng)建的樣例控制器,讓我們?yōu)樗鼊?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']);
數(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。
傳入視圖文件的數(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>
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: