codeigniter和mvc續

 

codeigniter的程序流程

1.      設計視圖

首先,讓我們設計視圖並把它保存到如下路徑:system/application/views/testview.php

 

 

代碼片段1 視圖demo

       

        你還可以聯想到,變量$mytitle$mytext的內容呢?答案是我們需要一個新的控制器!

 

2.      設計控制器

現在,我們需要一個新的控制器。我們將其命名爲Start並保存在:/system/application/controllers/start.php

該控制器必須做幾件事:

·         調用視圖

·         把一些數據傳遞給視圖:它正在期待標題($mytitle)和一些本文($mytext

·         最後,我們想要控制器接受來自使用者的一個參數(例如通過URL請求)

換句話說,我們必須傳遞變量到視圖中。因此讓我們從Start控制器開始。這是一個OO類: 

代碼片段2 控制器構造函數

       在上面的代碼中可以看出Start是一個構造函數,他完成了控制器的初始化。

      下面是將參數傳遞個一個函數的代碼:

 

代碼片段3 控制器url映射函數


    這個函數期待一個參數,$name,可能會產生疑問$name變量從哪來?其實它需要來自URL請求的第三個參數,話句話說換句話說,當你輸入URL

http://www.mysite.com/index.php/start/hello/fred

URL的最後一段作爲一個參數傳給函數hello,倒數第二個參數是指當前的函數名是hello,倒數第三個函數是指當前的控制器名字是start。當然我們還會看到index.php這個參數,這是由於CI將所有的請求都發送到了index.php文件中,你也可以用.htaccess文件重寫URL來去掉index.php,考慮到服務器可能不支持.htaccess,我們沒有做出修改。

    再回到對控制器的討論中,注意hello()函數如何先設置一個名爲$data的數組,並把一些對象的屬性及文本讀入數組。然後它通過名稱裝載視圖,並把剛生成的$data數組作爲第二個參數。在幕後,CI很好地利用了另外一個PHP函數:extract(),這個函數的作用是把數組中的元素取出放入變量表,其中每個鍵值對中的鍵名即爲變量名,對應該鍵名的值爲變量的值。因此我們剛纔定義的$data數組在視圖中轉換成一個單一的變量:$text(等於“Hello, $name, now we're getting dynamic”)。

    換句話說,當它被建立的時候,$data數組看起來像這樣:

    Array

( 

  [mytitle] =>'Welcome to this site',

  [mytext] =>"Hello, fred, now we're getting dynamic!"

);

    但是當它被傳遞給視圖的過程中,它被解開,並且下列變量在視圖對象中生成,與$data的每個鍵/值相對應:    

    $mytitle  =  'Welcome to this site';

     $mytext   =  "Hello, fred, now we're getting dynamic!";

    雖然你只傳送一個變量到視圖中,但是,你能把許多數據裝進那個變量中。$data數組的每個值還可以是數組,這被稱爲多維數組,因此,用一個數組變量可以把大量的變量傳遞給視圖。

 

    3.設計模型

      其實模型的設計要在控制器之前完成的,但是爲了演示控制器和視圖之間的數據流動,我們把控制器和視圖放到一起說了。

      所以說上面介紹的只是VC,因爲還沒介紹到M,也就是模型。

      在第二部分介紹控制器時給數組$data的元素賦值時,我們用到的都是常量,其實在實際的編碼情況中,我們的數據都是從數據庫中讀出的,這份工作就是下面要說到的控制器的職責。先看下面一部分代碼:

     

  <?php
       class Art extends Model {
              public function __construct() {
                     parent::Model();
                     //$this->load->library('database');//在autoload.php中配置了自動加載database類
              }
              public function getList($name) {
                     $this->db->select('title,content');
                     $this->db->where('author', $name);
                     $result=$this->db->get('art');
                     return $result->num_rows()>0 ? $result->result_array() : null;
              }


       }
  ?>
代碼片段4 模型demo

      首先我們看到這也是一個類,繼承自父類Model,首先由__construct函數完成該類的初始化。並加載了CI的數據庫類(也就是我們前面所有的AR)。然後我們看類中的getOne函數,這是要介紹的重點。

      $this->db->select(‘title,content’);

      $this->db->where(author’,$name);

      $result=$this->db->get(‘art’);

這三句話放到普通的php中應該是這麼寫的:

$sql=”select title,content from art where author =’“.$name.”’”;

$result=mysql_query($sql);  

 

可以看出用了AR後數據庫的處理變得簡潔明瞭,並且更重要的是CIAR生成隱含的代碼,在幕後進行轉意和類型轉化,使代碼更加健壯。

      我們在模型中將數據進行處理(查詢、修改、刪除等),然後將處理結果交給控制器處理。控制器在這裏起到了路由的作用,它會將處理的結果交給不同的視圖去處理。

在控制器中我們這麼取出數據:

      

<?php
class Artmanager extends Controller {
	function __construct() {
		parent::Controller();
		$this->load->model('art');
	}

	function index($authName) {
		$list = $this->art->getList($authName);
		$data['list'] = $list;
		$this->load->view('art_list',$data);
	}
}
代碼片段5 控制器中使用模型

 注意以下兩句是整段代碼的重點,這兩句扼要的指出了在控制器中怎樣使用模型。        

    $this->load->model('art');             

    $list = $this->art->getList($authName);

    最後一句使用來加載視圖的:   

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

    使用這一句將$data數組中的數據傳遞到art_list.php(文件存放位置稍後給出)這個文件中。現在看一下art_list.php文件到底怎樣操作來展現這個視圖的內容:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>文章列表</title>
    <meta name="keywords" content="" />
    <meta name="description" content="" />
    <style>
        table.list,table.list td,table.list th{border:1px solid;padding:0;border-collapse:collapse; }
    </style>

</head>

<body>
    <table class="list">
        <tr>
            <th></th><th>標題</th><th>內容</th>
        </tr>

    <?php
        if (is_null($list)) {
    ?>
        <tr><td colspan="3">沒有數據</td></tr>
    <?php
        } else {
            foreach ($list as $index=>$article) {
    ?>
                <tr>
                    <td><?php echo $index+1;?></td>
                    <td><?php echo $article['title']?></td>
                    <td><?php echo $article['content']?></td>
                </tr>
    <?php
            }
        }
    ?>

    </table>
</body>
</html>

代碼片段視圖中解析控制器中的參數 

 注意代碼片段6中的:   

    foreach ($list as $index=>$article)

        這一句,如果你沒有記錯的話,從控制器裏傳遞過來的參數$data是一個數組,但是這裏面的變量$list看上去像是沒有定義過的。恭喜你,猜的沒錯了,CI內部就是調用了extract這個函數將$data數組中的元素拆分到以鍵名爲變量名的變量中去了,所以你在這裏可以直接使用$list這個變量。

       最後看一下成果,在瀏覽器裏直接輸入http://localhost/ci/index.php/artmanager/index/admin 這個地址,會顯示查詢的表格數據:



注:以上內容改變自《codeigniter敏捷開發框架》中的部分內容。另外這篇文章中的代碼是基於ci1.x的語法寫的,將文章在iteye上覆制一份:

http://yunnysunny.iteye.com/blog/1430234,,如果想閱讀或者下載2.x的代碼,也請瀏覽iteye的文章。

發佈了25 篇原創文章 · 獲贊 24 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章