一步一步重寫 CodeIgniter 框架 (8) —— 視圖的嵌套輸出與返回

視圖函數在控制器中經過 $this->load-view() 來調用,從而輸出 html,有時候爲了調試或附加處理的須要,咱們須要打印出這些輸出,而不是直接經過瀏覽器輸出,這在 php 中是經過緩衝區來實現的,詳細的函數參考 http://www.php.net/manual/zh/ref.outcontrol.phpphp

因此咱們在 _ci_load 函數中能夠看到html

ob_start();

        include($_ci_path);

        // 若是須要返回數據,則從緩衝區中返回數據
        if ($_ci_return === TRUE) {
            $buffer = ob_get_contents();
            @ob_end_clean();
            return $buffer;
        }

        // 若是是嵌套的視圖中的輸出,則直接 flush, 以便外層視圖能夠獲得 buffer 中的內容,
        // 而最外層的 buffer 則導出到 output 類中進行最後的處理
        if (ob_get_level() > $this->_ci_ob_level + 1) {
            ob_end_flush();
        } else {
            $_ci_CI->output->append_output(ob_get_contents());
            @ob_end_clean();
        }

1)在 include 視圖文件以前,開啓緩衝區 ob_start(),那麼視圖文件的內容就所有輸出到緩衝區,而不是經過瀏覽器輸出瀏覽器

2) 若是調用時參數 _ci_return 爲 True, 則說明這個視圖文件的內容直接返回便可,不須要加入到最終的瀏覽器輸出中,因此調用 ob_get_contents 函數得到返回值,並清理緩衝區 ob_end_clean()app

3)注意 CI 中的 output 類是執行完全部的 view 視圖加載後,對最終內容進行處理的,因此但凡是超出第一層 buffer 的內容,所有加入緩衝區,直到第一層的視圖完畢, 經過 append_output 函數教給 Output 類來處理函數

加入以上代碼後,相比以前,能夠對視圖進行任意層次的嵌套了~測試

 

爲了測試結果,咱們在 test_view 中嵌套另外一個視圖 test_inner_viewthis

<?php

echo 'I am the inner people of zzy, lc & lyq';

而 原先的 test_view 則更改成spa

<html>
<head>
<title>My First View</title>
</head>
<body>
 <h1>Welcome, we finally met by MVC, my name is Zhangzhenyu!</h1>
 <p><?php echo $info ?></p>
 <div style="border: 1px solid #ccc;">
     <?php $this->load->view('test_inner_view') ?>
 </div>
</body>
</html>

訪問 http://localhost/learn-ci/index.php/welcome/hello.net

能夠看到輸出以下 調試

Welcome, we finally met by MVC, my name is Zhangzhenyu!

People you want in our model is Zhangzhenyu

I am the inner people of zzy, lc & lyq
相關文章
相關標籤/搜索