星期三, 5月 09, 2012

[WEB] 我的MVC架構 --CRUD平台

(其實我是抱著被戰的心情來寫這篇的
歡迎大家分享自己用的MVC架構或是推薦我好用的framework)

最近接了些學校的工讀,每次都要重寫一樣的東西讓我覺得非常厭煩
其實大部分的網頁需求都是一個CRUD平台  只是看這四個功能是使用者還是管理者來用而已

以前寫PHP的時候,會用PHP混雜HTML的方式寫

像是:
<?php 
$sql="SELECT * FROM `table`";
$result=mysql_query($sql,$conn); 
$row=mysql_fetch_row($result);
?>
<td>
<input type="input" name="id" value="<?php echo $row[0]; ?">
</input>
</td>
這樣的程式除了維護比較困難之外
如果要寫類似的功能,會因為要改一個小地方就要全部重寫,很不划算

這時候就想到之前學的MVC(Model–View–Controller)
Model: 在這裡可以看成是取得的資料,就是從資料庫query出來的資料
Controller: control在這裡我解釋成用js呼叫底層PHP抓取資料的動作,所以js是controller
View: html的呈現

定義完了,我們看看實作上怎麼做
這邊拿Read當例子:

首先是model的部分(get_table.php)
$sql = "SELECT * FROM `table`";
$result = mysql_query($sql,$conn);
$i=0;
while($row = mysql_fetch_row($result))
{
    $output[$i]["id"] = $row[0];
    $output[$i]["name"] = $row[1];
    $i++;
}
echo json_encode($output);
這樣就會從一個名為"table"的資料表中撈出兩個欄位(id,name)並把他們封裝成JSON格式

再來是view部分,用html畫出一個表格:
<form id="input_form" action="add_table.php" method="POST">
    <table id="input_table" border="1">
        <thead>
            <tr>
                <th>ID</th>
                <th>NAME</th>
            </tr>
        </thead>
        <tbody>
        </tbody>
        <tfoot>
        <tr>
            <td><input type="input" name="id"></input></td>
            <td><input type="input" name="name"></input></td>
            <td><input type="submit" value="新增"></input></td>
        </tr>
        </tfoot>
    </table>
</form>
可以注意到這邊留了一個form,等等的add_table.php會用到

最後是control部分:
function insert_table(items)
{
    $.each(items,function(index,e){
        $('#input_table tbody').append("<tr>" +
          "<td>" + e.id + "</td>" +
          "<td>" + e.name + "</td>" +
          "</tr>"
     );
   });
}
 
$.getJSON('get_table.php', function(data){
insert_table(data);
});
這裡用了jquery,把拿到的資料塞到剛剛的html裡面,完成controller部分

到這裡,就完成了簡單的list介面
也可以由此看看我的MVC架構邏輯
就是以js做controller操控身為model的PHP程式,取得資料後,再塞資料到做為view的html上

這就是我目前用的web MVC架構
歡迎各位大大糾正我這樣子做的缺點
也歡迎大家分享自己使用的架構

2 則留言:

carlcarl 提到...

新增資料的部份,我會考慮用比較無腦的方法,json用來回傳成功或錯誤 成功就用jquery重load table,錯誤就print 錯誤訊息。這樣雖然request會比較多、傳的資料量會比較大,但是如果想要拿來重複利用的話,就不用每次都去修改傳啥資料了,如果再考慮到加上分頁功能的話,這個方法會更省事~~。

羅澤揚 提到...

你的意思是用jquery傳資料而不是用直接用html form嗎?
我有試過這個方法,只是後來覺得用form寫起來比較省事而已