視圖 Views

視圖(View)只是簡單的網站頁面,或者片段頁面,像是 header, footer,sidebar,等等。事實上,Views 可以很彈性的嵌入到其它 Views(包含其它 views 等等)如果你需要這樣的層次結構。

視圖(Views)無法直接呼叫,他們一定要通過 控制器 Controller 來呼叫。 記得在 MVC framework 時, Controllers 像是交通警察一樣工作,所以他負責去抓取指定的視圖(View)。如果你還沒看過控制器(Controllers)頁面,你應該要先看過唷。

使用範例 控制器 Controller 你會建立一個 Controller 頁面,讓你增加 View 到裡面。

建立一個 View

用你的文字編輯器,建立一個檔案叫做 blogview.php ,然後把下面程式碼放進來:

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

然後儲存檔案到 application/views/ 目錄。

載入 View

為了載入指定的 View 你可以跟隨下面操作放到 Controller 裡的方法裡:

$this->load->view('name');

它的名字就是你 View 檔案的名字。

Note

後綴 .php 是不需要的唷,除非你有其它或連續的 .php 。

現在,打開你的 Controller 目錄,你新增一個簡單的名稱叫做 Blog.php,用頁面讀取方法取道掉 echo 語句:

<?php
class Blog extends CI_Controller {

        public function index()
        {
                $this->load->view('blogview');
        }
}

你通過 URL 來拜訪你的網站,你將會看到你的頁面。這個 URL 大概長這樣:

example.com/index.php/blog/

載入多個 Views

CodeIgniter 將會聰明地處理多個呼叫 $this->load->view() 從 Controller 裡面。如果呼叫超過一個,那麼它們會被連續附加在一起。例如,你可能有 header view,menu view,content view,以及 footer view。然後像這樣:

<?php

class Page extends CI_Controller {

        public function index()
        {
                $data['page_title'] = 'Your title';
                $this->load->view('header');
                $this->load->view('menu');
                $this->load->view('content', $data);
                $this->load->view('footer');
        }

}

從上述例子來看,我們運用了 “動態附加資料” ,您將會在下面看到。

儲存 Views 到子目錄

你的 View 檔案可以被儲存到子目錄內,如果你喜歡分類組織了話。如果你這樣做你將需要去引入子目錄名稱來讀取 View。 例如:

$this->load->view('directory_name/file_name');

增加動態資料到 View

資料是使用 陣列物件 從 Controller 傳送到 View 裡面,透過 View 讀取的方法傳入第二個參數內。這裡是運用陣列的方法:

$data = array(
        'title' => 'My Title',
        'heading' => 'My Heading',
        'message' => 'My Message'
);

$this->load->view('blogview', $data);

然後這裡是運用物件的方法傳入:

$data = new Someclass();
$this->load->view('blogview', $data);

Note

如果你是用物件,類別變數將會被轉成陣列元素。

讓我們試試看 增加到你的 Controller 檔案裡。 新增以下程式碼:

<?php
class Blog extends CI_Controller {

        public function index()
        {
                $data['title'] = "My Real Title";
                $data['heading'] = "My Real Heading";

                $this->load->view('blogview', $data);
        }
}

現在打開你的 View 檔案然後改變字串替換成陣列的鍵值:

<html>
<head>
        <title><?php echo $title;?></title>
</head>
<body>
        <h1><?php echo $heading;?></h1>
</body>
</html>

然後通過 URL 來讀取頁面, 你已經使用變數代替原本的字串了。

建立迴圈

傳遞給你的 View 文件中的資料陣列並不局限於簡單的變量。你可以通過多維陣列,可以循環產生多個欄位資料。例如,如果你從資料庫中撈取資料,這時它通常是在一個多維陣列的形式。

這裡有一個簡單的例子。添加到您的 Controller:

<?php
class Blog extends CI_Controller {

        public function index()
        {
                $data['todo_list'] = array('Clean House', 'Call Mom', 'Run Errands');

                $data['title'] = "My Real Title";
                $data['heading'] = "My Real Heading";

                $this->load->view('blogview', $data);
        }
}

現在打開你的 View 文件,建立一個迴圈:

<html>
<head>
        <title><?php echo $title;?></title>
</head>
<body>
        <h1><?php echo $heading;?></h1>

        <h3>My Todo List</h3>

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

                <li><?php echo $item;?></li>

        <?php endforeach;?>
        </ul>

</body>
</html>

Note

你會注意到,在上面我們使用 PHP 的替代語法的例子。如果你不熟悉它,你可以閱讀一下 這裡

資料回傳到 views

這裡是第三個 可選的 參數,它返回讀取那個頁面的整個 HTML,而不是將其發送到瀏覽器。如果你在處理資料的狀況下,這個方法是很有用的。如果你設定成 TRUE(boolean)它就會回傳資料。預設是 false,那麼他就會將 View 發送到瀏覽器了。 如果你要有資料回傳,記得塞入這個變數:

$string = $this->load->view('myfile', '', TRUE);