W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
視圖只是一個(gè)網(wǎng)頁(yè)或頁(yè)面片段,例如頁(yè)眉,頁(yè)腳,側(cè)邊欄等。實(shí)際上,視圖可以靈活地嵌入其他視圖中(在其他視圖內(nèi)部)。
視圖不會(huì)被直接調(diào)用,它必須通過(guò)控制器加載。請(qǐng)記住,在 MVC 框架中,控制器充當(dāng)交通警察的作用,因此它專門負(fù)責(zé)讀取特定的視圖。 如果你還沒(méi)有閱讀過(guò) 控制器 頁(yè)面,建議你應(yīng)該先看下這個(gè)。
使用在控制器這一章里我們所創(chuàng)建的樣例控制器,讓我們?yōu)樗鼊?chuàng)建一個(gè)視圖。
使用你的文本編輯器,創(chuàng)建一個(gè) BlogView.php
文件,代碼如下:
<html>
<head>
<title>My Blog</title>
</head>
<body>
<h1>Welcome to my Blog!</h1>
</body>
</html>
將文件保存到 app/Views 文件夾。
要加載并且顯示指定的視圖文件,你需要用到下面的方法:
echo view('name');
name 是視圖文件的名稱。
重要
如果你省略了文件的擴(kuò)展名,那么框架會(huì)默認(rèn)該文件以 .php 擴(kuò)展名結(jié)尾。
現(xiàn)在,打開(kāi)你之前創(chuàng)建的 Blog.php
這個(gè)控制器文件,并將 echo 語(yǔ)句替換為 view 方法,以完成顯示視圖的功能:
<?php namespace App\Controllers;
class Blog extends \CodeIgniter\Controller
{
public function index()
{
echo view('BlogView');
}
}
如果你使用之前訪問(wèn)網(wǎng)站的 URL 來(lái)重新訪問(wèn)站點(diǎn),你應(yīng)該會(huì)看到新的視圖。這個(gè) URL 類似以下的內(nèi)容:
example.com/index.php/blog/
注解
盡管所有示例都是直接顯示視圖內(nèi)容,但是你也可以讓視圖內(nèi)容的結(jié)果返回給控制器;并將其添加到所有已捕獲的輸出內(nèi)容中。(譯者注:即不是直接輸出而是返回一個(gè)字符串用作后續(xù)使用)
CodeIgniter 可以智能的處理在控制器中多次調(diào)用 view()
方法。如果出現(xiàn)了多次調(diào)用,它們將被合并到一起。例如,你可能希望有一個(gè) 頁(yè)頭視圖、 一個(gè)菜單視圖,一個(gè)內(nèi)容視圖 以及 一個(gè)頁(yè)腳視圖。代碼看起來(lá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');
}
}
在上面的例子中,我們使用了 “添加動(dòng)態(tài)數(shù)據(jù)” ,我們會(huì)在后面講到。
如果你喜歡這樣的組織形式,則視圖文件可以保存到子目錄中。當(dāng)你這樣做時(shí),加載視圖時(shí)需要包含子目錄的名字,例如:
echo view('directory_name/file_name');
您可以將視圖存儲(chǔ)在已命名空間的 View 目錄下,并像加載加載命名空間一樣加載視圖。雖然 PHP 不支持在命名空間下加載非類文件,但是 CodeIgniter 提供了此功能,使你可以將它們以類似于模塊的方式打包在一起,以便于重用或分發(fā)。
如果您在 自動(dòng)加載 文件 PSR-4 數(shù)組中設(shè)置 Blog
目錄在 Example\Blog
命名空間下,則可 以像使用命名空間一樣找到視圖文件。下面的示例就是通過(guò)在名稱空間前添加視圖名稱來(lái)從 /blog/views 目錄下加載 BlogView 文件:
echo view('Example\Blog\Views\BlogView');
注解
譯者注 這段有點(diǎn)難懂,需要和 模塊 章節(jié)一起看會(huì)比較容易懂。我的理解:框架中視圖文件默認(rèn)在 app/Views 目錄下,當(dāng)然這個(gè)也是可以通過(guò) app/Config/Paths.php 類的$viewDirectory
屬性進(jìn)行更改的。那么如果我們使用了 modules 功能把 Blog 模塊獨(dú)立出來(lái),視圖文件也是可以正常加載的,那么就需要在 app/Config/Autoload.php 文件中設(shè)定好映射目錄,然后就可以通過(guò)命名空間的形式來(lái)加載視圖文件了。
你可以通過(guò) view
方法的第三個(gè)參數(shù) cache
選項(xiàng)來(lái)實(shí)現(xiàn)視圖緩存功能,緩存的實(shí)際單位是秒:
// 視圖會(huì)緩存 60 秒
echo view('file_name', $data, ['cache' => 60]);
默認(rèn)情況下,緩存視圖的文件名與視圖文件名相同。不過(guò),你可以通過(guò)傳遞 cache_name
參數(shù)對(duì)緩存文件名進(jìn)行自定義:
// 視圖會(huì)緩存 60 秒
echo view('file_name', $data, ['cache' => 60, 'cache_name' => 'my_cached_view']);
數(shù)據(jù)通過(guò)視圖方法的第二個(gè)參數(shù)從控制器傳遞到視圖,這是一個(gè)例子:
$data = [
'title' => 'My title',
'heading' => 'My Heading',
'message' => 'My Message'
];
echo view('blogview', $data);
讓我們打開(kāi)你的控制器文件,并添加一下代碼:
<?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)在打開(kāi)視圖文件,并將文本更改為與數(shù)據(jù)中的數(shù)組鍵對(duì)應(yīng)的變量:
<html>
<head>
<title><?= $title ?></title>
</head>
<body>
<h1><?= $heading ?></h1>
</body>
</html>
現(xiàn)在重新刷新頁(yè)面,你應(yīng)該會(huì)看到變量已經(jīng)替換成數(shù)據(jù)中的值。
默認(rèn)情況下,傳遞的數(shù)據(jù)只在當(dāng)前調(diào)用 view 中可用。如果在一次請(qǐng)求中多次調(diào)用該方法,則必須將所需的數(shù)據(jù)傳遞給每個(gè)視圖。這樣可以防止 數(shù)據(jù)顯示/覆蓋到其他視圖中的數(shù)據(jù)而導(dǎo)致出現(xiàn)問(wèn)題。如果你想保留數(shù)據(jù),則可以將 saveData 選項(xiàng)傳遞到第三個(gè)參數(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ù)庫(kù)中獲取數(shù)據(jù), 一般情況下數(shù)據(jù)都是一個(gè)多維數(shù)組。
這里是個(gè)簡(jiǎn)單的例子,將它添加到你的控制器中:
<?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)在打開(kāi)視圖文件并創(chuàng)建一個(gè)循環(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號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: