視圖函數在控制器中經過 $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
能夠看到輸出以下 調試
People you want in our model is Zhangzhenyu