在PHP裏面如果想要使用MVC方式開發應用程式,其中一個選擇就是使用CodeIgniter這個平臺,如果要問我為甚麼不用Zend Framework,其實就是我沒有那麼多的時間同時研究那麼多東西,不過大概看了一下幾乎都差不多,就是平臺提供的工具和語法稍有差異而已,基本上都是一樣的。

我在學習一個新的東西的時候,不喜歡一下子弄太大,先找個小例子測試用這個工具要怎樣達成,把開發模式固定下來之後再實際製作大專案,這樣可以節省不少的時間。

雖然說是已經不少人在用的平臺,不過還是會遭遇到一些問題,最常見的就是想要使用Master Page的問題,雖然平臺提供了模板的方式,不過每次輸出自己都要重新撈所有的子頁面總是很麻煩,如果沒有跳脫出來看一直想用傳統的方法是很難解決的。這個問題其實非常容易解決,就是繼承。

自己寫一個基類繼承與平臺的Controller基類就好了,以後所有頁面都繼承這個基類就行了。

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

/**
 * 所有Controller的基類
 * 1.預先載入相關的library
 * 2.套用指定模板 
 * @author Frank
 */
class TP_Controller extends CI_Controller {
    public function __construct() {
        parent::__construct();
        $this->load->library('tp_pman');
    }

    /**
     * 使用指定的模板頁面套用內容
     * @param string $template 模板view
     * @param string $content  內容頁面的html
     */
    public function render_template($template, $content='')
    {
        $wdata = array();
        $wdata['content'] = $content;
        $wdata['head_html'] = tp_pman::renderHeader();
        $wdata['foot_html'] = tp_pman::renderFooter();
        $wdata['topnav'] = $this->load->view('templates/topnav','',TRUE);
        $this->load->view($template,$wdata);
    }
    
}

這是我正在用的基類,可以看到我使用了extends的方法繼承了CI_Controller這個基類,在基類的創建函數裏面載入了我常用的類庫。這個基類提供了一個方法,render_template就是用來套模板的,傳入的參數第一個就是模板,也就是在CodeIgniter裏面的View,第二個參數就是內容頁面的html程式碼字串。

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

require_once 'TP_Controller.php';
class Vender extends TP_Controller {

    public function __construct() {
        parent::__construct();
        $this->load->model('vender_model', 'mdl_vend');
    }

    public function gridview($pageno=0)
    {
        $pagesize = 10;
        $start = $pageno * $pagesize;
        $data['rst'] = $this->mdl_vend->get_gridlist($start,$pagesize);
        $content = $this->load->view('vender/gridview', $data, true);
        $this->render_template('templates/public',$content);
    }

}

而真正工作的Controller就是繼承前面寫的那個類,因為不會自動載入所以要自己使用require_once來將基類檔案載入。同樣的利用創建函數載入一些你需要的東西,尤其是Model,因為通常在一個Controller裏面都是針對特定的幾個Model工作的,所以把這些共同的東西全部在這裡做掉,然後頁面處理函數就變得很簡單了,只要做真正內容的部份,最後再呼叫基類的render_template方法就好了。

使用這樣的方法不但省事,而且連平臺的模板都用不到,模板多半都是造成系統效能低下的主要原因。

創作者介紹

人生四十宅開始 二號宅

漠哥 發表在 痞客邦 PIXNET 留言(0) 人氣()